diff --git a/src/Pass.cpp b/src/Pass.cpp index 4491b8d..d6087fe 100644 --- a/src/Pass.cpp +++ b/src/Pass.cpp @@ -46,6 +46,10 @@ void PassManager::runOptimizationPipeline(Module* moduleIR, IRBuilder* builderIR registerOptimizationPass(builderIR); registerOptimizationPass(builderIR); + registerOptimizationPass(); + registerOptimizationPass(builderIR); + registerOptimizationPass(builderIR); + if (optLevel >= 1) { //经过设计安排优化遍的执行顺序以及执行逻辑 if (DEBUG) std::cout << "Applying -O1 optimizations.\n"; @@ -60,18 +64,38 @@ void PassManager::runOptimizationPipeline(Module* moduleIR, IRBuilder* builderIR this->addPass(&SysYAddReturnPass::ID); this->run(); + if(DEBUG) { + std::cout << "=== IR After CFGOpt Optimizations ===\n"; + printPasses(); + } + this->clearPasses(); this->addPass(&DCE::ID); this->run(); + if(DEBUG) { + std::cout << "=== IR After DCE Optimizations ===\n"; + printPasses(); + } + this->clearPasses(); this->addPass(&Mem2Reg::ID); this->run(); + if(DEBUG) { + std::cout << "=== IR After Mem2Reg Optimizations ===\n"; + printPasses(); + } + this->clearPasses(); this->addPass(&Reg2Mem::ID); this->run(); + if(DEBUG) { + std::cout << "=== IR After Reg2Mem Optimizations ===\n"; + printPasses(); + } + if (DEBUG) std::cout << "--- Custom optimization sequence finished ---\n"; } @@ -162,6 +186,20 @@ bool PassManager::run() { } +void PassManager::printPasses() const { + std::cout << "Registered Passes:\n"; + for (const auto &p : passes) { + std::cout << " - " << p->getName() << " (Granularity: " + << static_cast(p->getGranularity()) + << ", Kind: " << static_cast(p->getPassKind()) << ")\n"; + } + std::cout << "Total Passes: " << passes.size() << "\n"; + if (pmodule) { + SysYPrinter printer(pmodule); + std::cout << "Module IR:\n"; + printer.printIR(); + } +} template void registerAnalysisPass() { PassRegistry::getPassRegistry().registerPass(&AnalysisPassType::ID, diff --git a/src/include/Pass.h b/src/include/Pass.h index d387e9e..ab71b50 100644 --- a/src/include/Pass.h +++ b/src/include/Pass.h @@ -292,6 +292,9 @@ public: AnalysisManager &getAnalysisManager() { return analysisManager; } void clearPasses(); + + // 输出pass列表并打印IR信息供观察优化遍效果 + void printPasses() const; }; // ====================================================================== diff --git a/src/include/Reg2Mem.h b/src/include/Reg2Mem.h index 5bd3b26..84f5535 100644 --- a/src/include/Reg2Mem.h +++ b/src/include/Reg2Mem.h @@ -50,7 +50,7 @@ private: IRBuilder *builder; ///< IR构建器,用于插入指令 public: static void *ID; ///< Pass的唯一标识符 - Reg2Mem() : OptimizationPass("Reg2Mem", Pass::Granularity::Function), builder(builder) {} + Reg2Mem(IRBuilder* builder) : OptimizationPass("Reg2Mem", Pass::Granularity::Function), builder(builder) {} bool runOnFunction(Function *F, AnalysisManager &AM) override; void getAnalysisUsage(std::set &analysisDependencies, std::set &analysisInvalidations) const override; void *getPassID() const override { return &ID; } ///< 获取 Pass ID