@@ -261,25 +261,55 @@ void extract_real() {
261
261
262
262
// CHECK-BEFORE: cir.func
263
263
// CHECK-BEFORE: %[[#C_PTR:]] = cir.get_global @c : !cir.ptr<!cir.complex<!cir.double>>
264
- // CHECK-BEFORE-NEXT: %[[#REAL_PTR: ]] = cir.complex.real_ptr %[[#C_PTR]] : !cir.ptr<!cir.complex<!cir.double>> -> !cir.ptr <!cir.double>
265
- // CHECK-BEFORE-NEXT: %{{.+}} = cir.load{{.*}} %[[#REAL_PTR ]] : !cir.ptr <!cir.double>, !cir.double
264
+ // CHECK-BEFORE-NEXT: %[[COMPLEX:.* ]] = cir.load{{.*}} %[[#C_PTR]] : !cir.ptr<!cir.complex<!cir.double>>, !cir.complex <!cir.double>
265
+ // CHECK-BEFORE-NEXT: %[[#REAL:]] = cir.complex.real %[[COMPLEX ]] : !cir.complex <!cir.double> -> !cir.double
266
266
// CHECK-BEFORE: %[[#CI_PTR:]] = cir.get_global @ci : !cir.ptr<!cir.complex<!s32i>>
267
- // CHECK-BEFORE-NEXT: %[[#REAL_PTR: ]] = cir.complex.real_ptr %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>> -> !cir.ptr <!s32i>
268
- // CHECK-BEFORE-NEXT: %{{.+}} = cir.load{{.*}} %[[#REAL_PTR ]] : !cir.ptr <!s32i>, !s32i
267
+ // CHECK-BEFORE-NEXT: %[[COMPLEX:.* ]] = cir.load{{.*}} %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex <!s32i>
268
+ // CHECK-BEFORE-NEXT: %[[#REAL:]] = cir.complex.real %[[COMPLEX ]] : !cir.complex <!s32i> -> !s32i
269
269
// CHECK-BEFORE: }
270
270
271
271
// CHECK-AFTER: cir.func
272
272
// CHECK-AFTER: %[[#C_PTR:]] = cir.get_global @c : !cir.ptr<!cir.complex<!cir.double>>
273
- // CHECK-AFTER-NEXT: %[[#REAL_PTR: ]] = cir.complex.real_ptr %[[#C_PTR]] : !cir.ptr<!cir.complex<!cir.double>> -> !cir.ptr <!cir.double>
274
- // CHECK-AFTER-NEXT: %{{.+}} = cir.load{{.*}} %[[#REAL_PTR ]] : !cir.ptr <!cir.double>, !cir.double
273
+ // CHECK-AFTER-NEXT: %[[COMPLEX:.* ]] = cir.load{{.*}} %[[#C_PTR]] : !cir.ptr<!cir.complex<!cir.double>>, !cir.complex <!cir.double>
274
+ // CHECK-AFTER-NEXT: %[[#REAL:]] = cir.complex.real %[[COMPLEX ]] : !cir.complex <!cir.double> -> !cir.double
275
275
// CHECK-AFTER: %[[#CI_PTR:]] = cir.get_global @ci : !cir.ptr<!cir.complex<!s32i>>
276
- // CHECK-AFTER-NEXT: %[[#REAL_PTR: ]] = cir.complex.real_ptr %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>> -> !cir.ptr <!s32i>
277
- // CHECK-AFTER-NEXT: %{{.+}} = cir.load{{.*}} %[[#REAL_PTR ]] : !cir.ptr <!s32i>, !s32i
276
+ // CHECK-AFTER-NEXT: %[[COMPLEX:.* ]] = cir.load{{.*}} %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex <!s32i>
277
+ // CHECK-AFTER-NEXT: %[[#REAL:]] = cir.complex.real %[[COMPLEX ]] : !cir.complex <!s32i> -> !s32i
278
278
// CHECK-AFTER: }
279
279
280
280
// LLVM: define dso_local void @extract_real()
281
- // LLVM: %{{.+}} = load double, ptr @c, align 8
282
- // LLVM: %{{.+}} = load i32, ptr @ci, align 4
281
+ // LLVM: %[[COMPLEX_D:.*]] = load { double, double }, ptr @c, align 8
282
+ // LLVM: %[[R1:.*]] = extractvalue { double, double } %[[COMPLEX_D]], 0
283
+ // LLVM: %[[COMPLEX_I:.*]] = load { i32, i32 }, ptr @ci, align 4
284
+ // LLVM: %[[R2:.*]] = extractvalue { i32, i32 } %[[COMPLEX_I]], 0
285
+ // LLVM: }
286
+
287
+ int extract_real_and_add (int _Complex a , int _Complex b ) {
288
+ return __real__ a + __real__ b ;
289
+ }
290
+
291
+ // CHECK-BEFORE: cir.func
292
+ // CHECK-BEFORE: %[[COMPLEX_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
293
+ // CHECK-BEFORE-NEXT: %[[REAL_A:.*]] = cir.complex.real %[[COMPLEX_A]] : !cir.complex<!s32i> -> !s32i
294
+ // CHECK-BEFORE-NEXT: %[[COMPLEX_B:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
295
+ // CHECK-BEFORE-NEXT: %[[REAL_B:.*]] = cir.complex.real %[[COMPLEX_B]] : !cir.complex<!s32i> -> !s32i
296
+ // CHECK-BEFORE-NEXT: %[[ADD:.*]] = cir.binop(add, %[[REAL_A]], %[[REAL_B]]) nsw : !s32i
297
+ // CHECK-BEFORE: }
298
+
299
+ // CHECK-AFTER: cir.func
300
+ // CHECK-AFTER: %[[COMPLEX_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
301
+ // CHECK-AFTER-NEXT: %[[REAL_A:.*]] = cir.complex.real %[[COMPLEX_A]] : !cir.complex<!s32i> -> !s32i
302
+ // CHECK-AFTER-NEXT: %[[COMPLEX_B:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
303
+ // CHECK-AFTER-NEXT: %[[REAL_B:.*]] = cir.complex.real %[[COMPLEX_B]] : !cir.complex<!s32i> -> !s32i
304
+ // CHECK-AFTER-NEXT: %[[ADD:.*]] = cir.binop(add, %[[REAL_A]], %[[REAL_B]]) nsw : !s32i
305
+ // CHECK-AFTER: }
306
+
307
+ // LLVM: define dso_local i32 @extract_real_and_add
308
+ // LLVM: %[[COMPLEX_A:.*]] = load { i32, i32 }, ptr {{.*}}, align 4
309
+ // LLVM: %[[REAL_A:.*]] = extractvalue { i32, i32 } %[[COMPLEX_A]], 0
310
+ // LLVM: %[[COMPLEX_B:.*]] = load { i32, i32 }, ptr {{.*}}, align 4
311
+ // LLVM: %[[REAL_B:.*]] = extractvalue { i32, i32 } %[[COMPLEX_B]], 0
312
+ // LLVM: %10 = add nsw i32 %[[REAL_A]], %[[REAL_B]]
283
313
// LLVM: }
284
314
285
315
void imag_ptr () {
0 commit comments