Skip to content

Commit 8be6b10

Browse files
authored
[NVPTX] Remove nvvm.bitcast.* intrinsics (#107936)
Remove the following intrinsics which correspond directly to a bitcast: - llvm.nvvm.bitcast.f2i - llvm.nvvm.bitcast.i2f - llvm.nvvm.bitcast.d2ll - llvm.nvvm.bitcast.ll2d
1 parent d1edef5 commit 8be6b10

File tree

6 files changed

+39
-36
lines changed

6 files changed

+39
-36
lines changed

clang/include/clang/Basic/BuiltinsNVPTX.def

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -599,14 +599,6 @@ TARGET_BUILTIN(__nvvm_e4m3x2_to_f16x2_rn_relu, "V2hs", "", AND(SM_89,PTX81))
599599
TARGET_BUILTIN(__nvvm_e5m2x2_to_f16x2_rn, "V2hs", "", AND(SM_89,PTX81))
600600
TARGET_BUILTIN(__nvvm_e5m2x2_to_f16x2_rn_relu, "V2hs", "", AND(SM_89,PTX81))
601601

602-
// Bitcast
603-
604-
BUILTIN(__nvvm_bitcast_f2i, "if", "")
605-
BUILTIN(__nvvm_bitcast_i2f, "fi", "")
606-
607-
BUILTIN(__nvvm_bitcast_ll2d, "dLLi", "")
608-
BUILTIN(__nvvm_bitcast_d2ll, "LLid", "")
609-
610602
// FNS
611603
TARGET_BUILTIN(__nvvm_fns, "UiUiUii", "n", PTX60)
612604

llvm/docs/ReleaseNotes.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ Changes to the LLVM IR
5656

5757
* Added ``usub_cond`` and ``usub_sat`` operations to ``atomicrmw``.
5858

59+
* Remove the following intrinsics which can be replaced with a ``bitcast``:
60+
61+
* ``llvm.nvvm.bitcast.f2i``
62+
* ``llvm.nvvm.bitcast.i2f``
63+
* ``llvm.nvvm.bitcast.d2ll``
64+
* ``llvm.nvvm.bitcast.ll2d``
65+
5966
Changes to LLVM infrastructure
6067
------------------------------
6168

llvm/include/llvm/IR/IntrinsicsNVVM.td

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
// * llvm.nvvm.max.ui --> select(x ule y, x, y)
3131
// * llvm.nvvm.max.ull --> ibid.
3232
// * llvm.nvvm.h2f --> llvm.convert.to.fp16.f32
33+
// * llvm.nvvm.bitcast.f2i --> bitcast
34+
// * llvm.nvvm.bitcast.i2f --> ibid.
35+
// * llvm.nvvm.bitcast.d2ll --> ibid.
36+
// * llvm.nvvm.bitcast.ll2d --> ibid.
3337

3438
def llvm_global_ptr_ty : LLVMQualPointerType<1>; // (global)ptr
3539
def llvm_shared_ptr_ty : LLVMQualPointerType<3>; // (shared)ptr
@@ -1339,20 +1343,6 @@ let TargetPrefix = "nvvm" in {
13391343
def int_nvvm_e5m2x2_to_f16x2_rn_relu : ClangBuiltin<"__nvvm_e5m2x2_to_f16x2_rn_relu">,
13401344
Intrinsic<[llvm_v2f16_ty], [llvm_i16_ty], [IntrNoMem, IntrNoCallback]>;
13411345

1342-
//
1343-
// Bitcast
1344-
//
1345-
1346-
def int_nvvm_bitcast_f2i : ClangBuiltin<"__nvvm_bitcast_f2i">,
1347-
DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem, IntrSpeculatable]>;
1348-
def int_nvvm_bitcast_i2f : ClangBuiltin<"__nvvm_bitcast_i2f">,
1349-
DefaultAttrsIntrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem, IntrSpeculatable]>;
1350-
1351-
def int_nvvm_bitcast_ll2d : ClangBuiltin<"__nvvm_bitcast_ll2d">,
1352-
DefaultAttrsIntrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem, IntrSpeculatable]>;
1353-
def int_nvvm_bitcast_d2ll : ClangBuiltin<"__nvvm_bitcast_d2ll">,
1354-
DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem, IntrSpeculatable]>;
1355-
13561346
// FNS
13571347

13581348
def int_nvvm_fns : ClangBuiltin<"__nvvm_fns">,

