mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
R600/SI: Limit SGPRs to 80 on Tonga and Iceland
This is a candidate for stable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231659 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -103,6 +103,11 @@ def FeatureVGPRSpilling : SubtargetFeature<"vgpr-spilling",
|
|||||||
"true",
|
"true",
|
||||||
"Enable spilling of VGPRs to scratch memory">;
|
"Enable spilling of VGPRs to scratch memory">;
|
||||||
|
|
||||||
|
def FeatureSGPRInitBug : SubtargetFeature<"sgpr-init-bug",
|
||||||
|
"SGPRInitBug",
|
||||||
|
"true",
|
||||||
|
"VI SGPR initilization bug requiring a fixed SGPR allocation size">;
|
||||||
|
|
||||||
class SubtargetFeatureFetchLimit <string Value> :
|
class SubtargetFeatureFetchLimit <string Value> :
|
||||||
SubtargetFeature <"fetch"#Value,
|
SubtargetFeature <"fetch"#Value,
|
||||||
"TexVTXClauseSize",
|
"TexVTXClauseSize",
|
||||||
|
@@ -339,6 +339,13 @@ void AMDGPUAsmPrinter::getSIProgramInfo(SIProgramInfo &ProgInfo,
|
|||||||
ProgInfo.NumVGPR = MaxVGPR + 1;
|
ProgInfo.NumVGPR = MaxVGPR + 1;
|
||||||
ProgInfo.NumSGPR = MaxSGPR + 1;
|
ProgInfo.NumSGPR = MaxSGPR + 1;
|
||||||
|
|
||||||
|
if (STM.hasSGPRInitBug()) {
|
||||||
|
if (ProgInfo.NumSGPR > AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG)
|
||||||
|
llvm_unreachable("Too many SGPRs used with the SGPR init bug");
|
||||||
|
|
||||||
|
ProgInfo.NumSGPR = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG;
|
||||||
|
}
|
||||||
|
|
||||||
ProgInfo.VGPRBlocks = (ProgInfo.NumVGPR - 1) / 4;
|
ProgInfo.VGPRBlocks = (ProgInfo.NumVGPR - 1) / 4;
|
||||||
ProgInfo.SGPRBlocks = (ProgInfo.NumSGPR - 1) / 8;
|
ProgInfo.SGPRBlocks = (ProgInfo.NumSGPR - 1) / 8;
|
||||||
// Set the value to initialize FP_ROUND and FP_DENORM parts of the mode
|
// Set the value to initialize FP_ROUND and FP_DENORM parts of the mode
|
||||||
|
@@ -70,7 +70,7 @@ AMDGPUSubtarget::AMDGPUSubtarget(StringRef TT, StringRef GPU, StringRef FS,
|
|||||||
CaymanISA(false), FlatAddressSpace(false), EnableIRStructurizer(true),
|
CaymanISA(false), FlatAddressSpace(false), EnableIRStructurizer(true),
|
||||||
EnablePromoteAlloca(false), EnableIfCvt(true), EnableLoadStoreOpt(false),
|
EnablePromoteAlloca(false), EnableIfCvt(true), EnableLoadStoreOpt(false),
|
||||||
WavefrontSize(0), CFALUBug(false), LocalMemorySize(0),
|
WavefrontSize(0), CFALUBug(false), LocalMemorySize(0),
|
||||||
EnableVGPRSpilling(false),
|
EnableVGPRSpilling(false), SGPRInitBug(false),
|
||||||
FrameLowering(TargetFrameLowering::StackGrowsUp,
|
FrameLowering(TargetFrameLowering::StackGrowsUp,
|
||||||
64 * 16, // Maximum stack alignment (long16)
|
64 * 16, // Maximum stack alignment (long16)
|
||||||
0),
|
0),
|
||||||
|
@@ -44,6 +44,10 @@ public:
|
|||||||
VOLCANIC_ISLANDS,
|
VOLCANIC_ISLANDS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FIXED_SGPR_COUNT_FOR_INIT_BUG = 80
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string DevName;
|
std::string DevName;
|
||||||
bool Is64bit;
|
bool Is64bit;
|
||||||
@@ -66,6 +70,7 @@ private:
|
|||||||
bool CFALUBug;
|
bool CFALUBug;
|
||||||
int LocalMemorySize;
|
int LocalMemorySize;
|
||||||
bool EnableVGPRSpilling;
|
bool EnableVGPRSpilling;
|
||||||
|
bool SGPRInitBug;
|
||||||
|
|
||||||
AMDGPUFrameLowering FrameLowering;
|
AMDGPUFrameLowering FrameLowering;
|
||||||
std::unique_ptr<AMDGPUTargetLowering> TLInfo;
|
std::unique_ptr<AMDGPUTargetLowering> TLInfo;
|
||||||
@@ -206,6 +211,10 @@ public:
|
|||||||
return LocalMemorySize;
|
return LocalMemorySize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool hasSGPRInitBug() const {
|
||||||
|
return SGPRInitBug;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned getAmdKernelCodeChipID() const;
|
unsigned getAmdKernelCodeChipID() const;
|
||||||
|
|
||||||
bool enableMachineScheduler() const override {
|
bool enableMachineScheduler() const override {
|
||||||
|
@@ -119,8 +119,12 @@ def : ProcessorModel<"mullins", SIQuarterSpeedModel, [FeatureSeaIslands]>;
|
|||||||
// Volcanic Islands
|
// Volcanic Islands
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
def : ProcessorModel<"tonga", SIQuarterSpeedModel, [FeatureVolcanicIslands]>;
|
def : ProcessorModel<"tonga", SIQuarterSpeedModel,
|
||||||
|
[FeatureVolcanicIslands, FeatureSGPRInitBug]
|
||||||
|
>;
|
||||||
|
|
||||||
def : ProcessorModel<"iceland", SIQuarterSpeedModel, [FeatureVolcanicIslands]>;
|
def : ProcessorModel<"iceland", SIQuarterSpeedModel,
|
||||||
|
[FeatureVolcanicIslands, FeatureSGPRInitBug]
|
||||||
|
>;
|
||||||
|
|
||||||
def : ProcessorModel<"carrizo", SIQuarterSpeedModel, [FeatureVolcanicIslands]>;
|
def : ProcessorModel<"carrizo", SIQuarterSpeedModel, [FeatureVolcanicIslands]>;
|
||||||
|
@@ -46,6 +46,23 @@ BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
|||||||
Reserved.set(AMDGPU::VGPR255);
|
Reserved.set(AMDGPU::VGPR255);
|
||||||
Reserved.set(AMDGPU::VGPR254);
|
Reserved.set(AMDGPU::VGPR254);
|
||||||
|
|
||||||
|
// Tonga and Iceland can only allocate a fixed number of SGPRs due
|
||||||
|
// to a hw bug.
|
||||||
|
if (ST.hasSGPRInitBug()) {
|
||||||
|
unsigned NumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs();
|
||||||
|
// Reserve some SGPRs for FLAT_SCRATCH and VCC (4 SGPRs).
|
||||||
|
// Assume XNACK_MASK is unused.
|
||||||
|
unsigned Limit = AMDGPUSubtarget::FIXED_SGPR_COUNT_FOR_INIT_BUG - 4;
|
||||||
|
|
||||||
|
for (unsigned i = Limit; i < NumSGPRs; ++i) {
|
||||||
|
unsigned Reg = AMDGPU::SGPR_32RegClass.getRegister(i);
|
||||||
|
MCRegAliasIterator R = MCRegAliasIterator(Reg, this, true);
|
||||||
|
|
||||||
|
for (; R.isValid(); ++R)
|
||||||
|
Reserved.set(*R);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Reserved;
|
return Reserved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,7 +1,9 @@
|
|||||||
; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs -filetype=obj | llvm-readobj -s -symbols - | FileCheck --check-prefix=ELF %s
|
; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs -filetype=obj | llvm-readobj -s -symbols - | FileCheck --check-prefix=ELF %s
|
||||||
; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs -o - | FileCheck --check-prefix=CONFIG %s
|
; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs -o - | FileCheck --check-prefix=CONFIG --check-prefix=TYPICAL %s
|
||||||
; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs -filetype=obj | llvm-readobj -s -symbols - | FileCheck --check-prefix=ELF %s
|
; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs -filetype=obj | llvm-readobj -s -symbols - | FileCheck --check-prefix=ELF %s
|
||||||
; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs -o - | FileCheck --check-prefix=CONFIG %s
|
; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs -o - | FileCheck --check-prefix=CONFIG --check-prefix=TONGA %s
|
||||||
|
; RUN: llc < %s -march=amdgcn -mcpu=carrizo -verify-machineinstrs -filetype=obj | llvm-readobj -s -symbols - | FileCheck --check-prefix=ELF %s
|
||||||
|
; RUN: llc < %s -march=amdgcn -mcpu=carrizo -verify-machineinstrs -o - | FileCheck --check-prefix=CONFIG --check-prefix=TYPICAL %s
|
||||||
|
|
||||||
; ELF: Format: ELF32
|
; ELF: Format: ELF32
|
||||||
; ELF: Name: .AMDGPU.config
|
; ELF: Name: .AMDGPU.config
|
||||||
@@ -15,7 +17,8 @@
|
|||||||
; CONFIG: test:
|
; CONFIG: test:
|
||||||
; CONFIG: .section .AMDGPU.config
|
; CONFIG: .section .AMDGPU.config
|
||||||
; CONFIG-NEXT: .long 45096
|
; CONFIG-NEXT: .long 45096
|
||||||
; CONFIG-NEXT: .long 0
|
; TYPICAL-NEXT: .long 0
|
||||||
|
; TONGA-NEXT: .long 576
|
||||||
define void @test(i32 %p) #0 {
|
define void @test(i32 %p) #0 {
|
||||||
%i = add i32 %p, 2
|
%i = add i32 %p, 2
|
||||||
%r = bitcast i32 %i to float
|
%r = bitcast i32 %i to float
|
||||||
|
Reference in New Issue
Block a user