diff --git a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h --- a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h +++ b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h @@ -289,6 +289,7 @@ Optional ArgInfo; SIMode Mode; + Optional ScavengeFI; SIMachineFunctionInfo() = default; SIMachineFunctionInfo(const llvm::SIMachineFunctionInfo &, @@ -322,6 +323,7 @@ YamlIO.mapOptional("highBitsOf32BitAddress", MFI.HighBitsOf32BitAddress, 0u); YamlIO.mapOptional("occupancy", MFI.Occupancy, 0); + YamlIO.mapOptional("scavengeFI", MFI.ScavengeFI); } }; @@ -546,6 +548,7 @@ void removeDeadFrameIndices(MachineFrameInfo &MFI); int getScavengeFI(MachineFrameInfo &MFI, const SIRegisterInfo &TRI); + Optional getOptionalScavengeFI() const { return ScavengeFI; } bool hasCalculatedTID() const { return TIDReg != 0; }; Register getTIDReg() const { return TIDReg; }; diff --git a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp --- a/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.cpp @@ -560,8 +560,8 @@ ScratchRSrcReg(regToString(MFI.getScratchRSrcReg(), TRI)), FrameOffsetReg(regToString(MFI.getFrameOffsetReg(), TRI)), StackPtrOffsetReg(regToString(MFI.getStackPtrOffsetReg(), TRI)), - ArgInfo(convertArgumentInfo(MFI.getArgInfo(), TRI)), Mode(MFI.getMode()) { -} + ArgInfo(convertArgumentInfo(MFI.getArgInfo(), TRI)), Mode(MFI.getMode()), + ScavengeFI(MFI.getOptionalScavengeFI()) {} void yaml::SIMachineFunctionInfo::mappingImpl(yaml::IO &YamlIO) { MappingTraits::mapping(YamlIO, *this); @@ -581,6 +581,7 @@ WaveLimiter = YamlMFI.WaveLimiter; HasSpilledSGPRs = YamlMFI.HasSpilledSGPRs; HasSpilledVGPRs = YamlMFI.HasSpilledVGPRs; + ScavengeFI = YamlMFI.ScavengeFI; return false; } diff --git a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-after-pei.ll b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-after-pei.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-after-pei.ll @@ -0,0 +1,50 @@ +; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -amdgpu-spill-sgpr-to-vgpr=0 -stop-after prologepilog -verify-machineinstrs %s -o - | FileCheck -check-prefix=AFTER-PEI %s + +; Test that the ScavengeFI is serialized in the SIMachineFunctionInfo. + +; AFTER-PEI-LABEL: {{^}}name: scavenge_fi +; AFTER-PEI: machineFunctionInfo: +; AFTER-PEI-NEXT: explicitKernArgSize: 12 +; AFTER-PEI-NEXT: maxKernArgAlign: 8 +; AFTER-PEI-NEXT: ldsSize: 0 +; AFTER-PEI-NEXT: dynLDSAlign: 1 +; AFTER-PEI-NEXT: isEntryFunction: true +; AFTER-PEI-NEXT: noSignedZerosFPMath: false +; AFTER-PEI-NEXT: memoryBound: false +; AFTER-PEI-NEXT: waveLimiter: false +; AFTER-PEI-NEXT: hasSpilledSGPRs: true +; AFTER-PEI-NEXT: hasSpilledVGPRs: false +; AFTER-PEI-NEXT: scratchRSrcReg: '$sgpr68_sgpr69_sgpr70_sgpr71' +; AFTER-PEI-NEXT: frameOffsetReg: '$fp_reg' +; AFTER-PEI-NEXT: stackPtrOffsetReg: '$sgpr32' +; AFTER-PEI-NEXT: argumentInfo: +; AFTER-PEI-NEXT: privateSegmentBuffer: { reg: '$sgpr0_sgpr1_sgpr2_sgpr3' } +; AFTER-PEI-NEXT: kernargSegmentPtr: { reg: '$sgpr4_sgpr5' } +; AFTER-PEI-NEXT: workGroupIDX: { reg: '$sgpr6' } +; AFTER-PEI-NEXT: privateSegmentWaveByteOffset: { reg: '$sgpr7' } +; AFTER-PEI-NEXT: workItemIDX: { reg: '$vgpr0' } +; AFTER-PEI-NEXT: mode: +; AFTER-PEI-NEXT: ieee: true +; AFTER-PEI-NEXT: dx10-clamp: true +; AFTER-PEI-NEXT: fp32-input-denormals: true +; AFTER-PEI-NEXT: fp32-output-denormals: true +; AFTER-PEI-NEXT: fp64-fp16-input-denormals: true +; AFTER-PEI-NEXT: fp64-fp16-output-denormals: true +; AFTER-PEI-NEXT: highBitsOf32BitAddress: 0 +; AFTER-PEI-NEXT: occupancy: 5 +; AFTER-PEI-NEXT: scavengeFI: -1 +; AFTER-PEI-NEXT: body: +define amdgpu_kernel void @scavenge_fi(i32 addrspace(1)* %out, i32 %in) #0 { + %wide.sgpr0 = call <32 x i32> asm sideeffect "; def $0", "=s" () #0 + %wide.sgpr1 = call <32 x i32> asm sideeffect "; def $0", "=s" () #0 + %wide.sgpr2 = call <32 x i32> asm sideeffect "; def $0", "=s" () #0 + %wide.sgpr3 = call <32 x i32> asm sideeffect "; def $0", "=s" () #0 + + call void asm sideeffect "; use $0", "s"(<32 x i32> %wide.sgpr0) #0 + call void asm sideeffect "; use $0", "s"(<32 x i32> %wide.sgpr1) #0 + call void asm sideeffect "; use $0", "s"(<32 x i32> %wide.sgpr2) #0 + call void asm sideeffect "; use $0", "s"(<32 x i32> %wide.sgpr3) #0 + ret void +} + +attributes #0 = { nounwind } diff --git a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-no-ir.mir b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-no-ir.mir --- a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-no-ir.mir +++ b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-no-ir.mir @@ -340,3 +340,19 @@ S_ENDPGM 0 ... + +--- +# ALL-LABEL: name: scavenge_fi + +# FULL: scavengeFI: 5 + +# SIMPLE: scavengeFI: 5 +name: scavenge_fi +machineFunctionInfo: + scavengeFI: 5 + +body: | + bb.0: + S_ENDPGM 0 + +...