From dc5e9510be87caada4b1ab9f5bbb012fc63fd64f Mon Sep 17 00:00:00 2001 From: AmrDeveloper Date: Fri, 20 Jun 2025 19:55:55 +0200 Subject: [PATCH] [CIR] Backport ChooseExpr for Scalar expr --- clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp | 6 +++- .../CodeGen/builtin-constant-evaluated.cpp | 34 +++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp index 799d80d66a86..3c28642b077f 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp @@ -772,7 +772,11 @@ class ScalarExprEmitter : public StmtVisitor { mlir::Value VisitBlockExpr(const BlockExpr *E) { llvm_unreachable("NYI"); } mlir::Value VisitAbstractConditionalOperator(const AbstractConditionalOperator *E); - mlir::Value VisitChooseExpr(ChooseExpr *E) { llvm_unreachable("NYI"); } + + mlir::Value VisitChooseExpr(ChooseExpr *E) { + return Visit(E->getChosenSubExpr()); + } + mlir::Value VisitVAArgExpr(VAArgExpr *VE); mlir::Value VisitObjCStringLiteral(const ObjCStringLiteral *E) { llvm_unreachable("NYI"); diff --git a/clang/test/CIR/CodeGen/builtin-constant-evaluated.cpp b/clang/test/CIR/CodeGen/builtin-constant-evaluated.cpp index c83a21f6708d..9d4d97994d67 100644 --- a/clang/test/CIR/CodeGen/builtin-constant-evaluated.cpp +++ b/clang/test/CIR/CodeGen/builtin-constant-evaluated.cpp @@ -1,12 +1,34 @@ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir // RUN: FileCheck %s --check-prefix=CIR --input-file=%t.cir -auto func() { +auto func() -> int { return __builtin_strcmp("", ""); // CIR: cir.func dso_local @_Z4funcv() - // CIR-NEXT: %0 = cir.alloca !s32i, !cir.ptr, ["__retval"] {alignment = 4 : i64} - // CIR-NEXT: %1 = cir.const #cir.int<0> : !s32i - // CIR-NEXT: cir.store %1, %0 : !s32i, !cir.ptr - // CIR-NEXT: %2 = cir.load{{.*}} %0 : !cir.ptr, !s32i - // CIR-NEXT: cir.return %2 : !s32i + // CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr, ["__retval"] {alignment = 4 : i64} + // CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<0> : !s32i + // CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr + // CIR-NEXT: %[[TMP:.*]] = cir.load{{.*}} %0 : !cir.ptr, !s32i + // CIR-NEXT: cir.return %[[TMP]] : !s32i +} + +auto func2() -> int { + return __builtin_choose_expr(true, 1, 2); + + // CIR: cir.func dso_local @_Z5func2v() + // CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr, ["__retval"] + // CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<1> : !s32i + // CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr + // CIR-NEXT: %[[TMP:.*]] = cir.load %[[RET_VAL]] : !cir.ptr, !s32i + // CIR-NEXT: cir.return %[[TMP]] : !s32i +} + +auto func3() -> int { + return __builtin_choose_expr(false, 1, 2); + + // CIR: cir.func dso_local @_Z5func3v() + // CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr, ["__retval"] + // CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<2> : !s32i + // CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr + // CIR-NEXT: %[[TMP:.*]] = cir.load %[[RET_VAL]] : !cir.ptr, !s32i + // CIR-NEXT: cir.return %[[TMP]] : !s32i }