Skip to content

Commit bcb595a

Browse files
authored
[CIR] Backport ChooseExpr for Scalar expr (#1700)
Backport ChooseExpr for Scalar expr
1 parent 4ddd7e2 commit bcb595a

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,11 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
772772
mlir::Value VisitBlockExpr(const BlockExpr *E) { llvm_unreachable("NYI"); }
773773
mlir::Value
774774
VisitAbstractConditionalOperator(const AbstractConditionalOperator *E);
775-
mlir::Value VisitChooseExpr(ChooseExpr *E) { llvm_unreachable("NYI"); }
775+
776+
mlir::Value VisitChooseExpr(ChooseExpr *E) {
777+
return Visit(E->getChosenSubExpr());
778+
}
779+
776780
mlir::Value VisitVAArgExpr(VAArgExpr *VE);
777781
mlir::Value VisitObjCStringLiteral(const ObjCStringLiteral *E) {
778782
llvm_unreachable("NYI");
Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,34 @@
11
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
22
// RUN: FileCheck %s --check-prefix=CIR --input-file=%t.cir
33

4-
auto func() {
4+
auto func() -> int {
55
return __builtin_strcmp("", "");
66
// CIR: cir.func dso_local @_Z4funcv()
7-
// CIR-NEXT: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
8-
// CIR-NEXT: %1 = cir.const #cir.int<0> : !s32i
9-
// CIR-NEXT: cir.store %1, %0 : !s32i, !cir.ptr<!s32i>
10-
// CIR-NEXT: %2 = cir.load{{.*}} %0 : !cir.ptr<!s32i>, !s32i
11-
// CIR-NEXT: cir.return %2 : !s32i
7+
// CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
8+
// CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<0> : !s32i
9+
// CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr<!s32i>
10+
// CIR-NEXT: %[[TMP:.*]] = cir.load{{.*}} %0 : !cir.ptr<!s32i>, !s32i
11+
// CIR-NEXT: cir.return %[[TMP]] : !s32i
12+
}
13+
14+
auto func2() -> int {
15+
return __builtin_choose_expr(true, 1, 2);
16+
17+
// CIR: cir.func dso_local @_Z5func2v()
18+
// CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
19+
// CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<1> : !s32i
20+
// CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr<!s32i>
21+
// CIR-NEXT: %[[TMP:.*]] = cir.load %[[RET_VAL]] : !cir.ptr<!s32i>, !s32i
22+
// CIR-NEXT: cir.return %[[TMP]] : !s32i
23+
}
24+
25+
auto func3() -> int {
26+
return __builtin_choose_expr(false, 1, 2);
27+
28+
// CIR: cir.func dso_local @_Z5func3v()
29+
// CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
30+
// CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<2> : !s32i
31+
// CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr<!s32i>
32+
// CIR-NEXT: %[[TMP:.*]] = cir.load %[[RET_VAL]] : !cir.ptr<!s32i>, !s32i
33+
// CIR-NEXT: cir.return %[[TMP]] : !s32i
1234
}

0 commit comments

Comments
 (0)