mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
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:
parent
402b8e2175
commit
470c451574
@ -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()));
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
26
test/CodeGen/R600/lds-size.ll
Normal file
26
test/CodeGen/R600/lds-size.ll
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user