@@ -216,6 +216,30 @@ void foo9(double a, double b) {
216
216
// OGCG: store double %[[TMP_A]], ptr %[[C_REAL_PTR]], align 8
217
217
// OGCG: store double %[[TMP_B]], ptr %[[C_IMAG_PTR]], align 8
218
218
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
+
219
243
void foo14 () {
220
244
int _Complex c = 2i;
221
245
}
@@ -256,3 +280,36 @@ void foo15() {
256
280
// OGCG: %[[B_IMAG_PTR:.*]] = getelementptr inbounds nuw { i32, i32 }, ptr %[[COMPLEX_B]], i32 0, i32 1
257
281
// OGCG: store i32 %[[A_REAL]], ptr %[[B_REAL_PTR]], align 4
258
282
// 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