[clang] [CIR] Upstream lowering of conditional operators to TernaryOp (PR #138156)
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Thu May 1 09:01:36 PDT 2025
================
@@ -948,6 +950,165 @@ void CIRGenFunction::emitIgnoredExpr(const Expr *e) {
emitLValue(e);
}
+// Handle the case where the condition is a constant evaluatable simple integer,
+// which means we don't have to separately handle the true/false blocks.
+static std::optional<LValue> handleConditionalOperatorLValueSimpleCase(
+ CIRGenFunction &cgf, const AbstractConditionalOperator *e) {
+ const Expr *condExpr = e->getCond();
+ bool condExprBool;
+ if (cgf.constantFoldsToSimpleInteger(condExpr, condExprBool)) {
+ const Expr *live = e->getTrueExpr(), *dead = e->getFalseExpr();
+ if (!condExprBool)
+ std::swap(live, dead);
+
+ if (!cgf.containsLabel(dead)) {
+ // If the true case is live, we need to track its region.
+ if (condExprBool) {
----------------
erichkeane wrote:
This is suspicious. We've already swapped based on this, right? So the association of dead/live/true/false is broken.
https://github.com/llvm/llvm-project/pull/138156
More information about the cfe-commits
mailing list