llvm/lib/IR/AutoUpgrade.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,6 +1268,10 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn,
12681268
else if (Name.consume_front("atomic.load.add."))
12691269
// nvvm.atomic.load.add.{f32.p,f64.p}
12701270
Expand = Name.starts_with("f32.p") || Name.starts_with("f64.p");
1271+
else if (Name.consume_front("bitcast."))
1272+
// nvvm.bitcast.{f2i,i2f,ll2d,d2ll}
1273+
Expand =
1274+
Name == "f2i" || Name == "i2f" || Name == "ll2d" || Name == "d2ll";
12711275
else
12721276
Expand = false;
12731277

@@ -4258,6 +4262,10 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
42584262
F->getParent(), Intrinsic::convert_from_fp16,
42594263
{Builder.getFloatTy()}),
42604264
CI->getArgOperand(0), "h2f");
4265+
} else if (Name.consume_front("bitcast.") &&
4266+
(Name == "f2i" || Name == "i2f" || Name == "ll2d" ||
4267+
Name == "d2ll")) {
4268+
Rep = Builder.CreateBitCast(CI->getArgOperand(0), CI->getType());
42614269
} else {
42624270
Intrinsic::ID IID = shouldUpgradeNVPTXBF16Intrinsic(Name);
42634271
if (IID != Intrinsic::not_intrinsic &&

llvm/lib/Target/NVPTX/NVPTXIntrinsics.td

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,20 +1577,6 @@ def : Pat<(int_nvvm_e5m2x2_to_f16x2_rn Int16Regs:$a),
15771577
def : Pat<(int_nvvm_e5m2x2_to_f16x2_rn_relu Int16Regs:$a),
15781578
(CVT_f16x2_e5m2x2 Int16Regs:$a, CvtRN_RELU)>;
15791579

1580-
//
1581-
// Bitcast
1582-
//
1583-
1584-
def INT_NVVM_BITCAST_F2I : F_MATH_1<"mov.b32 \t$dst, $src0;", Int32Regs,
1585-
Float32Regs, int_nvvm_bitcast_f2i>;
1586-
def INT_NVVM_BITCAST_I2F : F_MATH_1<"mov.b32 \t$dst, $src0;", Float32Regs,
1587-
Int32Regs, int_nvvm_bitcast_i2f>;
1588-
1589-
def INT_NVVM_BITCAST_LL2D : F_MATH_1<"mov.b64 \t$dst, $src0;", Float64Regs,
1590-
Int64Regs, int_nvvm_bitcast_ll2d>;
1591-
def INT_NVVM_BITCAST_D2LL : F_MATH_1<"mov.b64 \t$dst, $src0;", Int64Regs,
1592-
Float64Regs, int_nvvm_bitcast_d2ll>;
1593-
15941580
//
15951581
// FNS
15961582
//

llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ declare i16 @llvm.nvvm.min.us(i16, i16)
2626
declare i32 @llvm.nvvm.min.ui(i32, i32)
2727
declare i64 @llvm.nvvm.min.ull(i64, i64)
2828

29+
declare i32 @llvm.nvvm.bitcast.f2i(float)
30+
declare float @llvm.nvvm.bitcast.i2f(i32)
31+
declare i64 @llvm.nvvm.bitcast.d2ll(double)
32+
declare double @llvm.nvvm.bitcast.ll2d(i64)
33+
2934
; CHECK-LABEL: @simple_upgrade
3035
define void @simple_upgrade(i32 %a, i64 %b, i16 %c) {
3136
; CHECK: call i32 @llvm.bitreverse.i32(i32 %a)
@@ -120,3 +125,18 @@ define void @min_max(i16 %a1, i16 %a2, i32 %b1, i32 %b2, i64 %c1, i64 %c2) {
120125

121126
ret void
122127
}
128+
129+
; CHECK-LABEL: @bitcast
130+
define void @bitcast(i32 %a, i64 %b, float %c, double %d) {
131+
; CHECK: bitcast float %c to i32
132+
; CHECK: bitcast i32 %a to float
133+
; CHECK: bitcast double %d to i64
134+
; CHECK: bitcast i64 %b to double
135+
;
136+
%r1 = call i32 @llvm.nvvm.bitcast.f2i(float %c)
137+
%r2 = call float @llvm.nvvm.bitcast.i2f(i32 %a)
138+
%r3 = call i64 @llvm.nvvm.bitcast.d2ll(double %d)
139+
%r4 = call double @llvm.nvvm.bitcast.ll2d(i64 %b)
140+
141+
ret void
142+
}

0 commit comments

Comments
 (0)