Skip to content

Commit a643ac4

Browse files
authored
[NVPTX] Remove 'param' variants of nvvm.ptr.* intrinics (#137065)
After #136008 these intrinsics are no longer inserted by the compiler and can be upgraded to addrspacecasts.
1 parent 070a4ae commit a643ac4

File tree

4 files changed

+21
-39
lines changed

4 files changed

+21
-39
lines changed

llvm/include/llvm/IR/IntrinsicsNVVM.td

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,12 @@
116116
// * llvm.nvvm.ptr.gen.to.shared --> ibid.
117117
// * llvm.nvvm.ptr.gen.to.constant --> ibid.
118118
// * llvm.nvvm.ptr.gen.to.local --> ibid.
119+
// * llvm.nvvm.ptr.gen.to.param --> ibid.
119120
// * llvm.nvvm.ptr.global.to.gen --> ibid.
120121
// * llvm.nvvm.ptr.shared.to.gen --> ibid.
121122
// * llvm.nvvm.ptr.constant.to.gen --> ibid.
122123
// * llvm.nvvm.ptr.local.to.gen --> ibid.
124+
// * llvm.nvvm.ptr.param.to.gen --> ibid.
123125
// * llvm.nvvm.ldg.global.i --> load addrspace(1) !load.invariant
124126
// * llvm.nvvm.ldg.global.f --> ibid.
125127
// * llvm.nvvm.ldg.global.p --> ibid.
@@ -1897,19 +1899,6 @@ def int_nvvm_ldu_global_p : Intrinsic<[llvm_anyptr_ty],
18971899
[IntrReadMem, IntrArgMemOnly, IntrNoCallback, IntrWillReturn, NoCapture<ArgIndex<0>>],
18981900
"llvm.nvvm.ldu.global.p">;
18991901

1900-
// Used in nvvm internally to help address space opt and ptx code generation
1901-
// This is for params that are passed to kernel functions by pointer by-val.
1902-
def int_nvvm_ptr_gen_to_param: Intrinsic<[llvm_anyptr_ty],
1903-
[llvm_anyptr_ty],
1904-
[IntrNoMem, IntrSpeculatable, IntrNoCallback],
1905-
"llvm.nvvm.ptr.gen.to.param">;
1906-
1907-
// sm70+, PTX7.7+
1908-
def int_nvvm_ptr_param_to_gen: DefaultAttrsIntrinsic<[llvm_anyptr_ty],
1909-
[llvm_anyptr_ty],
1910-
[IntrNoMem, IntrSpeculatable, IntrNoCallback],
1911-
"llvm.nvvm.ptr.param.to.gen">;
1912-
19131902
// Represents an explicit hole in the LLVM IR type system. It may be inserted by
19141903
// the compiler in cases where a pointer is of the wrong type. In the backend
19151904
// this intrinsic will be folded away and not equate to any instruction. It

llvm/lib/IR/AutoUpgrade.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,12 @@ static Intrinsic::ID shouldUpgradeNVPTXBF16Intrinsic(StringRef Name) {
10541054
return Intrinsic::not_intrinsic;
10551055
}
10561056

1057+
static bool consumeNVVMPtrAddrSpace(StringRef &Name) {
1058+
return Name.consume_front("local") || Name.consume_front("shared") ||
1059+
Name.consume_front("global") || Name.consume_front("constant") ||
1060+
Name.consume_front("param");
1061+
}
1062+
10571063
static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn,
10581064
bool CanUpgradeDebugIntrinsicsToRecords) {
10591065
assert(F && "Illegal to upgrade a non-existent Function.");
@@ -1361,15 +1367,11 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn,
13611367
// nvvm.rotate.{b32,b64,right.b64}
13621368
Expand = Name == "b32" || Name == "b64" || Name == "right.b64";
13631369
else if (Name.consume_front("ptr.gen.to."))
1364-
// nvvm.ptr.gen.to.{local,shared,global,constant}
1365-
Expand = Name.starts_with("local") || Name.starts_with("shared") ||
1366-
Name.starts_with("global") || Name.starts_with("constant");
1370+
// nvvm.ptr.gen.to.{local,shared,global,constant,param}
1371+
Expand = consumeNVVMPtrAddrSpace(Name);
13671372
else if (Name.consume_front("ptr."))
1368-
// nvvm.ptr.{local,shared,global,constant}.to.gen
1369-
Expand =
1370-
(Name.consume_front("local") || Name.consume_front("shared") ||
1371-
Name.consume_front("global") || Name.consume_front("constant")) &&
1372-
Name.starts_with(".to.gen");
1373+
// nvvm.ptr.{local,shared,global,constant,param}.to.gen
1374+
Expand = consumeNVVMPtrAddrSpace(Name) && Name.starts_with(".to.gen");
13731375
else if (Name.consume_front("ldg.global."))
13741376
// nvvm.ldg.global.{i,p,f}
13751377
Expand = (Name.starts_with("i.") || Name.starts_with("f.") ||
@@ -2450,12 +2452,8 @@ static Value *upgradeNVVMIntrinsicCall(StringRef Name, CallBase *CI,
24502452
Rep = Builder.CreateIntrinsic(Int64Ty, Intrinsic::fshl,
24512453
{Arg, Arg, Builder.getInt64(32)});
24522454
} else if ((Name.consume_front("ptr.gen.to.") &&
2453-
(Name.starts_with("local") || Name.starts_with("shared") ||
2454-
Name.starts_with("global") || Name.starts_with("constant"))) ||
2455-
(Name.consume_front("ptr.") &&
2456-
(Name.consume_front("local") || Name.consume_front("shared") ||
2457-
Name.consume_front("global") ||
2458-
Name.consume_front("constant")) &&
2455+
consumeNVVMPtrAddrSpace(Name)) ||
2456+
(Name.consume_front("ptr.") && consumeNVVMPtrAddrSpace(Name) &&
24592457
Name.starts_with(".to.gen"))) {
24602458
Rep = Builder.CreateAddrSpaceCast(CI->getArgOperand(0), CI->getType());
24612459
} else if (Name.consume_front("ldg.global")) {

llvm/lib/Target/NVPTX/NVPTXIntrinsics.td

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2413,18 +2413,6 @@ foreach space = ["local", "shared", "global", "const", "param"] in {
24132413
defm cvta_shared_cluster : NG_TO_G<"shared::cluster", false, [hasClusters]>;
24142414
defm cvta_to_shared_cluster : G_TO_NG<"shared::cluster", false, [hasClusters]>;
24152415

2416-
def : Pat<(int_nvvm_ptr_param_to_gen i32:$src),
2417-
(cvta_param $src)>;
2418-
2419-
def : Pat<(int_nvvm_ptr_param_to_gen i64:$src),
2420-
(cvta_param_64 $src)>;
2421-
2422-
// nvvm.ptr.gen.to.param
2423-
def : Pat<(int_nvvm_ptr_gen_to_param i32:$src),
2424-
(i32 Int32Regs:$src)>;
2425-
2426-
def : Pat<(int_nvvm_ptr_gen_to_param i64:$src),
2427-
(i64 Int64Regs:$src)>;
24282416

24292417
// nvvm.move intrinsicc
24302418
def nvvm_move_i16 : NVPTXInst<(outs Int16Regs:$r), (ins Int16Regs:$s),

llvm/test/Assembler/auto_upgrade_nvvm_intrinsics.ll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,12 @@ declare ptr addrspace(1) @llvm.nvvm.ptr.gen.to.global.p1.p0(ptr)
4444
declare ptr addrspace(3) @llvm.nvvm.ptr.gen.to.shared.p3.p0(ptr)
4545
declare ptr addrspace(4) @llvm.nvvm.ptr.gen.to.constant.p4.p0(ptr)
4646
declare ptr addrspace(5) @llvm.nvvm.ptr.gen.to.local.p5.p0(ptr)
47+
declare ptr addrspace(101) @llvm.nvvm.ptr.gen.to.param.p101.p0(ptr)
4748
declare ptr @llvm.nvvm.ptr.global.to.gen.p0.p1(ptr addrspace(1))
4849
declare ptr @llvm.nvvm.ptr.shared.to.gen.p0.p3(ptr addrspace(3))
4950
declare ptr @llvm.nvvm.ptr.constant.to.gen.p0.p4(ptr addrspace(4))
5051
declare ptr @llvm.nvvm.ptr.local.to.gen.p0.p5(ptr addrspace(5))
52+
declare ptr @llvm.nvvm.ptr.param.to.gen.p0.p101(ptr addrspace(101))
5153

5254
declare i32 @llvm.nvvm.ldg.global.i.i32.p1(ptr addrspace(1), i32)
5355
declare ptr @llvm.nvvm.ldg.global.p.p1(ptr addrspace(1), i32)
@@ -219,6 +221,8 @@ define void @addrspacecast(ptr %p0) {
219221
; CHECK: %6 = addrspacecast ptr addrspace(4) %5 to ptr
220222
; CHECK: %7 = addrspacecast ptr %6 to ptr addrspace(5)
221223
; CHECK: %8 = addrspacecast ptr addrspace(5) %7 to ptr
224+
; CHECK: %9 = addrspacecast ptr %8 to ptr addrspace(101)
225+
; CHECK: %10 = addrspacecast ptr addrspace(101) %9 to ptr
222226
;
223227
%p1 = call ptr addrspace(1) @llvm.nvvm.ptr.gen.to.global.p1.p0(ptr %p0)
224228
%p2 = call ptr @llvm.nvvm.ptr.global.to.gen.p0.p1(ptr addrspace(1) %p1)
@@ -232,6 +236,9 @@ define void @addrspacecast(ptr %p0) {
232236
%p7 = call ptr addrspace(5) @llvm.nvvm.ptr.gen.to.local.p5.p0(ptr %p6)
233237
%p8 = call ptr @llvm.nvvm.ptr.local.to.gen.p0.p5(ptr addrspace(5) %p7)
234238

239+
%p9 = call ptr addrspace(101) @llvm.nvvm.ptr.gen.to.param.p101.p0(ptr %p8)
240+
%p10 = call ptr @llvm.nvvm.ptr.param.to.gen.p0.p101(ptr addrspace(101) %p9)
241+
235242
ret void
236243
}
237244

0 commit comments

Comments
 (0)