[midend]修复getanalysisusagee缺失定义,修复数组初始化错误
This commit is contained in:
@ -205,7 +205,7 @@ std::any SysYIRGenerator::visitVarDecl(SysYParser::VarDeclContext *ctx) {
|
|||||||
builder.createStoreInst(values.getValue(0), alloca);
|
builder.createStoreInst(values.getValue(0), alloca);
|
||||||
} else { // 数组变量初始化
|
} else { // 数组变量初始化
|
||||||
const std::vector<sysy::Value *> &counterValues = values.getValues();
|
const std::vector<sysy::Value *> &counterValues = values.getValues();
|
||||||
|
const std::vector<unsigned> &counterNumbers = values.getNumbers();
|
||||||
int numElements = 1;
|
int numElements = 1;
|
||||||
std::vector<int> dimSizes;
|
std::vector<int> dimSizes;
|
||||||
for (Value *dimVal : dims) {
|
for (Value *dimVal : dims) {
|
||||||
@ -247,23 +247,33 @@ std::any SysYIRGenerator::visitVarDecl(SysYParser::VarDeclContext *ctx) {
|
|||||||
ConstantInteger::get(0));
|
ConstantInteger::get(0));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
|
int linearIndexOffset = 0; // 用于追踪当前处理的线性索引的偏移量
|
||||||
for (int k = 0; k < counterValues.size(); ++k) {
|
for (int k = 0; k < counterValues.size(); ++k) {
|
||||||
std::vector<Value *> currentIndices;
|
// 当前 Value 的值和重复次数
|
||||||
int tempLinearIndex = k;
|
Value* currentValue = counterValues[k];
|
||||||
|
unsigned currentRepeatNum = counterNumbers[k];
|
||||||
|
|
||||||
// 将线性索引转换为多维索引
|
for (unsigned i = 0; i < currentRepeatNum; ++i) {
|
||||||
for (int dimIdx = dimSizes.size() - 1; dimIdx >= 0; --dimIdx)
|
std::vector<Value *> currentIndices;
|
||||||
{
|
int tempLinearIndex = linearIndexOffset + i; // 使用偏移量和当前重复次数内的索引
|
||||||
currentIndices.insert(currentIndices.begin(),
|
|
||||||
ConstantInteger::get(static_cast<int>(tempLinearIndex % dimSizes[dimIdx])));
|
|
||||||
tempLinearIndex /= dimSizes[dimIdx];
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算元素的地址
|
// 将线性索引转换为多维索引
|
||||||
Value* elementAddress = getGEPAddressInst(alloca, currentIndices);
|
for (int dimIdx = dimSizes.size() - 1; dimIdx >= 0; --dimIdx) {
|
||||||
// 生成 store 指令 (假设 createStoreInst 接受 Value* value, Value* pointer)
|
currentIndices.insert(currentIndices.begin(),
|
||||||
builder.createStoreInst(counterValues[k], elementAddress);
|
ConstantInteger::get(static_cast<int>(tempLinearIndex % dimSizes[dimIdx])));
|
||||||
|
tempLinearIndex /= dimSizes[dimIdx];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算元素的地址
|
||||||
|
Value* elementAddress = getGEPAddressInst(alloca, currentIndices);
|
||||||
|
// 生成 store 指令
|
||||||
|
builder.createStoreInst(currentValue, elementAddress);
|
||||||
|
}
|
||||||
|
// 更新线性索引偏移量,以便下一次迭代从正确的位置开始
|
||||||
|
linearIndexOffset += currentRepeatNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,7 +54,7 @@ public:
|
|||||||
static void *ID;
|
static void *ID;
|
||||||
SysYDelEmptyBlockPass(IRBuilder *builder) : OptimizationPass("SysYDelEmptyBlockPass", Granularity::Function), pBuilder(builder) {}
|
SysYDelEmptyBlockPass(IRBuilder *builder) : OptimizationPass("SysYDelEmptyBlockPass", Granularity::Function), pBuilder(builder) {}
|
||||||
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
||||||
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
|
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override {};
|
||||||
void *getPassID() const override { return &ID; }
|
void *getPassID() const override { return &ID; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ public:
|
|||||||
static void *ID;
|
static void *ID;
|
||||||
SysYDelNoPreBLockPass() : OptimizationPass("SysYDelNoPreBLockPass", Granularity::Function) {}
|
SysYDelNoPreBLockPass() : OptimizationPass("SysYDelNoPreBLockPass", Granularity::Function) {}
|
||||||
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
||||||
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
|
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override {};
|
||||||
void *getPassID() const override { return &ID; }
|
void *getPassID() const override { return &ID; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ public:
|
|||||||
static void *ID;
|
static void *ID;
|
||||||
SysYBlockMergePass() : OptimizationPass("SysYBlockMergePass", Granularity::Function) {}
|
SysYBlockMergePass() : OptimizationPass("SysYBlockMergePass", Granularity::Function) {}
|
||||||
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
||||||
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
|
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override {};
|
||||||
void *getPassID() const override { return &ID; }
|
void *getPassID() const override { return &ID; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ public:
|
|||||||
static void *ID;
|
static void *ID;
|
||||||
SysYAddReturnPass(IRBuilder *builder) : OptimizationPass("SysYAddReturnPass", Granularity::Function), pBuilder(builder) {}
|
SysYAddReturnPass(IRBuilder *builder) : OptimizationPass("SysYAddReturnPass", Granularity::Function), pBuilder(builder) {}
|
||||||
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
||||||
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
|
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override {};
|
||||||
void *getPassID() const override { return &ID; }
|
void *getPassID() const override { return &ID; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ public:
|
|||||||
static void *ID;
|
static void *ID;
|
||||||
SysYCondBr2BrPass(IRBuilder *builder) : OptimizationPass("SysYCondBr2BrPass", Granularity::Function), pBuilder(builder) {}
|
SysYCondBr2BrPass(IRBuilder *builder) : OptimizationPass("SysYCondBr2BrPass", Granularity::Function), pBuilder(builder) {}
|
||||||
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
bool runOnFunction(Function *F, AnalysisManager& AM) override;
|
||||||
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override;
|
void getAnalysisUsage(std::set<void *> &analysisDependencies, std::set<void *> &analysisInvalidations) const override {};
|
||||||
void *getPassID() const override { return &ID; }
|
void *getPassID() const override { return &ID; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user