@@ -14,3 +14,38 @@ void complex_functional_cast() {
1414
1515// LLVM: %[[INIT:.*]] = alloca { i32, i32 }, i64 1, align 4
1616// 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