================
@@ -0,0 +1,112 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -O2 -fclangir -emit-cir %s
-o %t.cir
----------------
E00N777 wrote:
Hey andy, I fond some problems when I tried to add tests for a variable
declared in the condition of a while loop and for loop.
Adding the requested test for a variable declared in a while/for condition
uncovered two distinct problems, one of which pre-dates this PR:
- A LifetimeMarker cleanup is pushed while the loop's cond region is being
emitted. Since pushCleanup eagerly creates a cir.cleanup.scope and moves the
insertion point into its body region, the subsequently emitted cir.condition
ends up nested inside the cleanup scope, and the verifier rejects it
("condition must be within a conditional region"). So while (int x = g()) at
-O2 would fail to compile.
- A pre-existing structural issue on main (not addressed here). The same shape
already fails on current main without this PR when the condition variable has a
non-trivial destructor, e.g. while (Guard g = Guard()), because the destructor
cleanup takes the same eager-cir.cleanup.scope path.
The underlying problem is semantic: per C++ [stmt.while] a loop condition
variable is destroyed and re-created on every iteration, so its cleanup must
run on both the back edge and the exit edge. Classic CodeGen expresses this
naturally on its flat CFG (both edges branch through a shared cleanup block).
The structured cond region has no way to express a cleanup on two edges. a
cir.cleanup.scope wrapping the condition would trap the cir.condition
terminator.
For this PR I suppress lifetime markers for while/for condition variables
(suppressLoopCondVarLifetime, save/restored around the condition variable's
emitDecl). The destructor case is anorthogonal pre-existing issue; If you have
any suggestions for this issue, please let me know.
https://github.com/llvm/llvm-project/pull/206695
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits