diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a052e5b..d82e1e3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,7 +22,9 @@ add_executable(sysyc SysYIRGenerator.cpp SysYIRPrinter.cpp SysYIRCFGOpt.cpp - # SysYIRAnalyser.cpp + Pass.cpp + Dom.cpp + Liveness.cpp # DeadCodeElimination.cpp AddressCalculationExpansion.cpp # Mem2Reg.cpp diff --git a/src/Dom.cpp b/src/Dom.cpp index beb1d65..e82dc7d 100644 --- a/src/Dom.cpp +++ b/src/Dom.cpp @@ -165,7 +165,7 @@ void DominatorTree::computeDominanceFrontiers(Function *F) { // ============================================================== -bool DominatorTreeAnalysisPass::runOnFunction(Function* F) { +bool DominatorTreeAnalysisPass::runOnFunction(Function* F, AnalysisManager &AM) { CurrentDominatorTree = std::make_unique(F); CurrentDominatorTree->computeDominators(F); CurrentDominatorTree->computeIDoms(F); diff --git a/src/Liveness.cpp b/src/Liveness.cpp index e1231f1..2fc5142 100644 --- a/src/Liveness.cpp +++ b/src/Liveness.cpp @@ -89,12 +89,19 @@ void LivenessAnalysisResult::computeLiveness(Function *F) { // TODO : 目前为逆序遍历基本块,考虑反向拓扑序遍历基本块 // 逆序遍历基本块 - std::list> basicBlocks(F->getBasicBlocks().begin(), F->getBasicBlocks().end()); - std::reverse(basicBlocks.begin(), basicBlocks.end()); + // std::list> basicBlocks(F->getBasicBlocks().begin(), F->getBasicBlocks().end()); + // std::reverse(basicBlocks.begin(), basicBlocks.end()); // 然后遍历 basicBlocks + // 创建一个 BasicBlock* 的列表来存储指针,避免拷贝 unique_ptr + // Option 1: Using std::vector (preferred for performance with reverse) + std::vector basicBlocksPointers; + for (const auto& bb_ptr : F->getBasicBlocks()) { + basicBlocksPointers.push_back(bb_ptr.get()); + } + std::reverse(basicBlocksPointers.begin(), basicBlocksPointers.end()); - for (auto bb_iter = basicBlocks.begin(); bb_iter != basicBlocks.end(); ++bb_iter) { - BasicBlock *bb = bb_iter->get(); + for (auto bb_iter = basicBlocksPointers.begin(); bb_iter != basicBlocksPointers.end(); ++bb_iter) { + BasicBlock *bb = *bb_iter; // 获取 BasicBlock 指针 if (!bb) continue; // 避免空指针 diff --git a/src/Pass.cpp b/src/Pass.cpp index c9ec38d..87e541b 100644 --- a/src/Pass.cpp +++ b/src/Pass.cpp @@ -11,9 +11,8 @@ #include "Dom.h" #include "Liveness.h" -namespace sysy { - extern int DEBUG; // 全局调试标志 +namespace sysy { // ====================================================================== // 封装优化流程的函数:包含Pass注册和迭代运行逻辑 @@ -32,6 +31,8 @@ void PassManager::runOptimizationPipeline(Module* moduleIR, int optLevel) { sysy::PassManager pm(moduleIR); // 3. 根据优化级别添加不同的优化遍 + // TODO : 根据 optLevel 添加不同的优化遍 + // 讨论 是不动点迭代进行优化遍还是手动客制化优化遍的顺序? if (optLevel >= 1) { if (DEBUG) std::cout << "Applying -O1 optimizations.\n"; diff --git a/src/include/Liveness.h b/src/include/Liveness.h index 713053a..7cfe01c 100644 --- a/src/include/Liveness.h +++ b/src/include/Liveness.h @@ -19,8 +19,7 @@ class Instruction; // 它将包含 LiveIn 和 LiveOut 集合 class LivenessAnalysisResult : public AnalysisResultBase { public: - LivenessAnalysisResult(Function *F); // 构造函数,需要一个函数来关联结果 - LivenessAnalysisResult::LivenessAnalysisResult(Function *F) : AssociatedFunction(F) {} + LivenessAnalysisResult(Function *F) : AssociatedFunction(F) {} // 获取给定基本块的 LiveIn 集合 const std::set *getLiveIn(BasicBlock *BB) const; diff --git a/src/include/Pass.h b/src/include/Pass.h index 17a61b8..61839fa 100644 --- a/src/include/Pass.h +++ b/src/include/Pass.h @@ -7,9 +7,14 @@ #include #include // For std::type_index (although void* ID is more common in LLVM) #include +#include "IR.h" namespace sysy { +//前向声明 +class PassManager; +class AnalysisManager; + // 抽象基类:分析结果 class AnalysisResultBase { public: @@ -144,7 +149,7 @@ public: // 确保分析遍的粒度与请求的上下文匹配 if (analysisPass->getGranularity() == Pass::Granularity::Function) { - analysisPass->runOnFunction(F); // 运行分析遍 + analysisPass->runOnFunction(F, *this); // 运行分析遍 // 获取结果并缓存 std::unique_ptr result = analysisPass->getResult(); T *specificResult = static_cast(result.get()); @@ -166,13 +171,14 @@ public: cachedResults.erase({F, analysisID}); } else { // 使所有函数的特定分析结果失效 - std::map, std::unique_ptr> newCachedResults; - for (auto &pair : cachedResults) { - if (pair.first.second != analysisID) { - newCachedResults.insert(std::move(pair)); + // 遍历并删除匹配的元素,避免拷贝 unique_ptr + for (auto it = cachedResults.begin(); it != cachedResults.end(); ) { + if (it->first.second == analysisID) { + it = cachedResults.erase(it); // erase 返回下一个元素的迭代器 + } else { + ++it; } } - cachedResults = std::move(newCachedResults); } } }; @@ -190,9 +196,7 @@ public: PassManager() = default; ~PassManager() = default; - PassManager(Module *module) : pmodule(module) { - analysisManager = AnalysisManager(); // 初始化分析管理器 - } + PassManager(Module *module) : pmodule(module) , analysisManager() {} // 运行所有注册的遍 bool run();