[clang] [CIR][LLVMLowering] Upstream Bitcast (PR #140774)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Tue May 20 11:11:26 PDT 2025
https://github.com/AmrDeveloper created https://github.com/llvm/llvm-project/pull/140774
This change adds support for lowering BitCastOp
>From 5e5676c1e3efe38bceb09ca90a4e4b7500cbb6e8 Mon Sep 17 00:00:00 2001
From: AmrDeveloper <amr96 at programmer.net>
Date: Tue, 20 May 2025 19:29:32 +0200
Subject: [PATCH] [CIR][LLVMLowering] Upstream Bitcast
---
.../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 12 ++++++++++--
clang/test/CIR/CodeGen/cast.cpp | 17 +++++++++++++++--
2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 365569ce1f48a..3a94806c3af7c 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -530,10 +530,18 @@ mlir::LogicalResult CIRToLLVMCastOpLowering::matchAndRewrite(
llvmSrcVal);
return mlir::success();
}
- case cir::CastKind::bitcast:
+ case cir::CastKind::bitcast: {
+ mlir::Type dstTy = castOp.getType();
+ mlir::Type llvmDstTy = getTypeConverter()->convertType(dstTy);
+
assert(!MissingFeatures::cxxABI());
assert(!MissingFeatures::dataMemberType());
- break;
+
+ mlir::Value llvmSrcVal = adaptor.getOperands().front();
+ rewriter.replaceOpWithNewOp<mlir::LLVM::BitcastOp>(castOp, llvmDstTy,
+ llvmSrcVal);
+ return mlir::success();
+ }
case cir::CastKind::ptr_to_bool: {
mlir::Value llvmSrcVal = adaptor.getOperands().front();
mlir::Value zeroPtr = rewriter.create<mlir::LLVM::ZeroOp>(
diff --git a/clang/test/CIR/CodeGen/cast.cpp b/clang/test/CIR/CodeGen/cast.cpp
index dd3ea8f8f02b2..9da72cd35d963 100644
--- a/clang/test/CIR/CodeGen/cast.cpp
+++ b/clang/test/CIR/CodeGen/cast.cpp
@@ -25,7 +25,6 @@ unsigned char cxxstaticcast_0(unsigned int x) {
// LLVM: %[[R:[0-9]+]] = load i8, ptr %[[RV]], align 1
// LLVM: ret i8 %[[R]]
-
int cStyleCasts_0(unsigned x1, int x2, float x3, short x4, double x5) {
// CIR: cir.func @_Z13cStyleCasts_0jifsd
// LLVM: define i32 @_Z13cStyleCasts_0jifsd
@@ -103,10 +102,24 @@ void should_not_cast() {
bool x2;
bool ib = (bool)x2; // identity
-
+
(void) ib; // void cast
}
// CIR: cir.func @_Z15should_not_castv
// CIR-NOT: cir.cast
// CIR: cir.return
+
+typedef int vi4 __attribute__((vector_size(16)));
+typedef double vd2 __attribute__((vector_size(16)));
+
+void bitcast() {
+ vd2 a = {};
+ vi4 b = (vi4)a;
+}
+
+// CIR: %[[D_VEC:.*]] = cir.load {{.*}} : !cir.ptr<!cir.vector<2 x !cir.double>>, !cir.vector<2 x !cir.double>
+// CIR: %[[I_VEC:.*]] = cir.cast(bitcast, %[[D_VEC]] : !cir.vector<2 x !cir.double>), !cir.vector<4 x !s32i>
+
+// LLVM: %[[D_VEC:.*]] = load <2 x double>, ptr {{.*}}, align 16
+// LLVM: %[[I_VEC:.*]] = bitcast <2 x double> %[[D_VEC]] to <4 x i32>
More information about the cfe-commits
mailing list