@@ -344,26 +344,55 @@ void extract_imag() {
344
344
345
345
// CHECK-BEFORE: cir.func
346
346
// CHECK-BEFORE: %[[#C_PTR:]] = cir.get_global @c : !cir.ptr<!cir.complex<!cir.double>>
347
- // CHECK-BEFORE-NEXT: %[[#IMAG_PTR: ]] = cir.complex.imag_ptr %[[#C_PTR]] : !cir.ptr<!cir.complex<!cir.double>> -> !cir.ptr <!cir.double>
348
- // CHECK-BEFORE-NEXT: %{{.+}} = cir.load{{.*}} %[[#IMAG_PTR ]] : !cir.ptr <!cir.double>, !cir.double
347
+ // CHECK-BEFORE-NEXT: %[[COMPLEX:.* ]] = cir.load{{.*}} %[[#C_PTR]] : !cir.ptr<!cir.complex<!cir.double>>, !cir.complex <!cir.double>
348
+ // CHECK-BEFORE-NEXT: %[[#IMAG:]] = cir.complex.imag %[[COMPLEX ]] : !cir.complex <!cir.double> -> !cir.double
349
349
// CHECK-BEFORE: %[[#CI_PTR:]] = cir.get_global @ci : !cir.ptr<!cir.complex<!s32i>>
350
- // CHECK-BEFORE-NEXT: %[[#IMAG_PTR: ]] = cir.complex.imag_ptr %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>> -> !cir.ptr <!s32i>
351
- // CHECK-BEFORE-NEXT: %{{.+}} = cir.load{{.*}} %[[#IMAG_PTR ]] : !cir.ptr <!s32i>, !s32i
350
+ // CHECK-BEFORE-NEXT: %[[COMPLEX:.* ]] = cir.load{{.*}} %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex <!s32i>
351
+ // CHECK-BEFORE-NEXT: %[[#IMAG:]] = cir.complex.imag %[[COMPLEX ]] : !cir.complex <!s32i> -> !s32i
352
352
// CHECK-BEFORE: }
353
353
354
354
// CHECK-AFTER: cir.func
355
355
// CHECK-AFTER: %[[#C_PTR:]] = cir.get_global @c : !cir.ptr<!cir.complex<!cir.double>>
356
- // CHECK-AFTER-NEXT: %[[#IMAG_PTR: ]] = cir.complex.imag_ptr %[[#C_PTR]] : !cir.ptr<!cir.complex<!cir.double>> -> !cir.ptr <!cir.double>
357
- // CHECK-AFTER-NEXT: %{{.+}} = cir.load{{.*}} %[[#IMAG_PTR ]] : !cir.ptr <!cir.double>, !cir.double
356
+ // CHECK-AFTER-NEXT: %[[COMPLEX:.* ]] = cir.load{{.*}} %[[#C_PTR]] : !cir.ptr<!cir.complex<!cir.double>>, !cir.complex <!cir.double>
357
+ // CHECK-AFTER-NEXT: %[[#IMAG:]] = cir.complex.imag %[[COMPLEX ]] : !cir.complex <!cir.double> -> !cir.double
358
358
// CHECK-AFTER: %[[#CI_PTR:]] = cir.get_global @ci : !cir.ptr<!cir.complex<!s32i>>
359
- // CHECK-AFTER-NEXT: %[[#IMAG_PTR: ]] = cir.complex.imag_ptr %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>> -> !cir.ptr <!s32i>
360
- // CHECK-AFTER-NEXT: %{{.+}} = cir.load{{.*}} %[[#IMAG_PTR ]] : !cir.ptr <!s32i>, !s32i
359
+ // CHECK-AFTER-NEXT: %[[COMPLEX:.* ]] = cir.load{{.*}} %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex <!s32i>
360
+ // CHECK-AFTER-NEXT: %[[#IMAG:]] = cir.complex.imag %[[COMPLEX ]] : !cir.complex <!s32i> -> !s32i
361
361
// CHECK-AFTER: }
362
362
363
- // Note: GEP emitted by cir might not be the same as LLVM, due to constant folding.
364
363
// LLVM: define dso_local void @extract_imag()
365
- // LLVM: %{{.+}} = load double, ptr getelementptr inbounds nuw (i8, ptr @c, i64 8), align 8
366
- // LLVM: %{{.+}} = load i32, ptr getelementptr inbounds nuw (i8, ptr @ci, i64 4), align 4
364
+ // LLVM: %[[COMPLEX_D:.*]] = load { double, double }, ptr @c, align 8
365
+ // LLVM: %[[I1:.*]] = extractvalue { double, double } %[[COMPLEX_D]], 1
366
+ // LLVM: %[[COMPLEX_I:.*]] = load { i32, i32 }, ptr @ci, align 4
367
+ // LLVM: %[[I2:.*]] = extractvalue { i32, i32 } %[[COMPLEX_I]], 1
368
+ // LLVM: }
369
+
370
+ int extract_imag_and_add (int _Complex a , int _Complex b ) {
371
+ return __imag__ a + __imag__ b ;
372
+ }
373
+
374
+ // CHECK-BEFORE: cir.func
375
+ // CHECK-BEFORE: %[[COMPLEX_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
376
+ // CHECK-BEFORE-NEXT: %[[IMAG_A:.*]] = cir.complex.imag %[[COMPLEX_A]] : !cir.complex<!s32i> -> !s32i
377
+ // CHECK-BEFORE-NEXT: %[[COMPLEX_B:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
378
+ // CHECK-BEFORE-NEXT: %[[IMAG_B:.*]] = cir.complex.imag %[[COMPLEX_B]] : !cir.complex<!s32i> -> !s32i
379
+ // CHECK-BEFORE-NEXT: %[[ADD:.*]] = cir.binop(add, %[[IMAG_A]], %[[IMAG_B]]) nsw : !s32i
380
+ // CHECK-BEFORE: }
381
+
382
+ // CHECK-AFTER: cir.func
383
+ // CHECK-AFTER: %[[COMPLEX_A:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
384
+ // CHECK-AFTER-NEXT: %[[IMAG_A:.*]] = cir.complex.imag %[[COMPLEX_A]] : !cir.complex<!s32i> -> !s32i
385
+ // CHECK-AFTER-NEXT: %[[COMPLEX_B:.*]] = cir.load{{.*}} {{.*}} : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
386
+ // CHECK-AFTER-NEXT: %[[IMAG_B:.*]] = cir.complex.imag %[[COMPLEX_B]] : !cir.complex<!s32i> -> !s32i
387
+ // CHECK-AFTER-NEXT: %[[ADD:.*]] = cir.binop(add, %[[IMAG_A]], %[[IMAG_B]]) nsw : !s32i
388
+ // CHECK-AFTER: }
389
+
390
+ // LLVM: define dso_local i32 @extract_imag_and_add
391
+ // LLVM: %[[COMPLEX_A:.*]] = load { i32, i32 }, ptr {{.*}}, align 4
392
+ // LLVM: %[[IMAG_A:.*]] = extractvalue { i32, i32 } %[[COMPLEX_A]], 1
393
+ // LLVM: %[[COMPLEX_B:.*]] = load { i32, i32 }, ptr {{.*}}, align 4
394
+ // LLVM: %[[IMAG_B:.*]] = extractvalue { i32, i32 } %[[COMPLEX_B]], 1
395
+ // LLVM: %10 = add nsw i32 %[[IMAG_A]], %[[IMAG_B]]
367
396
// LLVM: }
368
397
369
398
void complex_with_empty_init () { int _Complex c = {}; }
0 commit comments