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)) {