@@ -571,10 +571,10 @@ void foo23(int _Complex a, int _Complex b) {
571
571
// OGCG: %[[B_REAL:.*]] = load i32, ptr %[[B_REAL_PTR]], align 4
572
572
// OGCG: %[[B_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_B]], i32 0, i32 1
573
573
// OGCG: %[[B_IMAG:.*]] = load i32, ptr %[[B_IMAG_PTR]], align 4
574
- // OGCG: %[[RESULT_REAL_PT :.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[RESULT]], i32 0, i32 0
575
- // OGCG: %[[RESULT_IMAG_PT :.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[RESULT]], i32 0, i32 1
576
- // OGCG: store i32 %[[B_REAL]], ptr %[[RESULT_REAL_PT ]], align 4
577
- // OGCG: store i32 %[[B_IMAG]], ptr %[[RESULT_IMAG_PT ]], align 4
574
+ // OGCG: %[[RESULT_REAL_PTR :.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[RESULT]], i32 0, i32 0
575
+ // OGCG: %[[RESULT_IMAG_PTR :.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[RESULT]], i32 0, i32 1
576
+ // OGCG: store i32 %[[B_REAL]], ptr %[[RESULT_REAL_PTR ]], align 4
577
+ // OGCG: store i32 %[[B_IMAG]], ptr %[[RESULT_IMAG_PTR ]], align 4
578
578
579
579
void foo24 () {
580
580
int _Complex arr[2 ];
@@ -655,6 +655,68 @@ void foo26(int _Complex* a) {
655
655
// OGCG: store i32 %[[A_REAL]], ptr %[[B_REAL_PTR]], align 4
656
656
// OGCG: store i32 %[[A_IMAG]], ptr %[[B_IMAG_PTR]], align 4
657
657
658
+ void foo27 (bool cond, int _Complex a, int _Complex b) {
659
+ int _Complex c = cond ? a : b;
660
+ }
661
+
662
+ // CIR: %[[COND:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["cond", init]
663
+ // CIR: %[[COMPLEX_A:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["a", init]
664
+ // CIR: %[[COMPLEX_B:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["b", init]
665
+ // CIR: %[[RESULT:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["c", init]
666
+ // CIR: %[[TMP_COND:.*]] = cir.load{{.*}} %[[COND]] : !cir.ptr<!cir.bool>, !cir.bool
667
+ // CIR: %[[RESULT_VAL:.*]] = cir.ternary(%[[TMP_COND]], true {
668
+ // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[COMPLEX_A]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
669
+ // CIR: cir.yield %[[TMP_A]] : !cir.complex<!s32i>
670
+ // CIR: }, false {
671
+ // CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[COMPLEX_B]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
672
+ // CIR: cir.yield %[[TMP_B]] : !cir.complex<!s32i>
673
+ // CIR: }) : (!cir.bool) -> !cir.complex<!s32i>
674
+ // CIR: cir.store{{.*}} %[[RESULT_VAL]], %[[RESULT]] : !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
675
+
676
+ // LLVM: %[[COND:.*]] = alloca i8, i64 1, align 1
677
+ // LLVM: %[[COMPLEX_A:.*]] = alloca { i32, i32 }, i64 1, align 4
678
+ // LLVM: %[[COMPLEX_B:.*]] = alloca { i32, i32 }, i64 1, align 4
679
+ // LLVM: %[[RESULT:.*]] = alloca { i32, i32 }, i64 1, align 4
680
+ // LLVM: %[[TMP_COND:.*]] = load i8, ptr %[[COND]], align 1
681
+ // LLVM: %[[COND_VAL:.*]] = trunc i8 %[[TMP_COND]] to i1
682
+ // LLVM: br i1 %[[COND_VAL]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]
683
+ // LLVM: [[TRUE_BB]]:
684
+ // LLVM: %[[TMP_A:.*]] = load { i32, i32 }, ptr %[[COMPLEX_A]], align 4
685
+ // LLVM: br label %[[END_BB:.*]]
686
+ // LLVM: [[FALSE_BB]]:
687
+ // LLVM: %[[TMP_B:.*]] = load { i32, i32 }, ptr %[[COMPLEX_B]], align 4
688
+ // LLVM: br label %[[END_BB]]
689
+ // LLVM: [[END_BB]]:
690
+ // LLVM: %[[RESULT_VAL:.*]] = phi { i32, i32 } [ %[[TMP_B]], %[[FALSE_BB]] ], [ %[[TMP_A]], %[[TRUE_BB]] ]
691
+ // LLVM: store { i32, i32 } %[[RESULT_VAL]], ptr %[[RESULT]], align 4
692
+
693
+ // OGCG: %[[COMPLEX_A:.*]] = alloca { i32, i32 }, align 4
694
+ // OGCG: %[[COMPLEX_B:.*]] = alloca { i32, i32 }, align 4
695
+ // OGCG: %[[COND:.*]] = alloca i8, align 1
696
+ // OGCG: %[[RESULT:.*]] = alloca { i32, i32 }, align 4
697
+ // OGCG: %[[TMP_COND:.*]] = load i8, ptr %[[COND]], align 1
698
+ // OGCG: %[[COND_VAL:.*]] = trunc i8 %[[TMP_COND]] to i1
699
+ // OGCG: br i1 %[[COND_VAL]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]
700
+ // OGCG: [[TRUE_BB]]:
701
+ // OGCG: %[[A_REAL_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_A]], i32 0, i32 0
702
+ // OGCG: %[[A_REAL:.*]] = load i32, ptr %[[A_REAL_PTR]], align 4
703
+ // OGCG: %[[A_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_A]], i32 0, i32 1
704
+ // OGCG: %[[A_IMAG:.*]] = load i32, ptr %[[A_IMAG_PTR]], align 4
705
+ // OGCG: br label %[[END_BB:.*]]
706
+ // OGCG: [[FALSE_BB]]:
707
+ // OGCG: %[[B_REAL_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_B]], i32 0, i32 0
708
+ // OGCG: %[[B_REAL:.*]] = load i32, ptr %[[B_REAL_PTR]], align 4
709
+ // OGCG: %[[B_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_B]], i32 0, i32 1
710
+ // OGCG: %[[B_IMAG:.*]] = load i32, ptr %[[B_IMAG_PTR]], align 4
711
+ // OGCG: br label %[[END_BB]]
712
+ // OGCG: [[END_BB]]:
713
+ // OGCG: %[[REAL:.*]] = phi i32 [ %[[A_REAL]], %[[TRUE_BB]] ], [ %[[B_REAL]], %[[FALSE_BB]] ]
714
+ // OGCG: %[[IMAG:.*]] = phi i32 [ %[[A_IMAG]], %[[TRUE_BB]] ], [ %[[B_IMAG]], %[[FALSE_BB]] ]
715
+ // OGCG: %[[RESULT_REAL_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[RESULT]], i32 0, i32 0
716
+ // OGCG: %[[RESULT_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[RESULT]], i32 0, i32 1
717
+ // OGCG: store i32 %[[REAL]], ptr %[[RESULT_REAL_PTR]], align 4
718
+ // OGCG: store i32 %[[IMAG]], ptr %[[RESULT_IMAG_PTR]], align 4
719
+
658
720
void foo29 () {
659
721
using IntComplex = int _Complex ;
660
722
int _Complex a = IntComplex{};
@@ -671,4 +733,4 @@ void foo29() {
671
733
// OGCG: %[[INIT_REAL_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[INIT]], i32 0, i32 0
672
734
// OGCG: %[[INIT_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[INIT]], i32 0, i32 1
673
735
// OGCG: store i32 0, ptr %[[INIT_REAL_PTR]], align 4
674
- // OGCG: store i32 0, ptr %[[INIT_IMAG_PTR]], align 4
736
+ // OGCG: store i32 0, ptr %[[INIT_IMAG_PTR]], align 4
0 commit comments