From 1c4d0efe56e234224a394dc3211d481120701f52 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 28 Apr 2016 19:37:35 +0000 Subject: [PATCH] AMDGPU: Emit error if too much LDS is used llvm-svn: 267922 --- llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp | 5 +++++ llvm/test/CodeGen/AMDGPU/32-bit-local-address-space.ll | 6 +++--- llvm/test/CodeGen/AMDGPU/over-max-lds-size.ll | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 llvm/test/CodeGen/AMDGPU/over-max-lds-size.ll diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp index e05e915..7b27e16 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -504,6 +504,11 @@ void AMDGPUAsmPrinter::getSIProgramInfo(SIProgramInfo &ProgInfo, 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 diff --git a/llvm/test/CodeGen/AMDGPU/32-bit-local-address-space.ll b/llvm/test/CodeGen/AMDGPU/32-bit-local-address-space.ll index c7bcfd2..ff8c904 100644 --- a/llvm/test/CodeGen/AMDGPU/32-bit-local-address-space.ll +++ b/llvm/test/CodeGen/AMDGPU/32-bit-local-address-space.ll @@ -1,4 +1,4 @@ -; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s +; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s ; On Southern Islands GPUs the local address space(3) uses 32-bit pointers and @@ -91,12 +91,12 @@ define void @infer_ptr_alignment_global_offset(float addrspace(1)* %out, i32 %ti @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 } diff --git a/llvm/test/CodeGen/AMDGPU/over-max-lds-size.ll b/llvm/test/CodeGen/AMDGPU/over-max-lds-size.ll new file mode 100644 index 0000000..459d913 --- /dev/null +++ b/llvm/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 +} -- 2.7.4