From 5f63554ca36e9ed2f8e066cec02077df849f654b Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Mon, 4 Aug 2025 18:56:57 +0800 Subject: [PATCH] =?UTF-8?q?[midend]=E4=BF=AE=E6=AD=A3=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=9D=97=E9=93=BE=E4=BC=9A=E5=B0=86entry?= =?UTF-8?q?=E5=9D=97=E7=BA=B3=E5=85=A5=E8=80=83=E8=99=91=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82=E4=B8=8A=E6=AC=A1commit?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E4=BF=AE=E6=94=B9=E4=BA=86alloca=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E7=9A=84=E9=80=BB=E8=BE=91=E4=BF=9D=E8=AF=81=E4=BA=86?= =?UTF-8?q?alloca=E7=9A=84=E5=A3=B0=E6=98=8E=E5=85=A8=E9=83=A8=E5=9C=A8ent?= =?UTF-8?q?ry=E5=9D=97=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/midend/Pass/Optimize/SysYIRCFGOpt.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp b/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp index 5e75645..393df63 100644 --- a/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp +++ b/src/midend/Pass/Optimize/SysYIRCFGOpt.cpp @@ -77,6 +77,11 @@ bool SysYCFGOptUtils::SysYBlockMerge(Function *func) { bool changed = false; for (auto blockiter = func->getBasicBlocks().begin(); blockiter != func->getBasicBlocks().end();) { + // 检查当前块是是不是entry块 + if( blockiter->get() == func->getEntryBlock() ) { + blockiter++; + continue; // 跳过入口块 + } if (blockiter->get()->getNumSuccessors() == 1) { // 如果当前块只有一个后继块 // 且后继块只有一个前驱块 @@ -288,13 +293,12 @@ bool SysYCFGOptUtils::SysYDelEmptyBlock(Function *func, IRBuilder *pBuilder) { continue; } - std::function getUltimateSourceValue = [&](Value *val, - BasicBlock *currentDefBlock) -> Value * { - // 如果值不是指令,例如常量或函数参数,则它本身就是最终来源 - if (auto instr = dynamic_cast(val)) { // Assuming Value* has a method to check if it's an instruction + std::function getUltimateSourceValue = [&](Value *val, BasicBlock *currentDefBlock) -> Value * { + + if(!dynamic_cast(val)) { + // 如果 val 不是指令,直接返回它 return val; } - Instruction *inst = dynamic_cast(val); // 如果定义指令不在任何空块中,它就是最终来源 if (!emptyBlockRedirectMap.count(currentDefBlock)) {