https://github.com/amanmaurya92 updated 
https://github.com/llvm/llvm-project/pull/223888

>From ef4c8abdf9a1252e11f4efa10a93904f01618e57 Mon Sep 17 00:00:00 2001
From: amanmaurya92 <[email protected]>
Date: Wed, 16 Sep 2026 06:07:24 +0530
Subject: [PATCH 1/2] [CIR] Implement CXXRewrittenBinaryOperator for LValue

Support CXXRewrittenBinaryOperator in emitLValue via getSemanticForm().

Fixes #223743

Formatted with Gemini
---
 clang/lib/CIR/CodeGen/CIRGenFunction.cpp      |  4 +-
 .../CodeGen/cxx-rewritten-binary-operator.cpp | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp 
b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
index 80525339bd7a6..66b528cf40c54 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
@@ -1212,9 +1212,7 @@ LValue CIRGenFunction::emitLValue(const Expr *e) {
   case Expr::UserDefinedLiteralClass:
     return emitCallExprLValue(cast<CallExpr>(e));
   case Expr::CXXRewrittenBinaryOperatorClass:
-    getCIRGenModule().errorNYI(e->getSourceRange(),
-                               "emitLValue: CXXRewrittenBinaryOperator");
-    return LValue();
+    return emitLValue(cast<CXXRewrittenBinaryOperator>(e)->getSemanticForm());
   case Expr::VAArgExprClass:
     getCIRGenModule().errorNYI(e->getSourceRange(), "emitLValue: VAArgExpr");
     return LValue();
diff --git a/clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp 
b/clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp
index e4427441cb2c9..8b18873434132 100644
--- a/clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp
+++ b/clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp
@@ -148,3 +148,45 @@ void cxx_rewritten_binary_operator_aggr_expr() {
 // OGCG: %[[RESULT:.*]] = call i32 @_ZNK15SpaceshipResultltEi(ptr noundef 
nonnull align 1 dereferenceable(1) %[[TMP_ADDR]], i32 noundef 0)
 // OGCG: %[[R_ADDR_PTR:.*]] = getelementptr inbounds nuw %struct.Result, ptr 
%[[R_ADDR:.*]], i32 0, i32 0
 // OGCG: store i32 %[[RESULT:.*]], ptr %[[R_ADDR_PTR]], align 4
+
+struct SpaceshipLValueResult {
+  int &operator<(int) const;
+};
+
+struct LValueItem {
+  SpaceshipLValueResult operator<=>(const LValueItem &) const;
+};
+
+void cxx_rewritten_binary_operator_lvalue_expr() {
+  LValueItem a;
+  LValueItem b;
+  int &ref = (a < b);
+}
+
+// CIR: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} : !cir.ptr<!rec_LValueItem>
+// CIR: %[[B_ADDR:.*]] = cir.alloca "b" {{.*}} : !cir.ptr<!rec_LValueItem>
+// CIR: %[[REF_ADDR:.*]] = cir.alloca "ref" {{.*}} init : 
!cir.ptr<!cir.ptr<!s32i>>
+// CIR: %[[TMP_ADDR:.*]] = cir.alloca "ref.tmp0" {{.*}} : 
!cir.ptr<!rec_SpaceshipLValueResult>
+// CIR: cir.call @_ZNK10LValueItemssERKS_(%[[A_ADDR]], %[[B_ADDR]]) : 
(!cir.ptr<!rec_LValueItem> {llvm.align = 1 : i64, llvm.dereferenceable = 1 : 
i64, llvm.nonnull, llvm.noundef}, !cir.ptr<!rec_LValueItem> {llvm.align = 1 : 
i64, llvm.dereferenceable = 1 : i64, llvm.nonnull, llvm.noundef}) -> ()
+// CIR: %[[OP_RESULT:.*]] = cir.const #cir.poison : !rec_SpaceshipLValueResult
+// CIR: cir.store {{.*}} %[[OP_RESULT]], %[[TMP_ADDR]] : 
!rec_SpaceshipLValueResult, !cir.ptr<!rec_SpaceshipLValueResult>
+// CIR: %[[CONST_0:.*]] = cir.const #cir.int<0> : !s32i
+// CIR: %[[RESULT:.*]] = cir.call 
@_ZNK21SpaceshipLValueResultltEi(%[[TMP_ADDR]], %[[CONST_0]]) : 
(!cir.ptr<!rec_SpaceshipLValueResult> {llvm.align = 1 : i64, 
llvm.dereferenceable = 1 : i64, llvm.nonnull, llvm.noundef}, !s32i 
{llvm.noundef}) -> !cir.ptr<!s32i>
+// CIR: cir.store %[[RESULT]], %[[REF_ADDR]] : !cir.ptr<!s32i>, 
!cir.ptr<!cir.ptr<!s32i>>
+
+// LLVM: %[[A_ADDR:.*]] = alloca %struct.LValueItem, align 1
+// LLVM: %[[B_ADDR:.*]] = alloca %struct.LValueItem, align 1
+// LLVM: %[[REF_ADDR:.*]] = alloca ptr, align 8
+// LLVM: %[[TMP_ADDR:.*]] = alloca %struct.SpaceshipLValueResult, align 1
+// LLVM: call void @_ZNK10LValueItemssERKS_(ptr noundef nonnull align 1 
dereferenceable(1) %[[A_ADDR]], ptr noundef nonnull align 1 dereferenceable(1) 
%[[B_ADDR]])
+// LLVM: store %struct.SpaceshipLValueResult poison, ptr %[[TMP_ADDR]], align 1
+// LLVM: %[[RESULT:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr 
@_ZNK21SpaceshipLValueResultltEi(ptr noundef nonnull align 1 dereferenceable(1) 
%[[TMP_ADDR]], i32 noundef 0)
+// LLVM: store ptr %[[RESULT]], ptr %[[REF_ADDR]], align 8
+
+// OGCG: %[[A_ADDR:.*]] = alloca %struct.LValueItem, align 1
+// OGCG: %[[B_ADDR:.*]] = alloca %struct.LValueItem, align 1
+// OGCG: %[[REF_ADDR:.*]] = alloca ptr, align 8
+// OGCG: %[[TMP_ADDR:.*]] = alloca %struct.SpaceshipLValueResult, align 1
+// OGCG: call void @_ZNK10LValueItemssERKS_(ptr noundef nonnull align 1 
dereferenceable(1) %[[A_ADDR]], ptr noundef nonnull align 1 dereferenceable(1) 
%[[B_ADDR]])
+// OGCG: %[[RESULT:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr 
@_ZNK21SpaceshipLValueResultltEi(ptr noundef nonnull align 1 dereferenceable(1) 
%[[TMP_ADDR]], i32 noundef 0)
+// OGCG: store ptr %[[RESULT]], ptr %[[REF_ADDR]], align 8

