@@ -14,3 +14,38 @@ void complex_functional_cast() {
14
14
15
15
// LLVM: %[[INIT:.*]] = alloca { i32, i32 }, i64 1, align 4
16
16
// LLVM: store { i32, i32 } zeroinitializer, ptr %[[INIT]], align 4
17
+
18
+ void complex_abstract_condition (bool cond, int _Complex a, int _Complex b) {
19
+ int _Complex c = cond ? a : b;
20
+ }
21
+
22
+ // CIR: %[[COND:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["cond", init]
23
+ // CIR: %[[COMPLEX_A:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["a", init]
24
+ // CIR: %[[COMPLEX_B:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["b", init]
25
+ // CIR: %[[RESULT:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["c", init]
26
+ // CIR: %[[TMP_COND:.*]] = cir.load{{.*}} %[[COND]] : !cir.ptr<!cir.bool>, !cir.bool
27
+ // CIR: %[[RESULT_VAL:.*]] = cir.ternary(%[[TMP_COND]], true {
28
+ // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[COMPLEX_A]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
29
+ // CIR: cir.yield %[[TMP_A]] : !cir.complex<!s32i>
30
+ // CIR: }, false {
31
+ // CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[COMPLEX_B]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
32
+ // CIR: cir.yield %[[TMP_B]] : !cir.complex<!s32i>
33
+ // CIR: }) : (!cir.bool) -> !cir.complex<!s32i>
34
+ // CIR: cir.store{{.*}} %[[RESULT_VAL]], %[[RESULT]] : !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
35
+
36
+ // LLVM: %[[COND:.*]] = alloca i8, i64 1, align 1
37
+ // LLVM: %[[COMPLEX_A:.*]] = alloca { i32, i32 }, i64 1, align 4
38
+ // LLVM: %[[COMPLEX_B:.*]] = alloca { i32, i32 }, i64 1, align 4
39
+ // LLVM: %[[RESULT:.*]] = alloca { i32, i32 }, i64 1, align 4
40
+ // LLVM: %[[TMP_COND:.*]] = load i8, ptr %[[COND]], align 1
41
+ // LLVM: %[[COND_VAL:.*]] = trunc i8 %[[TMP_COND]] to i1
42
+ // LLVM: br i1 %[[COND_VAL]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]
43
+ // LLVM: [[TRUE_BB]]:
44
+ // LLVM: %[[TMP_A:.*]] = load { i32, i32 }, ptr %[[COMPLEX_A]], align 4
45
+ // LLVM: br label %[[END_BB:.*]]
46
+ // LLVM: [[FALSE_BB]]:
47
+ // LLVM: %[[TMP_B:.*]] = load { i32, i32 }, ptr %[[COMPLEX_B]], align 4
48
+ // LLVM: br label %[[END_BB]]
49
+ // LLVM: [[END_BB]]:
50
+ // LLVM: %[[RESULT_VAL:.*]] = phi { i32, i32 } [ %[[TMP_B]], %[[FALSE_BB]] ], [ %[[TMP_A]], %[[TRUE_BB]] ]
51
+ // LLVM: store { i32, i32 } %[[RESULT_VAL]], ptr %[[RESULT]], align 4
0 commit comments