[clang] [CIR] Add if statement support (PR #134333)

Andy Kaylor via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 4 13:49:44 PDT 2025


================
@@ -263,6 +264,72 @@ static void terminateBody(CIRGenBuilderTy &builder, mlir::Region &r,
     b->erase();
 }
 
+mlir::LogicalResult CIRGenFunction::emitIfStmt(const IfStmt &s) {
+  mlir::LogicalResult res = mlir::success();
+  // The else branch of a consteval if statement is always the only branch
+  // that can be runtime evaluated.
+  const Stmt *ConstevalExecuted;
+  if (s.isConsteval()) {
+    ConstevalExecuted = s.isNegatedConsteval() ? s.getThen() : s.getElse();
+    if (!ConstevalExecuted) {
+      // No runtime code execution required
+      return res;
+    }
+  }
+
+  // C99 6.8.4.1: The first substatement is executed if the expression
+  // compares unequal to 0.  The condition must be a scalar type.
+  auto ifStmtBuilder = [&]() -> mlir::LogicalResult {
+    if (s.isConsteval())
+      return emitStmt(ConstevalExecuted, /*useCurrentScope=*/true);
+
+    if (s.getInit())
+      if (emitStmt(s.getInit(), /*useCurrentScope=*/true).failed())
+        return mlir::failure();
+
+    if (s.getConditionVariable())
+      emitDecl(*s.getConditionVariable());
+
+    // During LLVM codegen, if the condition constant folds and can be elided,
+    // it tries to avoid emitting the condition and the dead arm of the if/else.
+    // TODO(cir): we skip this in CIRGen, but should implement this as part of
+    // SSCP or a specific CIR pass.
+    bool CondConstant;
+    if (ConstantFoldsToSimpleInteger(s.getCond(), CondConstant,
----------------
andykaylor wrote:

The only place the classic codegen calls `ConstantFoldsToSimpleInteger` that isn't using the form with a Boolean result argument is in the switch statement handling. That case is not folded in the CIR codegen in the incubator, with a comment saying we prefer to keep it and let MLIR do the folding. @bcardosolopes Wouldn't the same apply here and other places where conditions are constant folded?

It looks like @keryell added the implementation here and maybe is needed in the case of `constexpr`.

https://github.com/llvm/llvm-project/pull/134333


More information about the cfe-commits mailing list