Skip to content

Commit d0e7714

Browse files
authored
[AMDGPU] Error on non-global pointer with s_prefetch_data (#107624)
1 parent 4c040c0 commit d0e7714

File tree

5 files changed

+30
-23
lines changed

5 files changed

+30
-23
lines changed

llvm/include/llvm/Support/AMDGPUAddrSpace.h

+14
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ enum : unsigned {
8181
UNKNOWN_ADDRESS_SPACE = ~0u,
8282
};
8383
} // end namespace AMDGPUAS
84+
85+
namespace AMDGPU {
86+
inline bool isFlatGlobalAddrSpace(unsigned AS) {
87+
return AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::FLAT_ADDRESS ||
88+
AS == AMDGPUAS::CONSTANT_ADDRESS || AS > AMDGPUAS::MAX_AMDGPU_ADDRESS;
89+
}
90+
91+
inline bool isExtendedGlobalAddrSpace(unsigned AS) {
92+
return AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::CONSTANT_ADDRESS ||
93+
AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT ||
94+
AS > AMDGPUAS::MAX_AMDGPU_ADDRESS;
95+
}
96+
} // end namespace AMDGPU
97+
8498
} // end namespace llvm
8599

86100
#endif // LLVM_SUPPORT_AMDGPUADDRSPACE_H

llvm/lib/IR/Verifier.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
#include "llvm/IR/Value.h"
115115
#include "llvm/InitializePasses.h"
116116
#include "llvm/Pass.h"
117+
#include "llvm/Support/AMDGPUAddrSpace.h"
117118
#include "llvm/Support/AtomicOrdering.h"
118119
#include "llvm/Support/Casting.h"
119120
#include "llvm/Support/CommandLine.h"
@@ -6281,6 +6282,13 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
62816282
"Value for inactive lanes must be a VGPR function argument", &Call);
62826283
break;
62836284
}
6285+
case Intrinsic::amdgcn_s_prefetch_data: {
6286+
Check(
6287+
AMDGPU::isFlatGlobalAddrSpace(
6288+
Call.getArgOperand(0)->getType()->getPointerAddressSpace()),
6289+
"llvm.amdgcn.s.prefetch.data only supports global or constant memory");
6290+
break;
6291+
}
62846292
case Intrinsic::nvvm_setmaxnreg_inc_sync_aligned_u32:
62856293
case Intrinsic::nvvm_setmaxnreg_dec_sync_aligned_u32: {
62866294
Value *V = Call.getArgOperand(0);

llvm/lib/Target/AMDGPU/AMDGPU.h

-14
Original file line numberDiff line numberDiff line change
@@ -461,20 +461,6 @@ enum TargetIndex {
461461
TI_SCRATCH_RSRC_DWORD3
462462
};
463463

464-
// FIXME: Missing constant_32bit
465-
inline bool isFlatGlobalAddrSpace(unsigned AS) {
466-
return AS == AMDGPUAS::GLOBAL_ADDRESS ||
467-
AS == AMDGPUAS::FLAT_ADDRESS ||
468-
AS == AMDGPUAS::CONSTANT_ADDRESS ||
469-
AS > AMDGPUAS::MAX_AMDGPU_ADDRESS;
470-
}
471-
472-
inline bool isExtendedGlobalAddrSpace(unsigned AS) {
473-
return AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::CONSTANT_ADDRESS ||
474-
AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT ||
475-
AS > AMDGPUAS::MAX_AMDGPU_ADDRESS;
476-
}
477-
478464
static inline bool addrspacesMayAlias(unsigned AS1, unsigned AS2) {
479465
static_assert(AMDGPUAS::MAX_AMDGPU_ADDRESS <= 9, "Addr space out of range");
480466

llvm/test/CodeGen/AMDGPU/llvm.amdgcn.s.prefetch.data.ll

-9
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,6 @@ entry:
110110
ret void
111111
}
112112

113-
define amdgpu_ps void @prefetch_data_sgpr_base_imm_len_local(ptr addrspace(3) inreg %ptr) {
114-
; GCN-LABEL: prefetch_data_sgpr_base_imm_len_local:
115-
; GCN: ; %bb.0: ; %entry
116-
; GCN-NEXT: s_endpgm
117-
entry:
118-
tail call void @llvm.amdgcn.s.prefetch.data.p3(ptr addrspace(3) %ptr, i32 31)
119-
ret void
120-
}
121-
122113
define amdgpu_ps void @prefetch_data_vgpr_base_imm_len(ptr addrspace(4) %ptr) {
123114
; GCN-LABEL: prefetch_data_vgpr_base_imm_len:
124115
; GCN: ; %bb.0: ; %entry
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
2+
3+
define amdgpu_ps void @prefetch_data_sgpr_base_imm_len_local(ptr addrspace(3) inreg %ptr) {
4+
entry:
5+
; CHECK: llvm.amdgcn.s.prefetch.data only supports global or constant memory
6+
tail call void @llvm.amdgcn.s.prefetch.data.p3(ptr addrspace(3) %ptr, i32 31)
7+
ret void
8+
}

0 commit comments

Comments
 (0)