diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 06a67346fbf959..805c9ef7b72729 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -4224,6 +4224,19 @@ void Verifier::visitLoadInst(LoadInst &LI) { visitInstruction(LI); } +static bool isConstantAddressSpace(unsigned AS) { + switch (AS) { + using namespace AMDGPUAS; + case CONSTANT_ADDRESS: case CONSTANT_ADDRESS_32BIT: + case CONSTANT_BUFFER_0: case CONSTANT_BUFFER_1: case CONSTANT_BUFFER_2: case CONSTANT_BUFFER_3: + case CONSTANT_BUFFER_4: case CONSTANT_BUFFER_5: case CONSTANT_BUFFER_6: case CONSTANT_BUFFER_7: + case CONSTANT_BUFFER_8: case CONSTANT_BUFFER_9: case CONSTANT_BUFFER_10: case CONSTANT_BUFFER_11: + case CONSTANT_BUFFER_12: case CONSTANT_BUFFER_13: case CONSTANT_BUFFER_14: case CONSTANT_BUFFER_15: + return true; + default: return false; + } +} + void Verifier::visitStoreInst(StoreInst &SI) { PointerType *PTy = dyn_cast(SI.getOperand(1)->getType()); Check(PTy, "Store operand must be a pointer.", &SI); @@ -4246,6 +4259,10 @@ void Verifier::visitStoreInst(StoreInst &SI) { Check(SI.getSyncScopeID() == SyncScope::System, "Non-atomic store cannot have SynchronizationScope specified", &SI); } + if (TT.isAMDGPU()) { + Check(!isConstantAddressSpace(SI.getPointerAddressSpace()), + "Store cannot be to constant addrspace", &SI); + } visitInstruction(SI); } diff --git a/llvm/test/CodeGen/AMDGPU/const-store.ll b/llvm/test/CodeGen/AMDGPU/const-store.ll new file mode 100644 index 00000000000000..9447ef9db59986 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/const-store.ll @@ -0,0 +1,9 @@ +; RUN: not llc -mtriple=amdgcn < %s |& FileCheck %s + +define amdgpu_kernel void @store_const(ptr addrspace(4) %out, i32 %a, i32 %b) { +; CHECK: Store cannot be to constant addrspace +; CHECK-NEXT: store i32 %r, ptr addrspace(4) %out + %r = add i32 %a, %b + store i32 %r, ptr addrspace(4) %out + ret void +}