llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Erich Keane (erichkeane)
<details>
<summary>Changes</summary>
These two are very simple and call into the Rvalue code/LValue lowering code we
already had for these, but weren't exposed as top-level LValues. This patch
adds them to the list (plus adds a comment for those that
we're missing!), as well as adds a test.
---
Full diff: https://github.com/llvm/llvm-project/pull/182926.diff
2 Files Affected:
- (modified) clang/lib/CIR/CodeGen/CIRGenFunction.cpp (+5-1)
- (added) clang/test/CIR/CodeGenCXX/simple-reinterpret-const-cast.cpp (+44)
``````````diff
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
index cc4fa7abf4edf..38c4c9f0704e0 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
@@ -1071,10 +1071,14 @@ LValue CIRGenFunction::emitLValue(const Expr *e) {
return emitLValue(cast<GenericSelectionExpr>(e)->getResultExpr());
case Expr::DeclRefExprClass:
return emitDeclRefLValue(cast<DeclRefExpr>(e));
+ case Expr::ImplicitCastExprClass:
case Expr::CStyleCastExprClass:
case Expr::CXXStaticCastExprClass:
case Expr::CXXDynamicCastExprClass:
- case Expr::ImplicitCastExprClass:
+ case Expr::CXXReinterpretCastExprClass:
+ case Expr::CXXConstCastExprClass:
+ // TODO(cir): The above list is missing CXXFunctionalCastExprClass,
+ // CXXAddrSpaceCastExprClass, and ObjCBridgedCastExprClass.
return emitCastLValue(cast<CastExpr>(e));
case Expr::MaterializeTemporaryExprClass:
return emitMaterializeTemporaryExpr(cast<MaterializeTemporaryExpr>(e));
diff --git a/clang/test/CIR/CodeGenCXX/simple-reinterpret-const-cast.cpp
b/clang/test/CIR/CodeGenCXX/simple-reinterpret-const-cast.cpp
new file mode 100644
index 0000000000000..08cfbf59182f8
--- /dev/null
+++ b/clang/test/CIR/CodeGenCXX/simple-reinterpret-const-cast.cpp
@@ -0,0 +1,44 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o
- | FileCheck %s -check-prefix=CIR
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o
- | FileCheck %s -check-prefix=LLVM
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - |
FileCheck %s -check-prefix=LLVM
+
+struct S { void do_thing(); };
+
+void test_const_cast(const S &s) {
+ const_cast<S&>(s).do_thing();
+}
+// CIR: cir.func {{.*}}@_Z15test_const_castRK1S(%[[ARG:.*]]:
!cir.ptr<!rec_S>{{.*}}) {
+// CIR-NEXT: %[[ARG_ALLOCA:.*]] = cir.alloca !cir.ptr<!rec_S>,
!cir.ptr<!cir.ptr<!rec_S>>, ["s", init, const]
+// CIR-NEXT: cir.store %[[ARG]], %[[ARG_ALLOCA]] : !cir.ptr<!rec_S>,
!cir.ptr<!cir.ptr<!rec_S>>
+// CIR-NEXT: %[[ARG_LOAD:.*]] = cir.load %[[ARG_ALLOCA]] :
!cir.ptr<!cir.ptr<!rec_S>>, !cir.ptr<!rec_S>
+// CIR-NEXT: cir.call @_ZN1S8do_thingEv(%[[ARG_LOAD]])
+
+// LLVM: define {{.*}}void @_Z15test_const_castRK1S(ptr{{.*}}%[[ARG:.*]])
+// LLVM: %[[ARG_ALLOCA:.*]] = alloca ptr
+// LLVM-NEXT: store ptr %[[ARG]], ptr %[[ARG_ALLOCA]]
+// LLVM-NEXT: %[[ARG_LOAD:.*]] = load ptr, ptr %[[ARG_ALLOCA]]
+// LLVM-NEXT: call void @_ZN1S8do_thingEv(ptr {{.*}}%[[ARG_LOAD]])
+
+void call_with_ri_cast(S*&);
+void call_with_ri_cast(int*&);
+void test_reinterpet_cast(void *&data) {
+ call_with_ri_cast(reinterpret_cast<S*&>(data));
+ call_with_ri_cast(reinterpret_cast<int*&>(data));
+}
+// CIR: cir.func {{.*}}@_Z20test_reinterpet_castRPv(%[[ARG:.*]]:
!cir.ptr<!cir.ptr<!void>>{{.*}}) {
+// CIR-NEXT: %[[ARG_ALLOCA:.*]] = cir.alloca !cir.ptr<!cir.ptr<!void>>,
!cir.ptr<!cir.ptr<!cir.ptr<!void>>>, ["data", init, const]
+// CIR-NEXT: cir.store %[[ARG]], %[[ARG_ALLOCA]] :
!cir.ptr<!cir.ptr<!void>>, !cir.ptr<!cir.ptr<!cir.ptr<!void>>>
+// CIR-NEXT: %[[ARG_LOAD:.*]] = cir.load %[[ARG_ALLOCA]] :
!cir.ptr<!cir.ptr<!cir.ptr<!void>>>, !cir.ptr<!cir.ptr<!void>>
+// CIR-NEXT: %[[RI_CAST:.*]] = cir.cast bitcast %[[ARG_LOAD]] :
!cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.ptr<!rec_S>>
+// CIR-NEXT: cir.call @_Z17call_with_ri_castRP1S(%[[RI_CAST]])
+// CIR-NEXT: %[[ARG_LOAD:.*]] = cir.load %[[ARG_ALLOCA]] :
!cir.ptr<!cir.ptr<!cir.ptr<!void>>>, !cir.ptr<!cir.ptr<!void>>
+// CIR-NEXT: %[[RI_CAST:.*]] = cir.cast bitcast %[[ARG_LOAD]] :
!cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.ptr<!s32i>>
+// CIR-NEXT: cir.call @_Z17call_with_ri_castRPi(%[[RI_CAST]])
+
+// LLVM: define dso_local void @_Z20test_reinterpet_castRPv(ptr
{{.*}}%[[ARG:.*]])
+// LLVM: %[[ARG_ALLOCA:.*]] = alloca ptr
+// LLVM-NEXT: store ptr %[[ARG]], ptr %[[ARG_ALLOCA]]
+// LLVM-NEXT: %[[ARG_LOAD:.*]] = load ptr, ptr %[[ARG_ALLOCA]]
+// LLVM-NEXT: call void @_Z17call_with_ri_castRP1S(ptr {{.*}}%[[ARG_LOAD]])
+// LLVM-NEXT: %[[ARG_LOAD:.*]] = load ptr, ptr %[[ARG_ALLOCA]]
+// LLVM-NEXT: call void @_Z17call_with_ri_castRPi(ptr {{.*}}%[[ARG_LOAD]])
``````````
</details>
https://github.com/llvm/llvm-project/pull/182926
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits