https://github.com/AmrDeveloper created https://github.com/llvm/llvm-project/pull/146211
Upstream GenericSelectionExpr for ScalarExpr >From 351422fe7f124351b06048048dfa28dd03ca35e5 Mon Sep 17 00:00:00 2001 From: AmrDeveloper <am...@programmer.net> Date: Sat, 28 Jun 2025 15:10:36 +0200 Subject: [PATCH] [CIR] Upstream GenericSelectionExpr --- clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp | 4 ++++ clang/test/CIR/CodeGen/generic-selection.c | 24 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 clang/test/CIR/CodeGen/generic-selection.c 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