#include "Dom.h" #include "Liveness.h" #include "SysYIRCFGOpt.h" #include "SysYIRPrinter.h" #include "DCE.h" #include "Pass.h" #include #include #include #include #include #include extern int DEBUG; // 全局调试标志 namespace sysy { // ====================================================================== // 封装优化流程的函数:包含Pass注册和迭代运行逻辑 // ====================================================================== void PassManager::runOptimizationPipeline(Module* moduleIR, IRBuilder* builderIR, int optLevel) { if (DEBUG) std::cout << "--- Starting Middle-End Optimizations (Level -O" << optLevel << ") ---\n"; /* 中端开发框架基本流程: 1) 分析pass 1. 实现分析pass并引入Pass.cpp 2. 注册分析pass 2) 优化pass 1. 实现优化pass并引入Pass.cpp 2. 注册优化pass 3. 添加优化passid */ // 注册分析遍 registerAnalysisPass(); registerAnalysisPass(); // 注册优化遍 registerOptimizationPass(); registerOptimizationPass(); registerOptimizationPass(); registerOptimizationPass(builderIR); registerOptimizationPass(builderIR); registerOptimizationPass(builderIR); if (optLevel >= 1) { //经过设计安排优化遍的执行顺序以及执行逻辑 if (DEBUG) std::cout << "Applying -O1 optimizations.\n"; if (DEBUG) std::cout << "--- Running custom optimization sequence ---\n"; this->clearPasses(); this->addPass(&SysYDelInstAfterBrPass::ID); this->addPass(&SysYDelNoPreBLockPass::ID); this->addPass(&SysYBlockMergePass::ID); this->addPass(&SysYDelEmptyBlockPass::ID); this->addPass(&SysYCondBr2BrPass::ID); this->addPass(&SysYAddReturnPass::ID); this->run(); this->clearPasses(); this->addPass(&DCE::ID); this->run(); if (DEBUG) std::cout << "--- Custom optimization sequence finished ---\n"; } // 2. 创建遍管理器 // 3. 根据优化级别添加不同的优化遍 // TODO : 根据 optLevel 添加不同的优化遍 // 讨论 是不动点迭代进行优化遍还是手动客制化优化遍的顺序? if (DEBUG) { std::cout << "=== Final IR After Middle-End Optimizations (Level -O" << optLevel << ") ===\n"; SysYPrinter printer(moduleIR); printer.printIR(); } } void PassManager::clearPasses() { passes.clear(); } void PassManager::addPass(void *passID) { PassRegistry ®istry = PassRegistry::getPassRegistry(); std::unique_ptr P = registry.createPass(passID); if (!P) { // Error: Pass not found or failed to create return; } passes.push_back(std::move(P)); } // 运行所有注册的遍 bool PassManager::run() { bool changed = false; for (const auto &p : passes) { bool passChanged = false; // 记录当前遍是否修改了 IR // 处理优化遍的分析依赖和失效 if (p->getPassKind() == Pass::PassKind::Optimization) { OptimizationPass *optPass = static_cast(p.get()); std::set analysisDependencies; std::set analysisInvalidations; optPass->getAnalysisUsage(analysisDependencies, analysisInvalidations); // PassManager 不显式运行分析依赖。 // 而是优化遍在 runOnFunction 内部通过 AnalysisManager.getAnalysisResult 按需请求。 } if (p->getGranularity() == Pass::Granularity::Module) { passChanged = p->runOnModule(pmodule, analysisManager); } else if (p->getGranularity() == Pass::Granularity::Function) { for (auto &funcPair : pmodule->getFunctions()) { Function *F = funcPair.second.get(); passChanged = p->runOnFunction(F, analysisManager) || passChanged; if (passChanged && p->getPassKind() == Pass::PassKind::Optimization) { OptimizationPass *optPass = static_cast(p.get()); std::set analysisDependencies; std::set analysisInvalidations; optPass->getAnalysisUsage(analysisDependencies, analysisInvalidations); for (void *invalidationID : analysisInvalidations) { analysisManager.invalidateAnalysis(invalidationID, F); } } } } else if (p->getGranularity() == Pass::Granularity::BasicBlock) { for (auto &funcPair : pmodule->getFunctions()) { Function *F = funcPair.second.get(); for (auto &bbPtr : funcPair.second->getBasicBlocks()) { passChanged = p->runOnBasicBlock(bbPtr.get(), analysisManager) || passChanged; if (passChanged && p->getPassKind() == Pass::PassKind::Optimization) { OptimizationPass *optPass = static_cast(p.get()); std::set analysisDependencies; std::set analysisInvalidations; optPass->getAnalysisUsage(analysisDependencies, analysisInvalidations); for (void *invalidationID : analysisInvalidations) { analysisManager.invalidateAnalysis(invalidationID, F); } } } } } changed = changed || passChanged; } return changed; } template void registerAnalysisPass() { PassRegistry::getPassRegistry().registerPass(&AnalysisPassType::ID, []() { return std::make_unique(); }); } template ::value, int>::type> void registerOptimizationPass(IRBuilder* builder) { PassRegistry::getPassRegistry().registerPass(&OptimizationPassType::ID, [builder]() { return std::make_unique(builder); }); } template ::value, int>::type> void registerOptimizationPass() { PassRegistry::getPassRegistry().registerPass(&OptimizationPassType::ID, []() { return std::make_unique(); }); } } // namespace sysy