Index: lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp =================================================================== --- lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -504,6 +504,11 @@ Ctx.emitError("too many user SGPRs used"); } + if (MFI->LDSSize > static_cast(STM.getLocalMemorySize())) { + LLVMContext &Ctx = MF.getFunction()->getContext(); + Ctx.emitError("LDS size exceeds device maximum"); + } + ProgInfo.VGPRBlocks = (ProgInfo.NumVGPR - 1) / 4; ProgInfo.SGPRBlocks = (ProgInfo.NumSGPR - 1) / 8; // Set the value to initialize FP_ROUND and FP_DENORM parts of the mode Index: test/CodeGen/AMDGPU/32-bit-local-address-space.ll =================================================================== --- test/CodeGen/AMDGPU/32-bit-local-address-space.ll +++ test/CodeGen/AMDGPU/32-bit-local-address-space.ll @@ -91,12 +91,12 @@ @ptr = addrspace(3) global i32 addrspace(3)* undef -@dst = addrspace(3) global [16384 x i32] undef +@dst = addrspace(3) global [16383 x i32] undef ; FUNC-LABEL: {{^}}global_ptr: ; SI: ds_write_b32 define void @global_ptr() nounwind { - store i32 addrspace(3)* getelementptr ([16384 x i32], [16384 x i32] addrspace(3)* @dst, i32 0, i32 16), i32 addrspace(3)* addrspace(3)* @ptr + store i32 addrspace(3)* getelementptr ([16383 x i32], [16383 x i32] addrspace(3)* @dst, i32 0, i32 16), i32 addrspace(3)* addrspace(3)* @ptr ret void } Index: test/CodeGen/AMDGPU/over-max-lds-size.ll =================================================================== --- /dev/null +++ test/CodeGen/AMDGPU/over-max-lds-size.ll @@ -0,0 +1,14 @@ +; RUN: not llc -march=amdgcn -mcpu=tahiti < %s 2>&1 | FileCheck -check-prefix=ERROR %s +; RUN: not llc -march=amdgcn -mcpu=hawaii < %s 2>&1 | FileCheck -check-prefix=ERROR %s +; RUN: not llc -march=amdgcn -mcpu=fiji < %s 2>&1 | FileCheck -check-prefix=ERROR %s + +; ERROR: error: LDS size exceeds device maximum + +@huge = internal unnamed_addr addrspace(3) global [100000 x i32] undef, align 4 + +define void @promote_alloca_size_256() { +entry: + %v0 = getelementptr inbounds [100000 x i32], [100000 x i32] addrspace(3)* @huge, i32 0, i32 0 + store i32 0, i32 addrspace(3)* %v0 + ret void +}