@@ -216,6 +216,30 @@ void foo9(double a, double b) {
216216// OGCG: store double %[[TMP_A]], ptr %[[C_REAL_PTR]], align 8
217217// OGCG: store double %[[TMP_B]], ptr %[[C_IMAG_PTR]], align 8
218218
219+ void foo13 () {
220+ double _Complex c;
221+ double real = __real__ c;
222+ }
223+
224+ // CIR: %[[COMPLEX:.*]] = cir.alloca !cir.complex<!cir.double>, !cir.ptr<!cir.complex<!cir.double>>, ["c"]
225+ // CIR: %[[INIT:.*]] = cir.alloca !cir.double, !cir.ptr<!cir.double>, ["real", init]
226+ // CIR: %[[TMP:.*]] = cir.load{{.*}} %[[COMPLEX]] : !cir.ptr<!cir.complex<!cir.double>>, !cir.complex<!cir.double>
227+ // CIR: %[[REAL:.*]] = cir.complex.real %[[TMP]] : !cir.complex<!cir.double> -> !cir.double
228+ // CIR: cir.store{{.*}} %[[REAL]], %[[INIT]] : !cir.double, !cir.ptr<!cir.double>
229+
230+ // LLVM: %[[COMPLEX:.*]] = alloca { double, double }, i64 1, align 8
231+ // LLVM: %[[INIT:.*]] = alloca double, i64 1, align 8
232+ // LLVM: %[[TMP:.*]] = load { double, double }, ptr %[[COMPLEX]], align 8
233+ // LLVM: %[[REAL:.*]] = extractvalue { double, double } %[[TMP]], 0
234+ // LLVM: store double %[[REAL]], ptr %[[INIT]], align 8
235+
236+ // OGCG: %[[COMPLEX:.*]] = alloca { double, double }, align 8
237+ // OGCG: %[[INIT:.*]] = alloca double, align 8
238+ // OGCG: %[[REAL:.*]] = getelementptr inbounds nuw { double, double }, ptr %[[COMPLEX]], i32 0, i32 0
239+ // OGCG: %[[TMP:.*]] = load double, ptr %[[REAL]], align 8
240+ // OGCG: store double %[[TMP]], ptr %[[INIT]], align 8
241+
242+
219243void foo14 () {
220244 int _Complex c = 2i;
221245}
@@ -256,3 +280,36 @@ void foo15() {
256280// OGCG: %[[B_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_B]], i32 0, i32 1
257281// OGCG: store i32 %[[A_REAL]], ptr %[[B_REAL_PTR]], align 4
258282// OGCG: store i32 %[[A_IMAG]], ptr %[[B_IMAG_PTR]], align 4
283+
284+ int foo17 (int _Complex a, int _Complex b) {
285+ return __real__ a + __real__ b;
286+ }
287+
288+ // CIR: %[[RET:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
289+ // CIR: %[[COMPLEX_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
290+ // CIR: %[[A_REAL:.*]] = cir.complex.real %[[COMPLEX_A]] : !cir.complex<!s32i> -> !s32i
291+ // CIR: %[[COMPLEX_B:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
292+ // CIR: %[[B_REAL:.*]] = cir.complex.real %[[COMPLEX_B]] : !cir.complex<!s32i> -> !s32i
293+ // CIR: %[[ADD:.*]] = cir.binop(add, %[[A_REAL]], %[[B_REAL]]) nsw : !s32i
294+ // CIR: cir.store %[[ADD]], %[[RET]] : !s32i, !cir.ptr<!s32i>
295+ // CIR: %[[TMP:.*]] = cir.load %[[RET]] : !cir.ptr<!s32i>, !s32i
296+ // CIR: cir.return %[[TMP]] : !s32i
297+
298+ // LLVM: %[[RET:.*]] = alloca i32, i64 1, align 4
299+ // LLVM: %[[COMPLEX_A:.*]] = load { i32, i32 }, ptr {{.*}}, align 4
300+ // LLVM: %[[A_REAL:.*]] = extractvalue { i32, i32 } %[[COMPLEX_A]], 0
301+ // LLVM: %[[COMPLEX_B:.*]] = load { i32, i32 }, ptr {{.*}}, align 4
302+ // LLVM: %[[B_REAL:.*]] = extractvalue { i32, i32 } %[[COMPLEX_B]], 0
303+ // LLVM: %[[ADD:.*]] = add nsw i32 %[[A_REAL]], %[[B_REAL]]
304+ // LLVM: store i32 %[[ADD]], ptr %[[RET]], align 4
305+ // LLVM: %[[TMP:.*]] = load i32, ptr %[[RET]], align 4
306+ // LLVM: ret i32 %[[TMP]]
307+
308+ // OGCG: %[[COMPLEX_A:.*]] = alloca { i32, i32 }, align 4
309+ // OGCG: %[[COMPLEX_B:.*]] = alloca { i32, i32 }, align 4
310+ // OGCG: %[[A_REAL:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_A]], i32 0, i32 0
311+ // OGCG: %[[TMP_A:.*]] = load i32, ptr %[[A_REAL]], align 4
312+ // OGCG: %[[B_REAL:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_B]], i32 0, i32 0
313+ // OGCG: %[[TMP_B:.*]] = load i32, ptr %[[B_REAL]], align 4
314+ // OGCG: %[[ADD:.*]] = add nsw i32 %[[TMP_A]], %[[TMP_B]]
315+ // OGCG: ret i32 %[[ADD]]
0 commit comments