From 2556ab7315691492f70ae509f0aba0a39f041e64 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Thu, 24 Jul 2025 15:04:29 +0800 Subject: [PATCH] =?UTF-8?q?[midend]=E4=BF=AE=E5=A4=8Dgetanalysisusagee?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E5=AE=9A=E4=B9=89=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=88=9D=E5=A7=8B=E5=8C=96=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SysYIRGenerator.cpp | 38 ++++++++++++++++++++++++-------------- src/include/SysYIRCFGOpt.h | 10 +++++----- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/SysYIRGenerator.cpp b/src/SysYIRGenerator.cpp index 50c24ea..ba25144 100644 --- a/src/SysYIRGenerator.cpp +++ b/src/SysYIRGenerator.cpp @@ -205,7 +205,7 @@ std::any SysYIRGenerator::visitVarDecl(SysYParser::VarDeclContext *ctx) { builder.createStoreInst(values.getValue(0), alloca); } else { // 数组变量初始化 const std::vector &counterValues = values.getValues(); - + const std::vector &counterNumbers = values.getNumbers(); int numElements = 1; std::vector dimSizes; for (Value *dimVal : dims) { @@ -247,23 +247,33 @@ std::any SysYIRGenerator::visitVarDecl(SysYParser::VarDeclContext *ctx) { ConstantInteger::get(0)); } else { + + int linearIndexOffset = 0; // 用于追踪当前处理的线性索引的偏移量 for (int k = 0; k < counterValues.size(); ++k) { - std::vector currentIndices; - int tempLinearIndex = k; + // 当前 Value 的值和重复次数 + Value* currentValue = counterValues[k]; + unsigned currentRepeatNum = counterNumbers[k]; - // 将线性索引转换为多维索引 - for (int dimIdx = dimSizes.size() - 1; dimIdx >= 0; --dimIdx) - { - currentIndices.insert(currentIndices.begin(), - ConstantInteger::get(static_cast(tempLinearIndex % dimSizes[dimIdx]))); - tempLinearIndex /= dimSizes[dimIdx]; - } + for (unsigned i = 0; i < currentRepeatNum; ++i) { + std::vector currentIndices; + int tempLinearIndex = linearIndexOffset + i; // 使用偏移量和当前重复次数内的索引 - // 计算元素的地址 - Value* elementAddress = getGEPAddressInst(alloca, currentIndices); - // 生成 store 指令 (假设 createStoreInst 接受 Value* value, Value* pointer) - builder.createStoreInst(counterValues[k], elementAddress); + // 将线性索引转换为多维索引 + for (int dimIdx = dimSizes.size() - 1; dimIdx >= 0; --dimIdx) { + currentIndices.insert(currentIndices.begin(), + ConstantInteger::get(static_cast(tempLinearIndex % dimSizes[dimIdx]))); + tempLinearIndex /= dimSizes[dimIdx]; + } + + // 计算元素的地址 + Value* elementAddress = getGEPAddressInst(alloca, currentIndices); + // 生成 store 指令 + builder.createStoreInst(currentValue, elementAddress); + } + // 更新线性索引偏移量,以便下一次迭代从正确的位置开始 + linearIndexOffset += currentRepeatNum; } + } } } diff --git a/src/include/SysYIRCFGOpt.h b/src/include/SysYIRCFGOpt.h index f388138..a7ba08b 100644 --- a/src/include/SysYIRCFGOpt.h +++ b/src/include/SysYIRCFGOpt.h @@ -54,7 +54,7 @@ public: static void *ID; SysYDelEmptyBlockPass(IRBuilder *builder) : OptimizationPass("SysYDelEmptyBlockPass", Granularity::Function), pBuilder(builder) {} bool runOnFunction(Function *F, AnalysisManager& AM) override; - void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override; + void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override {}; void *getPassID() const override { return &ID; } }; @@ -63,7 +63,7 @@ public: static void *ID; SysYDelNoPreBLockPass() : OptimizationPass("SysYDelNoPreBLockPass", Granularity::Function) {} bool runOnFunction(Function *F, AnalysisManager& AM) override; - void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override; + void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override {}; void *getPassID() const override { return &ID; } }; @@ -72,7 +72,7 @@ public: static void *ID; SysYBlockMergePass() : OptimizationPass("SysYBlockMergePass", Granularity::Function) {} bool runOnFunction(Function *F, AnalysisManager& AM) override; - void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override; + void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override {}; void *getPassID() const override { return &ID; } }; @@ -83,7 +83,7 @@ public: static void *ID; SysYAddReturnPass(IRBuilder *builder) : OptimizationPass("SysYAddReturnPass", Granularity::Function), pBuilder(builder) {} bool runOnFunction(Function *F, AnalysisManager& AM) override; - void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override; + void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override {}; void *getPassID() const override { return &ID; } }; @@ -94,7 +94,7 @@ public: static void *ID; SysYCondBr2BrPass(IRBuilder *builder) : OptimizationPass("SysYCondBr2BrPass", Granularity::Function), pBuilder(builder) {} bool runOnFunction(Function *F, AnalysisManager& AM) override; - void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override; + void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override {}; void *getPassID() const override { return &ID; } };