mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-07 12:28:24 +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:
@@ -246,12 +246,18 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
|
|||||||
assert(G->getOffset() == 0 &&
|
assert(G->getOffset() == 0 &&
|
||||||
"Do not know what to do with an non-zero offset");
|
"Do not know what to do with an non-zero offset");
|
||||||
|
|
||||||
unsigned Offset = MFI->LDSSize;
|
|
||||||
const GlobalValue *GV = G->getGlobal();
|
const GlobalValue *GV = G->getGlobal();
|
||||||
uint64_t Size = TD->getTypeAllocSize(GV->getType()->getElementType());
|
|
||||||
|
|
||||||
// XXX: Account for alignment?
|
unsigned Offset;
|
||||||
MFI->LDSSize += Size;
|
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()));
|
return DAG.getConstant(Offset, getPointerTy(G->getAddressSpace()));
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
#define AMDGPUMACHINEFUNCTION_H
|
#define AMDGPUMACHINEFUNCTION_H
|
||||||
|
|
||||||
#include "llvm/CodeGen/MachineFunction.h"
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
@@ -21,6 +22,9 @@ class AMDGPUMachineFunction : public MachineFunctionInfo {
|
|||||||
public:
|
public:
|
||||||
AMDGPUMachineFunction(const MachineFunction &MF);
|
AMDGPUMachineFunction(const MachineFunction &MF);
|
||||||
unsigned ShaderType;
|
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.
|
/// Number of bytes in the LDS that are being used.
|
||||||
unsigned LDSSize;
|
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
|
||||||
|
}
|
Reference in New Issue
Block a user