Skip to content

Commit 632b854

Browse files
committed
fix: RemoveEmptyLoop 副作用判定排除 terminator
之前在 hasSideEffect 中新增 `mayHaveSideEffects() && 非Call` 判定以稳健捕获 VSTORE,但 mayHaveSideEffects() 对 terminator 也返回 true,而 isRemovableLoop 遍历循环体含块末 terminator(每个 BB 都以分支结尾),导致所有循环 被判为有副作用,全局静默禁用了空循环消除,引发退化. 显式排除 isTerminator,保留 VSTORE 捕获与 null 检查.
1 parent dd382cb commit 632b854

1 file changed

Lines changed: 4 additions & 1 deletion

File tree

ir/passes/fixedPointFunctionPass/RemoveEmptyLoop.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ bool hasSideEffect(Instruction * inst, FunctionSideEffectAnalysis & sideEffects)
7777
if (!inst) {
7878
return false;
7979
}
80-
if (inst->mayHaveSideEffects() && !dynamic_cast<CallInst *>(inst)) {
80+
// mayHaveSideEffects() 把 terminator 也算作副作用(控制流变化),但空循环消除
81+
// 本就要连同回边/分支一起删除,循环体里的 terminator 不应阻止删除;这里仅借
82+
// 它捕获 VSTORE 等真正写内存的指令,故显式排除 terminator 与 call
83+
if (inst->mayHaveSideEffects() && !inst->isTerminator() && !dynamic_cast<CallInst *>(inst)) {
8184
return true;
8285
}
8386
if (dynamic_cast<StoreInst *>(inst) != nullptr) {

0 commit comments

Comments
 (0)