================ @@ -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, ---------------- Andres-Salamanca wrote:
// If the condition folds to a constant and this is an 'if constexpr', // we simplify it early in CIRGen to avoid emitting the full 'if'. is this better ? https://github.com/llvm/llvm-project/pull/134333 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits