diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8851182..f6f841a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -17,6 +17,7 @@ add_executable(sysyc SysYIRGenerator.cpp # Backend.cpp SysYIRPrinter.cpp + SysYIROptPre.cpp RISCv32Backend.cpp ) target_include_directories(sysyc PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/src/SysYIROptPre.cpp b/src/SysYIROptPre.cpp index edd9333..90ff3fd 100644 --- a/src/SysYIROptPre.cpp +++ b/src/SysYIROptPre.cpp @@ -38,9 +38,8 @@ void SysYOptPre::SysYDelInstAfterBr() { for (auto &basicBlock : basicBlocks) { bool Branch = false; auto &instructions = basicBlock->getInstructions(); - auto iter = instructions.begin(); auto Branchiter = instructions.end(); - for (auto iter = instructions->begin(); iter != instructions->end();iter++) { + for (auto iter = instructions.begin(); iter != instructions.end(); ++iter) { if (Branch) usedelete(iter->get()); else if ((*iter)->isTerminator()){ @@ -48,8 +47,8 @@ void SysYOptPre::SysYDelInstAfterBr() { Branchiter = iter; } } - Branchiter++; - while(Branchiter != instructions->begin()) + if (Branchiter != instructions.end()) ++Branchiter; + while (Branchiter != instructions.end()) Branchiter = instructions.erase(Branchiter); if (Branch) { // 更新前驱后继关系 @@ -183,10 +182,8 @@ void SysYOptPre::SysYDelNoPreBLock() { } - for (auto blockIter = func->getBasicBlocks().begin(); blockIter != func->getBasicBlocks().end();blockIter++) { + for (auto blockIter = func->getBasicBlocks().begin(); blockIter != func->getBasicBlocks().end();) { if (!blockIter->get()->getreachable()) { - //// 处理phi指令 - // 删除不可达基本块的phi指令的操作数 for (auto succblock : blockIter->get()->getSuccessors()) { int indexphi = 1; for (auto pred : succblock->getPredecessors()) { @@ -202,14 +199,16 @@ void SysYOptPre::SysYDelNoPreBLock() { phiinst->removeOperand(indexphi); } } - // 删除不可达基本块 - func->removeBasicBlock(blockIter->get()); + // 删除不可达基本块,注意迭代器不可达问题 + func->removeBasicBlock((blockIter++)->get()); + } else { + blockIter++; } } } } -void SysyOptimization::SysyDelEmptyBlock() { +void SysYOptPre::SysYDelEmptyBlock() { auto &functions = pModule->getFunctions(); for (auto &function : functions) { // 收集不可达基本块 @@ -259,7 +258,7 @@ void SysyOptimization::SysyDelEmptyBlock() { --thelastinst; // 根据br指令传递的后继块信息,跳过空块链 - if (thelastinst->get()->getKind()->isUnconditional()) { + if (thelastinst->get()->isUnconditional()) { BasicBlock* OldBrBlock = dynamic_cast(thelastinst->get()->getOperand(0)); BasicBlock *thelastBlockOld = nullptr; // 如果空块链表为多个块 @@ -285,7 +284,7 @@ void SysyOptimization::SysyDelEmptyBlock() { // 更新phi指令的操作数 // 移除thelastBlockOld对应的phi操作数 - for (auto &InstInNew : dynamic_cast(thelastinst->get()->getOperand(1))->getInstructions()) { + for (auto &InstInNew : dynamic_cast(thelastinst->get()->getOperand(0))->getInstructions()) { if (InstInNew->isPhi()) { dynamic_cast(InstInNew.get())->removeOperand(indexphi + 1); } else { @@ -322,12 +321,12 @@ void SysyOptimization::SysyDelEmptyBlock() { // auto indexInNew = dynamic_cast(thelastinst->get()->getOperand(0))->getPredecessors(). if (thelastBlockOld != nullptr) { - int index = 0; + int indexphi = 0; for (auto &pred : dynamic_cast(thelastinst->get()->getOperand(1))->getPredecessors()) { if (pred == thelastBlockOld) { break; } - index++; + indexphi++; } for (auto &InstInNew : dynamic_cast(thelastinst->get()->getOperand(1))->getInstructions()) { @@ -362,12 +361,12 @@ void SysyOptimization::SysyDelEmptyBlock() { dynamic_cast(thelastinst->get()->getOperand(2))->addPredecessor(basicBlock.get()); if (thelastBlockOld != nullptr) { - int index = 0; + int indexphi = 0; for (auto &pred : dynamic_cast(thelastinst->get()->getOperand(2))->getPredecessors()) { if (pred == thelastBlockOld) { break; } - index++; + indexphi++; } for (auto &InstInNew : dynamic_cast(thelastinst->get()->getOperand(2))->getInstructions()) { if (InstInNew->isPhi()) { @@ -398,12 +397,12 @@ void SysyOptimization::SysyDelEmptyBlock() { basicBlock->addSuccessor(dynamic_cast(thelastinst->get()->getOperand(0))); dynamic_cast(thelastinst->get()->getOperand(0))->addPredecessor(basicBlock.get()); if (thelastBlockOld != nullptr) { - int index = 0; + int indexphi = 0; for (auto &pred : dynamic_cast(thelastinst->get()->getOperand(0))->getPredecessors()) { if (pred == thelastBlockOld) { break; } - index++; + indexphi++; } for (auto &InstInNew : dynamic_cast(thelastinst->get()->getOperand(0))->getInstructions()) { @@ -461,7 +460,7 @@ void SysYOptPre::SysYAddReturn() { auto &functions = pModule->getFunctions(); for (auto &function : functions) { auto &func = function.second; - auto &basicBlocks = func->getBasicBlocks(); + auto basicBlocks = func->getBasicBlocks(); for (auto &block : basicBlocks) { if (block->getNumSuccessors() == 0) { // 如果基本块没有后继块,则添加一个返回指令 diff --git a/src/include/SysYIROptPre.h b/src/include/SysYIROptPre.h index db27b82..4f0bdca 100644 --- a/src/include/SysYIROptPre.h +++ b/src/include/SysYIROptPre.h @@ -19,7 +19,7 @@ class SysYOptPre { SysYOptPre(Module *pMoudle, IRBuilder *pBuilder) : pModule(pMoudle), pBuilder(pBuilder) {} void SysYOptimizateAfterIR(){ - SysYDelAfterBr(); + SysYDelInstAfterBr(); SysYBlockMerge(); SysYDelNoPreBLock(); SysYDelEmptyBlock(); @@ -31,7 +31,7 @@ class SysYOptPre { void SysYBlockMerge(); // 合并基本块(主要针对嵌套if while的exit块, // 也可以修改IR生成实现回填机制 void SysYAddReturn(); // 添加return指令(主要针对Void函数) - void usedelete(); // use删除 + void usedelete(Instruction *instr); // use删除 }; } // namespace sysy diff --git a/src/sysyc.cpp b/src/sysyc.cpp index dc1015b..854ac53 100644 --- a/src/sysyc.cpp +++ b/src/sysyc.cpp @@ -9,6 +9,7 @@ using namespace antlr4; // #include "Backend.h" #include "SysYIRGenerator.h" #include "SysYIRPrinter.h" +#include "SysYIROptPre.h" // #include "LLVMIRGenerator.h" using namespace sysy; @@ -79,6 +80,10 @@ int main(int argc, char **argv) { auto moduleIR = generator.get(); SysYPrinter printer(moduleIR); printer.printIR(); + auto builder = generator.getBuilder(); + SysYOptPre optPre(moduleIR, builder); + optPre.SysYOptimizateAfterIR(); + printer.printIR(); return EXIT_SUCCESS; } return EXIT_SUCCESS;