From 00348c1931178bc88fbefdfb8bfc0c3e14247b95 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Wed, 16 Jul 2025 21:54:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9CFG=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=E5=90=8D=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?phidel=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/CMakeLists.txt | 2 +- src/Reg2Mem.cpp | 2 +- src/{SysYIROptPre.cpp => SysYIRCFGOpt.cpp} | 12 ++++++------ src/include/{SysYIROptPre.h => SysYIRCFGOpt.h} | 10 ++++++---- src/sysyc.cpp | 6 +++--- 5 files changed, 17 insertions(+), 15 deletions(-) rename src/{SysYIROptPre.cpp => SysYIRCFGOpt.cpp} (98%) rename src/include/{SysYIROptPre.h => SysYIRCFGOpt.h} (84%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c89b3b0..f29dec4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,7 +21,7 @@ add_executable(sysyc IR.cpp SysYIRGenerator.cpp SysYIRPrinter.cpp - SysYIROptPre.cpp + SysYIRCFGOpt.cpp SysYIRAnalyser.cpp DeadCodeElimination.cpp Mem2Reg.cpp diff --git a/src/Reg2Mem.cpp b/src/Reg2Mem.cpp index 70bdd14..d90812a 100644 --- a/src/Reg2Mem.cpp +++ b/src/Reg2Mem.cpp @@ -38,7 +38,7 @@ void Reg2Mem::DeletePhiInst(){ // 创建一个basicblock auto newbasicBlock = function.second->addBasicBlock(); std::stringstream ss; - ss << " phidel.L" << pBuilder->getLabelIndex(); + ss << "phidel.L" << pBuilder->getLabelIndex(); newbasicBlock->setName(ss.str()); ss.str(""); // // 修改前驱后继关系 diff --git a/src/SysYIROptPre.cpp b/src/SysYIRCFGOpt.cpp similarity index 98% rename from src/SysYIROptPre.cpp rename to src/SysYIRCFGOpt.cpp index 9eb495c..e141b67 100644 --- a/src/SysYIROptPre.cpp +++ b/src/SysYIRCFGOpt.cpp @@ -1,4 +1,4 @@ -#include "SysYIROptPre.h" +#include "SysYIRCFGOpt.h" #include "SysYIROptUtils.h" #include #include @@ -13,7 +13,7 @@ namespace sysy { // 删除br后的无用指令 -void SysYOptPre::SysYDelInstAfterBr() { +void SysYCFGOpt::SysYDelInstAfterBr() { auto &functions = pModule->getFunctions(); for (auto &function : functions) { auto basicBlocks = function.second->getBasicBlocks(); @@ -59,7 +59,7 @@ void SysYOptPre::SysYDelInstAfterBr() { } // 合并空基本块 -void SysYOptPre::SysYBlockMerge() { +void SysYCFGOpt::SysYBlockMerge() { auto &functions = pModule->getFunctions(); //std::map> for (auto &function : functions) { // auto basicBlocks = function.second->getBasicBlocks(); @@ -129,7 +129,7 @@ void SysYOptPre::SysYBlockMerge() { } // 删除无前驱块,兼容SSA后的处理 -void SysYOptPre::SysYDelNoPreBLock() { +void SysYCFGOpt::SysYDelNoPreBLock() { auto &functions = pModule->getFunctions(); // std::map> for (auto &function : functions) { @@ -190,7 +190,7 @@ void SysYOptPre::SysYDelNoPreBLock() { } } -void SysYOptPre::SysYDelEmptyBlock() { +void SysYCFGOpt::SysYDelEmptyBlock() { auto &functions = pModule->getFunctions(); for (auto &function : functions) { // 收集不可达基本块 @@ -438,7 +438,7 @@ void SysYOptPre::SysYDelEmptyBlock() { } // 如果函数没有返回指令,则添加一个默认返回指令(主要解决void函数没有返回指令的问题) -void SysYOptPre::SysYAddReturn() { +void SysYCFGOpt::SysYAddReturn() { auto &functions = pModule->getFunctions(); for (auto &function : functions) { auto &func = function.second; diff --git a/src/include/SysYIROptPre.h b/src/include/SysYIRCFGOpt.h similarity index 84% rename from src/include/SysYIROptPre.h rename to src/include/SysYIRCFGOpt.h index 5cb0b34..9c791aa 100644 --- a/src/include/SysYIROptPre.h +++ b/src/include/SysYIRCFGOpt.h @@ -11,17 +11,19 @@ namespace sysy { // 这里将其放在SysY IR生成后进行预处理 // 同时兼容phi节点的处理,可以再mem2reg后再次调用优化 -//TODO: 可增加的CFG优化 +//TODO: 可增加的CFG优化和方法 +// - 检查基本块跳转关系正确性 // - 简化条件分支(Branch Simplification),如条件恒真/恒假转为直接跳转 // - 合并连续的跳转指令(Jump Threading)在合并不可达块中似乎已经实现了 // - 基本块重排序(Block Reordering),提升局部性 -class SysYOptPre { + +class SysYCFGOpt { private: Module *pModule; IRBuilder *pBuilder; public: - SysYOptPre(Module *pMoudle, IRBuilder *pBuilder) : pModule(pMoudle), pBuilder(pBuilder) {} + SysYCFGOpt(Module *pMoudle, IRBuilder *pBuilder) : pModule(pMoudle), pBuilder(pBuilder) {} void SysYOptimizateAfterIR(){ SysYDelInstAfterBr(); @@ -32,7 +34,7 @@ class SysYOptPre { } void SysYDelInstAfterBr(); // 删除br后面的指令 void SysYDelEmptyBlock(); // 空块删除 - void SysYDelNoPreBLock(); // 删除无前驱块 + void SysYDelNoPreBLock(); // 删除无前驱块(不可达块) void SysYBlockMerge(); // 合并基本块(主要针对嵌套if while的exit块, // 也可以修改IR生成实现回填机制 void SysYAddReturn(); // 添加return指令(主要针对Void函数) diff --git a/src/sysyc.cpp b/src/sysyc.cpp index edd9318..c34a801 100644 --- a/src/sysyc.cpp +++ b/src/sysyc.cpp @@ -13,7 +13,7 @@ using namespace antlr4; #include "SysYIRGenerator.h" #include "SysYIRPrinter.h" -#include "SysYIROptPre.h" +#include "SysYIRCFGOpt.h" #include "RISCv64Backend.h" #include "SysYIRAnalyser.h" #include "DeadCodeElimination.h" @@ -127,8 +127,8 @@ int main(int argc, char **argv) { cout << "Applying middle-end optimizations (level -O" << optLevel << ")...\n"; // 默认优化 pass (在所有优化级别都会执行) - SysYOptPre optPre(moduleIR, builder); - optPre.SysYOptimizateAfterIR(); + SysYCFGOpt cfgopt(moduleIR, builder); + cfgopt.SysYOptimizateAfterIR(); ControlFlowAnalysis cfa(moduleIR); cfa.init();