@@ -853,3 +853,59 @@ void foo32() {
853
853
// OGCG: %[[REAL_ADDR:.*]] = alloca i32, align 4
854
854
// OGCG: %[[REAL:.*]] = load i32, ptr @_ZN9Container1cE, align 4
855
855
// OGCG: store i32 %[[REAL]], ptr %[[REAL_ADDR]], align 4
856
+
857
+ void foo33 (__builtin_va_list a) {
858
+ float _Complex b = __builtin_va_arg (a, float _Complex );
859
+ }
860
+
861
+ // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.ptr<!rec___va_list_tag>, !cir.ptr<!cir.ptr<!rec___va_list_tag>>, ["a", init]
862
+ // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.complex<!cir.float>, !cir.ptr<!cir.complex<!cir.float>>, ["b", init]
863
+ // CIR: cir.store %[[ARG_0:.*]], %[[A_ADDR]] : !cir.ptr<!rec___va_list_tag>, !cir.ptr<!cir.ptr<!rec___va_list_tag>>
864
+ // CIR: %[[VA_TAG:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.ptr<!rec___va_list_tag>>, !cir.ptr<!rec___va_list_tag>
865
+ // CIR: %[[COMPLEX:.*]] = cir.va_arg %[[VA_TAG]] : (!cir.ptr<!rec___va_list_tag>) -> !cir.complex<!cir.float>
866
+ // CIR: cir.store{{.*}} %[[COMPLEX]], %[[B_ADDR]] : !cir.complex<!cir.float>, !cir.ptr<!cir.complex<!cir.float>>
867
+
868
+ // LLVM: %[[A_ADDR:.*]] = alloca ptr, i64 1, align 8
869
+ // LLVM: %[[B_ADDR:.*]] = alloca { float, float }, i64 1, align 4
870
+ // LLVM: store ptr %[[ARG_0:.*]], ptr %[[A_ADDR]], align 8
871
+ // LLVM: %[[TMP_A:.*]] = load ptr, ptr %[[A_ADDR]], align 8
872
+ // LLVM: %[[COMPLEX:.*]] = va_arg ptr %[[TMP_A]], { float, float }
873
+ // LLVM: store { float, float } %[[COMPLEX]], ptr %[[B_ADDR]], align 4
874
+
875
+ // TODO(CIR): the difference between the CIR LLVM and OGCG is because the lack of calling convention lowering,
876
+ // Test will be updated when that is implemented
877
+
878
+ // OGCG: %[[A_ADDR:.*]] = alloca ptr, align 8
879
+ // OGCG: %[[B_ADDR:.*]] = alloca { float, float }, align 4
880
+ // OGCG: store ptr %[[ARG_0:.*]], ptr %[[A_ADDR]], align 8
881
+ // OGCG: %[[TMP_A:.*]] = load ptr, ptr %[[A_ADDR]], align 8
882
+ // OGCG: %[[GP_OFFSET_PTR:.*]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %[[TMP_A]], i32 0, i32 1
883
+ // OGCG: %[[GP_OFFSET:.*]] = load i32, ptr %[[GP_OFFSET_PTR]], align 4
884
+ // OGCG: %[[COND:.*]] = icmp ule i32 %[[GP_OFFSET]], 160
885
+ // OGCG: br i1 %[[COND]], label %[[VA_ARG_IN_REG:.*]], label %[[VA_ARG_IN_MEM:.*]]
886
+ //
887
+ // OGCG: [[VA_ARG_IN_REG]]:
888
+ // OGCG: %[[REG_SAVE_PTR:.*]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %[[TMP_A]], i32 0, i32 3
889
+ // OGCG: %[[REG_SAVE:.*]] = load ptr, ptr %[[REG_SAVE_PTR]], align 8
890
+ // OGCG: %[[VA_ADDR:..*]] = getelementptr i8, ptr %[[REG_SAVE]], i32 %[[GP_OFFSET]]
891
+ // OGCG: %[[GP_OFFSET_NEXT:.*]] = add i32 %[[GP_OFFSET]], 16
892
+ // OGCG: store i32 %[[GP_OFFSET_NEXT]], ptr %[[GP_OFFSET_PTR]], align 4
893
+ // OGCG: br label %[[VA_ARG_END:.*]]
894
+ //
895
+ // OGCG: [[VA_ARG_IN_MEM]]:
896
+ // OGCG: %[[OVERFLOW_PTR:.*]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %[[TMP_A]], i32 0, i32 2
897
+ // OGCG: %[[OVERFLOW:.*]] = load ptr, ptr %[[OVERFLOW_PTR]], align 8
898
+ // OGCG: %[[OVERFLOW_NEXT:.*]] = getelementptr i8, ptr %[[OVERFLOW]], i32 8
899
+ // OGCG: store ptr %[[OVERFLOW_NEXT]], ptr %[[OVERFLOW_PTR]], align 8
900
+ // OGCG: br label %[[VA_ARG_END]]
901
+ //
902
+ // OGCG: [[VA_ARG_END]]:
903
+ // OGCG: %[[RESULT:.*]] = phi ptr [ %[[VA_ADDR]], %[[VA_ARG_IN_REG]] ], [ %[[OVERFLOW]], %[[VA_ARG_IN_MEM]] ]
904
+ // OGCG: %[[RESULT_REAL_PTR:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[RESULT]], i32 0, i32 0
905
+ // OGCG: %[[RESULT_REAL:.*]] = load float, ptr %[[RESULT_REAL_PTR]], align 4
906
+ // OGCG: %[[RESULT_IMAG_PTR:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[RESULT]], i32 0, i32 1
907
+ // OGCG: %[[RESULT_IMAG:.*]] = load float, ptr %[[RESULT_IMAG_PTR]], align 4
908
+ // OGCG: %[[B_REAL_PTR:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[B_ADDR]], i32 0, i32 0
909
+ // OGCG: %[[B_IMAG_PTR:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[B_ADDR]], i32 0, i32 1
910
+ // OGCG: store float %[[RESULT_REAL]], ptr %[[B_REAL_PTR]], align 4
911
+ // OGCG: store float %[[RESULT_IMAG]], ptr %[[B_IMAG_PTR]], align 4
0 commit comments