================
@@ -3205,7 +3180,17 @@ LValue CIRGenFunction::emitConditionalOperatorLValue(
 
   assert((info.lhs || info.rhs) &&
          "both operands of glvalue conditional are throw-expressions?");
-  return info.lhs ? *info.lhs : *info.rhs;
+
+  // Only one arm produced an lvalue; the other was a throw-expression. The
+  // surviving arm's pointer was materialized inside the ternary's region and
+  // is not visible past the op, so address the result through the ternary's
+  // result value, which the region's cir.yield carries out.
+  LValue &survivingLV = info.lhs ? *info.lhs : *info.rhs;
+  Address survivingAddr = survivingLV.getAddress();
+  Address result(info.result, survivingAddr.getElementType(),
+                 survivingAddr.getAlignment());
+  assert(!cir::MissingFeatures::opTBAA());
+  return makeAddrLValue(result, expr->getType(), survivingLV.getBaseInfo());
----------------
kumarak wrote:

@andykaylor, The usage of the `phi` value in the test is the side-effect of 
this change, but the change is to fix the verifier error with the test below:
```
int &ref_cond(bool c, int &x) { return c ? x : throw 0; }
```

The previous implementation of one-arm throw returned an LValue whose pointer 
was materialized within the ternary's region. When the surviving arm is a local 
variable, that pointer is a `cir.alloca`, so it stays visible after the op and 
everything works, including the tests. But when the arm has to operate on its 
pointers (like loading a reference parameter, cir.get_member through a 
pointer), that value is region-local, and any use after the ternary fails 
verification. 

It works with the Classic codegen pipeline because the CFG is flat, and 
returning an LValue does not create the issue. But with CIR, the `cir.ternary` 
region boundary breaks the logic, and the only legal way to carry the pointer 
out is through yield/result. 

Please let me know if it makes it clear. I have added a regression test 
covering the scenario. 

https://github.com/llvm/llvm-project/pull/210384
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to