Author: Amr Hesham Date: 2025-07-01T20:56:39+02:00 New Revision: e11d354d64fb9f4f87f53fdc96a1dbbfee167337
URL: https://github.com/llvm/llvm-project/commit/e11d354d64fb9f4f87f53fdc96a1dbbfee167337 DIFF: https://github.com/llvm/llvm-project/commit/e11d354d64fb9f4f87f53fdc96a1dbbfee167337.diff LOG: [CIR] Upstream GenericSelectionExpr (#146211) Upstream GenericSelectionExpr for ScalarExpr Added: clang/test/CIR/CodeGen/generic-selection.c Modified: clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp Removed: ################################################################################ diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp index 955bb5ffc4395..038df2115f73c 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp @@ -127,6 +127,10 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> { mlir::Value VisitParenExpr(ParenExpr *pe) { return Visit(pe->getSubExpr()); } + mlir::Value VisitGenericSelectionExpr(GenericSelectionExpr *ge) { + return Visit(ge->getResultExpr()); + } + /// Emits the address of the l-value, then loads and returns the result. mlir::Value emitLoadOfLValue(const Expr *e) { LValue lv = cgf.emitLValue(e); diff --git a/clang/test/CIR/CodeGen/generic-selection.c b/clang/test/CIR/CodeGen/generic-selection.c new file mode 100644 index 0000000000000..c1659382a7059 --- /dev/null +++ b/clang/test/CIR/CodeGen/generic-selection.c @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-cir %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-llvm %s -o %t-cir.ll +// RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG + +void foo() { + int a; + int r = _Generic(a, double: 1, float: 2, int: 3, default: 4); +} + +// CIR: %[[A:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a"] +// CIR: %[[RES:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["r", init] +// CIR: %[[RES_VAL:.*]] = cir.const #cir.int<3> : !s32i +// CIR: cir.store{{.*}} %[[RES_VAL]], %[[RES]] : !s32i, !cir.ptr<!s32i> + +// LLVM: %[[A:.*]] = alloca i32, i64 1, align 4 +// LLVM: %[[RES:.*]] = alloca i32, i64 1, align 4 +// LLVM: store i32 3, ptr %[[RES]], align 4 + +// OGCG: %[[A:.*]] = alloca i32, align 4 +// OGCG: %[[RES:.*]] = alloca i32, align 4 +// OGCG: store i32 3, ptr %[[RES]], align 4 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits