@@ -61,3 +61,27 @@ void complex_abstract_condition(bool cond, int _Complex a, int _Complex b) {
61
61
// LLVM: [[END_BB]]:
62
62
// LLVM: %[[RESULT_VAL:.*]] = phi { i32, i32 } [ %[[TMP_B]], %[[FALSE_BB]] ], [ %[[TMP_A]], %[[TRUE_BB]] ]
63
63
// LLVM: store { i32, i32 } %[[RESULT_VAL]], ptr %[[RESULT]], align 4
64
+
65
+ int _Complex complex_real_operator_on_rvalue () {
66
+ int real = __real__ complex_real_operator_on_rvalue ();
67
+ return {};
68
+ }
69
+
70
+ // CIR: %[[RET_ADDR:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["__retval"]
71
+ // CIR: %[[REAL_ADDR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["real", init]
72
+ // CIR: %[[CALL:.*]] = cir.call @_Z31complex_real_operator_on_rvaluev() : () -> !cir.complex<!s32i>
73
+ // CIR: %[[REAL:.*]] = cir.complex.real %[[CALL]] : !cir.complex<!s32i> -> !s32i
74
+ // CIR: cir.store{{.*}} %[[REAL]], %[[REAL_ADDR]] : !s32i, !cir.ptr<!s32i>
75
+ // CIR: %[[RET_COMPLEX:.*]] = cir.const #cir.complex<#cir.int<0> : !s32i, #cir.int<0> : !s32i> : !cir.complex<!s32i>
76
+ // CIR: cir.store{{.*}} %[[RET_COMPLEX]], %[[RET_ADDR]] : !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
77
+ // CIR: %[[TMP_RET:.*]] = cir.load %[[RET_ADDR]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
78
+ // CIR: cir.return %[[TMP_RET]] : !cir.complex<!s32i>
79
+
80
+ // LLVM: %[[RET_ADDR:.*]] = alloca { i32, i32 }, i64 1, align 4
81
+ // LLVM: %[[REAL_ADDR:.*]] = alloca i32, i64 1, align 4
82
+ // LLVM: %[[CALL:.*]] = call { i32, i32 } @_Z31complex_real_operator_on_rvaluev()
83
+ // LLVM: %[[REAL:.*]] = extractvalue { i32, i32 } %[[CALL]], 0
84
+ // LLVM: store i32 %[[REAL]], ptr %[[REAL_ADDR]], align 4
85
+ // LLVM: store { i32, i32 } zeroinitializer, ptr %[[RET_ADDR]], align 4
86
+ // LLVM: %[[TMP_RET:.*]] = load { i32, i32 }, ptr %[[RET_ADDR]], align 4
87
+ // LLVM: ret { i32, i32 } %[[TMP_RET]]
0 commit comments