================
@@ -37,3 +37,53 @@ void cxx_rewritten_binary_operator_scalar_expr() {
// OGCG: %[[NEQ_I1:.*]] = xor i1 %[[EQ]], true
// OGCG: %[[NEQ:.*]] = zext i1 %[[NEQ_I1]] to i8
// OGCG: store i8 %[[NEQ]], ptr %[[NEQ_ADDR]], align 1
+
+struct SpaceshipComplexResult {
+ int _Complex operator<(int) const { return {}; }
+};
+
+struct ComplexItem {
+ SpaceshipComplexResult operator<=>(const ComplexItem &) const { return {}; }
+};
+
+void cxx_rewritten_binary_operator_complex_expr() {
+ ComplexItem a;
+ ComplexItem b;
+ int _Complex r = a < b;
+}
+
+// CIR: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} : !cir.ptr<!rec_ComplexItem>
+// CIR: %[[B_ADDR:.*]] = cir.alloca "b" {{.*}} : !cir.ptr<!rec_ComplexItem>
+// CIR: %[[R_ADDR:.*]] = cir.alloca "r" {{.*}} init :
!cir.ptr<!cir.complex<!s32i>>
+// CIR: %[[TMP_ADDR:.*]] = cir.alloca "ref.tmp0" {{.*}} :
!cir.ptr<!rec_SpaceshipComplexResult>
+// CIR: %[[OP_RESULT:.*]] = cir.call @_ZNK11ComplexItemssERKS_(%[[A_ADDR]],
%[[B_ADDR]]) : (!cir.ptr<!rec_ComplexItem> {llvm.align = 1 : i64,
llvm.dereferenceable = 1 : i64, llvm.nonnull, llvm.noundef},
!cir.ptr<!rec_ComplexItem> {llvm.align = 1 : i64, llvm.dereferenceable = 1 :
i64, llvm.nonnull, llvm.noundef}) -> !rec_SpaceshipComplexResult
+// CIR: cir.store {{.*}} %[[OP_RESULT]], %[[TMP_ADDR]] :
!rec_SpaceshipComplexResult, !cir.ptr<!rec_SpaceshipComplexResult>
+// CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i
+// CIR: %[[RESULT:.*]] = cir.call
@_ZNK22SpaceshipComplexResultltEi(%[[TMP_ADDR]], %[[CONST_0]]) :
(!cir.ptr<!rec_SpaceshipComplexResult> {llvm.align = 1 : i64,
llvm.dereferenceable = 1 : i64, llvm.nonnull, llvm.noundef}, !s32i
{llvm.noundef}) -> (!cir.complex<!s32i> {llvm.noundef})
+// CIR: cir.store {{.*}} %[[RESULT]], %[[R_ADDR]] : !cir.complex<!s32i>,
!cir.ptr<!cir.complex<!s32i>>
+
+// LLVM: %[[A_ADDR:.*]] = alloca %struct.ComplexItem, i64 1, align 1
+// LLVM: %[[B_ADDR:.*]] = alloca %struct.ComplexItem, i64 1, align 1
+// LLVM: %[[R_ADDR:.*]] = alloca { i32, i32 }, i64 1, align 4
+// LLVM: %[[TMP_ADDR:.*]] = alloca %struct.SpaceshipComplexResult, i64 1,
align 1
+// LLVM: %[[OP_RESULT:.*]] = call %struct.SpaceshipComplexResult
@_ZNK11ComplexItemssERKS_(ptr noundef nonnull align 1 dereferenceable(1)
%[[A_ADDR]], ptr noundef nonnull align 1 dereferenceable(1) %[[B_ADDR]])
----------------
AmrDeveloper wrote:
I can add a comment about that in the test
https://github.com/llvm/llvm-project/pull/204670
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits