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/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 +}