>From dce64ac7081d6d2f3569afd9cf8ea2a2dc7b6b13 Mon Sep 17 00:00:00 2001
From: amanmaurya92 <[email protected]>
Date: Wed, 16 Sep 2026 13:42:33 +0530
Subject: [PATCH 2/2] [CIR][test] Fix reference alloca FileCheck expectation in
 cxx-rewritten-binary-operator.cpp

ClangIR marks reference alloca with 'init const'. Update the FileCheck line 
accordingly.

Formatted with Gemini
---
 clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp 
b/clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp
index 8b18873434132..bc76890dfa592 100644
--- a/clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp
+++ b/clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp
@@ -165,7 +165,7 @@ void cxx_rewritten_binary_operator_lvalue_expr() {
 
 // CIR: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} : !cir.ptr<!rec_LValueItem>
 // CIR: %[[B_ADDR:.*]] = cir.alloca "b" {{.*}} : !cir.ptr<!rec_LValueItem>
-// CIR: %[[REF_ADDR:.*]] = cir.alloca "ref" {{.*}} init : 
!cir.ptr<!cir.ptr<!s32i>>
+// CIR: %[[REF_ADDR:.*]] = cir.alloca "ref" {{.*}} init const : 
!cir.ptr<!cir.ptr<!s32i>>
 // CIR: %[[TMP_ADDR:.*]] = cir.alloca "ref.tmp0" {{.*}} : 
!cir.ptr<!rec_SpaceshipLValueResult>
 // CIR: cir.call @_ZNK10LValueItemssERKS_(%[[A_ADDR]], %[[B_ADDR]]) : 
(!cir.ptr<!rec_LValueItem> {llvm.align = 1 : i64, llvm.dereferenceable = 1 : 
i64, llvm.nonnull, llvm.noundef}, !cir.ptr<!rec_LValueItem> {llvm.align = 1 : 
i64, llvm.dereferenceable = 1 : i64, llvm.nonnull, llvm.noundef}) -> ()
 // CIR: %[[OP_RESULT:.*]] = cir.const #cir.poison : !rec_SpaceshipLValueResult

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to