Skip to content

Commit 583795e

Browse files
authored
[NVPTX][NFCI] Use DataLayout to determine short shared/local/const pointers (#89404)
Use the datalayout directly to determine the correct `cvta` instruction for converting shared/local/const pointers. This is cleaner as it eliminates the need to keep a redundant copy of this info in the TM and makes clear which address spaces short pointers are applicable for.
1 parent 947cd67 commit 583795e

File tree

8 files changed

+54
-55
lines changed

8 files changed

+54
-55
lines changed

llvm/lib/Target/NVPTX/NVPTXFrameLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void NVPTXFrameLowering::emitPrologue(MachineFunction &MF,
5050
bool Is64Bit =
5151
static_cast<const NVPTXTargetMachine &>(MF.getTarget()).is64Bit();
5252
unsigned CvtaLocalOpcode =
53-
(Is64Bit ? NVPTX::cvta_local_yes_64 : NVPTX::cvta_local_yes);
53+
(Is64Bit ? NVPTX::cvta_local_64 : NVPTX::cvta_local);
5454
unsigned MovDepotOpcode =
5555
(Is64Bit ? NVPTX::MOV_DEPOT_ADDR_64 : NVPTX::MOV_DEPOT_ADDR);
5656
if (!MR.use_empty(NRI->getFrameRegister(MF))) {

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,6 @@ bool NVPTXDAGToDAGISel::allowUnsafeFPMath() const {
7474
return TL->allowUnsafeFPMath(*MF);
7575
}
7676

77-
bool NVPTXDAGToDAGISel::useShortPointers() const {
78-
return TM.useShortPointers();
79-
}
80-
8177
/// Select - Select instructions not customized! Used for
8278
/// expanded, promoted and normal instructions.
8379
void NVPTXDAGToDAGISel::Select(SDNode *N) {
@@ -768,22 +764,25 @@ void NVPTXDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
768764
switch (SrcAddrSpace) {
769765
default: report_fatal_error("Bad address space in addrspacecast");
770766
case ADDRESS_SPACE_GLOBAL:
771-
Opc = TM.is64Bit() ? NVPTX::cvta_global_yes_64 : NVPTX::cvta_global_yes;
767+
Opc = TM.is64Bit() ? NVPTX::cvta_global_64 : NVPTX::cvta_global;
772768
break;
773769
case ADDRESS_SPACE_SHARED:
774-
Opc = TM.is64Bit() ? (useShortPointers() ? NVPTX::cvta_shared_yes_6432
775-
: NVPTX::cvta_shared_yes_64)
776-
: NVPTX::cvta_shared_yes;
770+
Opc = TM.is64Bit() ? (TM.getPointerSizeInBits(SrcAddrSpace) == 32
771+
? NVPTX::cvta_shared_6432
772+
: NVPTX::cvta_shared_64)
773+
: NVPTX::cvta_shared;
777774
break;
778775
case ADDRESS_SPACE_CONST:
779-
Opc = TM.is64Bit() ? (useShortPointers() ? NVPTX::cvta_const_yes_6432
780-
: NVPTX::cvta_const_yes_64)
781-
: NVPTX::cvta_const_yes;
776+
Opc = TM.is64Bit() ? (TM.getPointerSizeInBits(SrcAddrSpace) == 32
777+
? NVPTX::cvta_const_6432
778+
: NVPTX::cvta_const_64)
779+
: NVPTX::cvta_const;
782780
break;
783781
case ADDRESS_SPACE_LOCAL:
784-
Opc = TM.is64Bit() ? (useShortPointers() ? NVPTX::cvta_local_yes_6432
785-
: NVPTX::cvta_local_yes_64)
786-
: NVPTX::cvta_local_yes;
782+
Opc = TM.is64Bit() ? (TM.getPointerSizeInBits(SrcAddrSpace) == 32
783+
? NVPTX::cvta_local_6432
784+
: NVPTX::cvta_local_64)
785+
: NVPTX::cvta_local;
787786
break;
788787
}
789788
ReplaceNode(N, CurDAG->getMachineNode(Opc, SDLoc(N), N->getValueType(0),
@@ -797,23 +796,25 @@ void NVPTXDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
797796
switch (DstAddrSpace) {
798797
default: report_fatal_error("Bad address space in addrspacecast");
799798
case ADDRESS_SPACE_GLOBAL:
800-
Opc = TM.is64Bit() ? NVPTX::cvta_to_global_yes_64
801-
: NVPTX::cvta_to_global_yes;
799+
Opc = TM.is64Bit() ? NVPTX::cvta_to_global_64 : NVPTX::cvta_to_global;
802800
break;
803801
case ADDRESS_SPACE_SHARED:
804-
Opc = TM.is64Bit() ? (useShortPointers() ? NVPTX::cvta_to_shared_yes_3264
805-
: NVPTX::cvta_to_shared_yes_64)
806-
: NVPTX::cvta_to_shared_yes;
802+
Opc = TM.is64Bit() ? (TM.getPointerSizeInBits(DstAddrSpace) == 32
803+
? NVPTX::cvta_to_shared_3264
804+
: NVPTX::cvta_to_shared_64)
805+
: NVPTX::cvta_to_shared;
807806
break;
808807
case ADDRESS_SPACE_CONST:
809-
Opc = TM.is64Bit() ? (useShortPointers() ? NVPTX::cvta_to_const_yes_3264
810-
: NVPTX::cvta_to_const_yes_64)
811-
: NVPTX::cvta_to_const_yes;
808+
Opc = TM.is64Bit() ? (TM.getPointerSizeInBits(DstAddrSpace) == 32
809+
? NVPTX::cvta_to_const_3264
810+
: NVPTX::cvta_to_const_64)
811+
: NVPTX::cvta_to_const;
812812
break;
813813
case ADDRESS_SPACE_LOCAL:
814-
Opc = TM.is64Bit() ? (useShortPointers() ? NVPTX::cvta_to_local_yes_3264
815-
: NVPTX::cvta_to_local_yes_64)
816-
: NVPTX::cvta_to_local_yes;
814+
Opc = TM.is64Bit() ? (TM.getPointerSizeInBits(DstAddrSpace) == 32
815+
? NVPTX::cvta_to_local_3264
816+
: NVPTX::cvta_to_local_64)
817+
: NVPTX::cvta_to_local;
817818
break;
818819
case ADDRESS_SPACE_PARAM:
819820
Opc = TM.is64Bit() ? NVPTX::nvvm_ptr_gen_to_param_64

llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class LLVM_LIBRARY_VISIBILITY NVPTXDAGToDAGISel : public SelectionDAGISel {
3636
bool useF32FTZ() const;
3737
bool allowFMA() const;
3838
bool allowUnsafeFPMath() const;
39-
bool useShortPointers() const;
4039

4140
public:
4241
static char ID;

llvm/lib/Target/NVPTX/NVPTXInstrInfo.td

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ def hasHWROT32 : Predicate<"Subtarget->hasHWROT32()">;
160160
def noHWROT32 : Predicate<"!Subtarget->hasHWROT32()">;
161161

162162
def True : Predicate<"true">;
163+
def False : Predicate<"false">;
163164

164165
class hasPTX<int version>: Predicate<"Subtarget->getPTXVersion() >= " # version>;
165166
class hasSM<int version>: Predicate<"Subtarget->getSmVersion() >= " # version>;
@@ -171,7 +172,10 @@ def hasSM90a : Predicate<"Subtarget->getFullSmVersion() == 901">;
171172
def hasSHFL : Predicate<"!(Subtarget->getSmVersion() >= 70"
172173
"&& Subtarget->getPTXVersion() >= 64)">;
173174

174-
def useShortPtr : Predicate<"useShortPointers()">;
175+
def useShortPtrLocal : Predicate<"TM.is64Bit() && TM.getPointerSizeInBits(ADDRESS_SPACE_LOCAL) == 32">;
176+
def useShortPtrShared : Predicate<"TM.is64Bit() && TM.getPointerSizeInBits(ADDRESS_SPACE_SHARED) == 32">;
177+
def useShortPtrConst : Predicate<"TM.is64Bit() && TM.getPointerSizeInBits(ADDRESS_SPACE_CONST) == 32">;
178+
175179
def useFP16Math: Predicate<"Subtarget->allowFP16Math()">;
176180
def hasBF16Math: Predicate<"Subtarget->hasBF16Math()">;
177181

llvm/lib/Target/NVPTX/NVPTXIntrinsics.td

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2407,46 +2407,45 @@ defm INT_PTX_LDG_G_v4f32_ELE
24072407
: VLDG_G_ELE_V4<"v4.f32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Float32Regs>;
24082408

24092409

2410-
multiclass NG_TO_G<string Str, Intrinsic Intrin> {
2411-
def _yes : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src),
2410+
multiclass NG_TO_G<string Str, Intrinsic Intrin, Predicate ShortPtr> {
2411+
def "" : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src),
24122412
!strconcat("cvta.", Str, ".u32 \t$result, $src;"),
24132413
[(set Int32Regs:$result, (Intrin Int32Regs:$src))]>;
2414-
def _yes_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src),
2414+
def _64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src),
24152415
!strconcat("cvta.", Str, ".u64 \t$result, $src;"),
24162416
[(set Int64Regs:$result, (Intrin Int64Regs:$src))]>;
2417-
def _yes_6432 : NVPTXInst<(outs Int64Regs:$result), (ins Int32Regs:$src),
2417+
def _6432 : NVPTXInst<(outs Int64Regs:$result), (ins Int32Regs:$src),
24182418
"{{ .reg .b64 %tmp;\n\t"
24192419
#" cvt.u64.u32 \t%tmp, $src;\n\t"
24202420
#" cvta." # Str # ".u64 \t$result, %tmp; }}",
24212421
[(set Int64Regs:$result, (Intrin Int32Regs:$src))]>,
2422-
Requires<[useShortPtr]>;
2422+
Requires<[ShortPtr]>;
24232423
}
24242424

2425-
multiclass G_TO_NG<string Str, Intrinsic Intrin> {
2426-
def _yes : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src),
2425+
multiclass G_TO_NG<string Str, Intrinsic Intrin, Predicate ShortPtr> {
2426+
def "" : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src),
24272427
!strconcat("cvta.to.", Str, ".u32 \t$result, $src;"),
24282428
[(set Int32Regs:$result, (Intrin Int32Regs:$src))]>;
2429-
def _yes_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src),
2429+
def _64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src),
24302430
!strconcat("cvta.to.", Str, ".u64 \t$result, $src;"),
24312431
[(set Int64Regs:$result, (Intrin Int64Regs:$src))]>;
2432-
def _yes_3264 : NVPTXInst<(outs Int32Regs:$result), (ins Int64Regs:$src),
2432+
def _3264 : NVPTXInst<(outs Int32Regs:$result), (ins Int64Regs:$src),
24332433
"{{ .reg .b64 %tmp;\n\t"
24342434
#" cvta.to." # Str # ".u64 \t%tmp, $src;\n\t"
24352435
#" cvt.u32.u64 \t$result, %tmp; }}",
24362436
[(set Int32Regs:$result, (Intrin Int64Regs:$src))]>,
2437-
Requires<[useShortPtr]>;
2437+
Requires<[ShortPtr]>;
24382438
}
24392439

2440-
defm cvta_local : NG_TO_G<"local", int_nvvm_ptr_local_to_gen>;
2441-
defm cvta_shared : NG_TO_G<"shared", int_nvvm_ptr_shared_to_gen>;
2442-
defm cvta_global : NG_TO_G<"global", int_nvvm_ptr_global_to_gen>;
2443-
defm cvta_const : NG_TO_G<"const", int_nvvm_ptr_constant_to_gen>;
2444-
2445-
defm cvta_to_local : G_TO_NG<"local", int_nvvm_ptr_gen_to_local>;
2446-
defm cvta_to_shared : G_TO_NG<"shared", int_nvvm_ptr_gen_to_shared>;
2447-
defm cvta_to_global : G_TO_NG<"global", int_nvvm_ptr_gen_to_global>;
2448-
defm cvta_to_const : G_TO_NG<"const", int_nvvm_ptr_gen_to_constant>;
2440+
defm cvta_local : NG_TO_G<"local", int_nvvm_ptr_local_to_gen, useShortPtrLocal>;
2441+
defm cvta_shared : NG_TO_G<"shared", int_nvvm_ptr_shared_to_gen, useShortPtrShared>;
2442+
defm cvta_global : NG_TO_G<"global", int_nvvm_ptr_global_to_gen, False>;
2443+
defm cvta_const : NG_TO_G<"const", int_nvvm_ptr_constant_to_gen, useShortPtrConst>;
24492444

2445+
defm cvta_to_local : G_TO_NG<"local", int_nvvm_ptr_gen_to_local, useShortPtrLocal>;
2446+
defm cvta_to_shared : G_TO_NG<"shared", int_nvvm_ptr_gen_to_shared, useShortPtrShared>;
2447+
defm cvta_to_global : G_TO_NG<"global", int_nvvm_ptr_gen_to_global, False>;
2448+
defm cvta_to_const : G_TO_NG<"const", int_nvvm_ptr_gen_to_constant, useShortPtrConst>;
24502449

24512450
// nvvm.ptr.gen.to.param
24522451
def nvvm_ptr_gen_to_param : NVPTXInst<(outs Int32Regs:$result),

llvm/lib/Target/NVPTX/NVPTXPeephole.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
//
2323
// It will transform the following pattern
2424
// %0 = LEA_ADDRi64 %VRFrame64, 4
25-
// %1 = cvta_to_local_yes_64 %0
25+
// %1 = cvta_to_local_64 %0
2626
//
2727
// into
2828
// %1 = LEA_ADDRi64 %VRFrameLocal64, 4
@@ -76,8 +76,8 @@ static bool isCVTAToLocalCombinationCandidate(MachineInstr &Root) {
7676
auto &MBB = *Root.getParent();
7777
auto &MF = *MBB.getParent();
7878
// Check current instruction is cvta.to.local
79-
if (Root.getOpcode() != NVPTX::cvta_to_local_yes_64 &&
80-
Root.getOpcode() != NVPTX::cvta_to_local_yes)
79+
if (Root.getOpcode() != NVPTX::cvta_to_local_64 &&
80+
Root.getOpcode() != NVPTX::cvta_to_local)
8181
return false;
8282

8383
auto &Op = Root.getOperand(1);

llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ NVPTXTargetMachine::NVPTXTargetMachine(const Target &T, const Triple &TT,
132132
: LLVMTargetMachine(T, computeDataLayout(is64bit, UseShortPointersOpt), TT,
133133
CPU, FS, Options, Reloc::PIC_,
134134
getEffectiveCodeModel(CM, CodeModel::Small), OL),
135-
is64bit(is64bit), UseShortPointers(UseShortPointersOpt),
136-
TLOF(std::make_unique<NVPTXTargetObjectFile>()),
135+
is64bit(is64bit), TLOF(std::make_unique<NVPTXTargetObjectFile>()),
137136
Subtarget(TT, std::string(CPU), std::string(FS), *this),
138137
StrPool(StrAlloc) {
139138
if (TT.getOS() == Triple::NVCL)

llvm/lib/Target/NVPTX/NVPTXTargetMachine.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ namespace llvm {
2424
///
2525
class NVPTXTargetMachine : public LLVMTargetMachine {
2626
bool is64bit;
27-
// Use 32-bit pointers for accessing const/local/short AS.
28-
bool UseShortPointers;
2927
std::unique_ptr<TargetLoweringObjectFile> TLOF;
3028
NVPTX::DrvInterface drvInterface;
3129
NVPTXSubtarget Subtarget;
@@ -46,7 +44,6 @@ class NVPTXTargetMachine : public LLVMTargetMachine {
4644
}
4745
const NVPTXSubtarget *getSubtargetImpl() const { return &Subtarget; }
4846
bool is64Bit() const { return is64bit; }
49-
bool useShortPointers() const { return UseShortPointers; }
5047
NVPTX::DrvInterface getDrvInterface() const { return drvInterface; }
5148
UniqueStringSaver &getStrPool() const {
5249
return const_cast<UniqueStringSaver &>(StrPool);

0 commit comments

Comments
 (0)