R600: Fix incorrect LDS size calculation

GlobalAdderss nodes that appeared in more than one basic block were
being counted twice.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190078 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tom Stellard 2013-09-05 18:37:57 +00:00
parent 402b8e2175
commit 470c451574
3 changed files with 40 additions and 4 deletions

View File

@ -246,12 +246,18 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
assert(G->getOffset() == 0 &&
"Do not know what to do with an non-zero offset");
unsigned Offset = MFI->LDSSize;
const GlobalValue *GV = G->getGlobal();
uint64_t Size = TD->getTypeAllocSize(GV->getType()->getElementType());
// XXX: Account for alignment?
MFI->LDSSize += Size;
unsigned Offset;
if (MFI->LocalMemoryObjects.count(GV) == 0) {
uint64_t Size = TD->getTypeAllocSize(GV->getType()->getElementType());
Offset = MFI->LDSSize;
MFI->LocalMemoryObjects[GV] = Offset;
// XXX: Account for alignment?
MFI->LDSSize += Size;
} else {
Offset = MFI->LocalMemoryObjects[GV];
}
return DAG.getConstant(Offset, getPointerTy(G->getAddressSpace()));
}

View File

@ -14,6 +14,7 @@
#define AMDGPUMACHINEFUNCTION_H
#include "llvm/CodeGen/MachineFunction.h"
#include <map>
namespace llvm {
@ -21,6 +22,9 @@ class AMDGPUMachineFunction : public MachineFunctionInfo {
public:
AMDGPUMachineFunction(const MachineFunction &MF);
unsigned ShaderType;
/// A map to keep track of local memory objects and their offsets within
/// the local memory space.
std::map<const GlobalValue *, unsigned> LocalMemoryObjects;
/// Number of bytes in the LDS that are being used.
unsigned LDSSize;
};

View File

@ -0,0 +1,26 @@
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
; This test makes sure we do not double count global values when they are
; used in different basic blocks.
; CHECK-LABEL: @test
; CHECK: .long 166120
; CHECK-NEXT: .long 1
@lds = internal addrspace(3) unnamed_addr global i32 zeroinitializer, align 4
define void @test(i32 addrspace(1)* %out, i32 %cond) {
entry:
%0 = icmp eq i32 %cond, 0
br i1 %0, label %if, label %else
if:
store i32 1, i32 addrspace(3)* @lds
br label %endif
else:
store i32 2, i32 addrspace(3)* @lds
br label %endif
endif:
ret void
}