================
@@ -987,9 +987,17 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
EmitStmt(Else);
}
{
+ llvm::BasicBlock *ElseExitBlock = Builder.GetInsertBlock();
// There is no need to emit line number for an unconditional branch.
auto NL = ApplyDebugLocation::CreateEmpty(*this);
EmitBranch(ContBlock);
+
+ // If nested control flow in the else body left behind a synthetic
+ // continuation, fold it into this if's continuation when possible. Do
not
+ // fold source-label targets, as they may still be referenced.
+ if (ElseExitBlock && ElseExitBlock != ElseBlock &&
+ !isLabelTarget(ElseExitBlock))
----------------
firmiana402 wrote:
The difference is the kind of block being simplified here.
In `EmitWhileStmt` and `EmitDoStmt`, `SimplifyForwardingBlocks` is applied to
CodeGen-created loop blocks (`LoopHeader` / `LoopCond`) in the special cases
where the condition branch was skipped. Those blocks are part of the synthetic
loop structure.
Here, `ElseExitBlock` is the current insertion block after emitting an
arbitrary `else` body. That block can be a source-label target, e.g.
```c
if (x) {
f();
} else {
label:;
}
```
In that case, the block is still tracked through `LabelMap`, and later `goto
label` emission can still refer to it at the CodeGen level.
`SimplifyForwardingBlocks` only updates existing LLVM IR uses, not those future
CodeGen references. So this call site needs to avoid folding source-label
targets.
https://github.com/llvm/llvm-project/pull/207129
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits