[midend]修复getanalysisusagee缺失定义,修复数组初始化错误

This commit is contained in:
rain2133
2025-07-24 15:04:29 +08:00
parent 4b9d067c12
commit 2556ab7315
2 changed files with 29 additions and 19 deletions

View File

@ -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;
} }
} }
} }
} }

View File

@ -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; }
}; };