From 46179e38662c9f56c238f3aed1269aed8718830a Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Mon, 11 Aug 2025 18:40:58 +0800 Subject: [PATCH] =?UTF-8?q?[midend-CFGOpt]=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8C=87=E4=BB=A4=E5=88=A0=E9=99=A4=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/midend/Pass/Optimize/SysYIRCFGOpt.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp b/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp index 393df63..3477864 100644 --- a/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp +++ b/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp @@ -42,7 +42,7 @@ bool SysYCFGOptUtils::SysYDelInstAfterBr(Function *func) { ++Branchiter; while (Branchiter != instructions.end()) { changed = true; - Branchiter = instructions.erase(Branchiter); + Branchiter = SysYIROptUtils::usedelete(Branchiter); // 删除指令 } if (Branch) { // 更新前驱后继关系 @@ -91,7 +91,7 @@ bool SysYCFGOptUtils::SysYBlockMerge(Function *func) { BasicBlock *block = blockiter->get(); BasicBlock *nextBlock = blockiter->get()->getSuccessors()[0]; // auto nextarguments = nextBlock->getArguments(); - // 删除br指令 + // 删除block的br指令 if (block->getNumInstructions() != 0) { auto thelastinstinst = block->terminator(); if (thelastinstinst->get()->isUnconditional()) { @@ -103,14 +103,20 @@ bool SysYCFGOptUtils::SysYBlockMerge(Function *func) { if (brinst->getThenBlock() == brinst->getElseBlock()) { thelastinstinst = SysYIROptUtils::usedelete(thelastinstinst); } + else{ + assert(false && "SysYBlockMerge: unexpected conditional branch with different then and else blocks"); + } } } // 将后继块的指令移动到当前块 // 并将后继块的父指针改为当前块 for (auto institer = nextBlock->begin(); institer != nextBlock->end();) { - institer->get()->setParent(block); - block->getInstructions().emplace_back(institer->release()); - institer = nextBlock->getInstructions().erase(institer); + // institer->get()->setParent(block); + // block->getInstructions().emplace_back(institer->release()); + // 用usedelete删除会导致use关系被删除我只希望移动指令到当前块 + // institer = SysYIROptUtils::usedelete(institer); + // institer = nextBlock->getInstructions().erase(institer); + nextBlock->moveInst(institer, block->getInstructions().end(), block); } // 更新前驱后继关系,类似树节点操作 block->removeSuccessor(nextBlock);