[clang] [CIR] Implement CXXRewrittenBinaryOperator for ComplexExpr (PR #204670)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 23 10:12:19 PDT 2026
================
@@ -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
More information about the cfe-commits
mailing list