diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp @@ -354,6 +354,11 @@ continue; } + if (GV.isAbsoluteSymbolRef()) { + report_fatal_error( + "LDS variables with absolute addresses are unimplemented."); + } + for (User *V : GV.users()) { if (auto *I = dyn_cast(V)) { Function *F = I->getFunction(); diff --git a/llvm/test/CodeGen/AMDGPU/lds-reject-absolute-addresses.ll b/llvm/test/CodeGen/AMDGPU/lds-reject-absolute-addresses.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/lds-reject-absolute-addresses.ll @@ -0,0 +1,15 @@ +; RUN: not --crash opt -S -mtriple=amdgcn-- -amdgpu-lower-module-lds < %s 2>&1 | FileCheck %s +; RUN: not --crash opt -S -mtriple=amdgcn-- -passes=amdgpu-lower-module-lds < %s 2>&1 | FileCheck %s + +@var1 = addrspace(3) global i32 undef, !absolute_symbol !0 + +; CHECK: LLVM ERROR: LDS variables with absolute addresses are unimplemented. +define amdgpu_kernel void @kern() { + %val0 = load i32, ptr addrspace(3) @var1 + %val1 = add i32 %val0, 4 + store i32 %val1, ptr addrspace(3) @var1 + ret void +} + +!0 = !{i64 0, i64 1} +