diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.h b/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.h --- a/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.h @@ -54,6 +54,9 @@ // Entry points called by other functions instead of directly by the hardware. bool IsModuleEntryFunction = false; + // Functions with the amdgpu_cs_chain or amdgpu_cs_chain_preserve CC. + bool IsChainFunction = false; + bool NoSignedZerosFPMath = false; // Function may be memory bound. @@ -85,6 +88,8 @@ bool isModuleEntryFunction() const { return IsModuleEntryFunction; } + bool isChainFunction() const { return IsChainFunction; } + bool hasNoSignedZerosFPMath() const { return NoSignedZerosFPMath; } diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.cpp b/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUMachineFunction.cpp @@ -24,6 +24,7 @@ : IsEntryFunction(AMDGPU::isEntryFunctionCC(F.getCallingConv())), IsModuleEntryFunction( AMDGPU::isModuleEntryFunctionCC(F.getCallingConv())), + IsChainFunction(AMDGPU::isChainCC(F.getCallingConv())), NoSignedZerosFPMath(false) { // FIXME: Should initialize KernArgSize based on ExplicitKernelArgOffset, 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 @@ -256,6 +256,7 @@ uint32_t GDSSize = 0; Align DynLDSAlign; bool IsEntryFunction = false; + bool IsChainFunction = false; bool NoSignedZerosFPMath = false; bool MemoryBound = false; bool WaveLimiter = false; @@ -304,6 +305,7 @@ YamlIO.mapOptional("gdsSize", MFI.GDSSize, 0u); YamlIO.mapOptional("dynLDSAlign", MFI.DynLDSAlign, Align()); YamlIO.mapOptional("isEntryFunction", MFI.IsEntryFunction, false); + YamlIO.mapOptional("isChainFunction", MFI.IsChainFunction, false); YamlIO.mapOptional("noSignedZerosFPMath", MFI.NoSignedZerosFPMath, false); YamlIO.mapOptional("memoryBound", MFI.MemoryBound, false); YamlIO.mapOptional("waveLimiter", MFI.WaveLimiter, false); diff --git a/llvm/test/CodeGen/MIR/AMDGPU/long-branch-reg-all-sgpr-used.ll b/llvm/test/CodeGen/MIR/AMDGPU/long-branch-reg-all-sgpr-used.ll --- a/llvm/test/CodeGen/MIR/AMDGPU/long-branch-reg-all-sgpr-used.ll +++ b/llvm/test/CodeGen/MIR/AMDGPU/long-branch-reg-all-sgpr-used.ll @@ -11,6 +11,7 @@ ; CHECK-NEXT: gdsSize: 0 ; CHECK-NEXT: dynLDSAlign: 1 ; CHECK-NEXT: isEntryFunction: true +; CHECK-NEXT: isChainFunction: false ; CHECK-NEXT: noSignedZerosFPMath: false ; CHECK-NEXT: memoryBound: false ; CHECK-NEXT: waveLimiter: false @@ -275,6 +276,7 @@ ; CHECK-NEXT: gdsSize: 0 ; CHECK-NEXT: dynLDSAlign: 1 ; CHECK-NEXT: isEntryFunction: true +; CHECK-NEXT: isChainFunction: false ; CHECK-NEXT: noSignedZerosFPMath: false ; CHECK-NEXT: memoryBound: false ; CHECK-NEXT: waveLimiter: 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 --- a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-after-pei.ll +++ b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-after-pei.ll @@ -10,6 +10,7 @@ ; AFTER-PEI-NEXT: gdsSize: 0 ; AFTER-PEI-NEXT: dynLDSAlign: 1 ; AFTER-PEI-NEXT: isEntryFunction: true +; AFTER-PEI-NEXT: isChainFunction: false ; AFTER-PEI-NEXT: noSignedZerosFPMath: false ; AFTER-PEI-NEXT: memoryBound: false ; AFTER-PEI-NEXT: waveLimiter: false diff --git a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-long-branch-reg-debug.ll b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-long-branch-reg-debug.ll --- a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-long-branch-reg-debug.ll +++ b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-long-branch-reg-debug.ll @@ -11,6 +11,7 @@ ; CHECK-NEXT: gdsSize: 0 ; CHECK-NEXT: dynLDSAlign: 1 ; CHECK-NEXT: isEntryFunction: true +; CHECK-NEXT: isChainFunction: false ; CHECK-NEXT: noSignedZerosFPMath: false ; CHECK-NEXT: memoryBound: false ; CHECK-NEXT: waveLimiter: false diff --git a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-long-branch-reg.ll b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-long-branch-reg.ll --- a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-long-branch-reg.ll +++ b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info-long-branch-reg.ll @@ -11,6 +11,7 @@ ; CHECK-NEXT: gdsSize: 0 ; CHECK-NEXT: dynLDSAlign: 1 ; CHECK-NEXT: isEntryFunction: true +; CHECK-NEXT: isChainFunction: false ; CHECK-NEXT: noSignedZerosFPMath: false ; CHECK-NEXT: memoryBound: false ; CHECK-NEXT: waveLimiter: false 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 @@ -11,6 +11,7 @@ # FULL-NEXT: gdsSize: 256 # FULL-NEXT: dynLDSAlign: 1 # FULL-NEXT: isEntryFunction: true +# FULL-NEXT: isChainFunction: false # FULL-NEXT: noSignedZerosFPMath: false # FULL-NEXT: memoryBound: true # FULL-NEXT: waveLimiter: true @@ -115,6 +116,7 @@ # FULL-NEXT: gdsSize: 0 # FULL-NEXT: dynLDSAlign: 1 # FULL-NEXT: isEntryFunction: false +# FULL-NEXT: isChainFunction: false # FULL-NEXT: noSignedZerosFPMath: false # FULL-NEXT: memoryBound: false # FULL-NEXT: waveLimiter: false @@ -188,6 +190,7 @@ # FULL-NEXT: gdsSize: 0 # FULL-NEXT: dynLDSAlign: 1 # FULL-NEXT: isEntryFunction: false +# FULL-NEXT: isChainFunction: false # FULL-NEXT: noSignedZerosFPMath: false # FULL-NEXT: memoryBound: false # FULL-NEXT: waveLimiter: false @@ -262,6 +265,7 @@ # FULL-NEXT: gdsSize: 0 # FULL-NEXT: dynLDSAlign: 1 # FULL-NEXT: isEntryFunction: true +# FULL-NEXT: isChainFunction: false # FULL-NEXT: noSignedZerosFPMath: false # FULL-NEXT: memoryBound: false # FULL-NEXT: waveLimiter: false diff --git a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info.ll b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info.ll --- a/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info.ll +++ b/llvm/test/CodeGen/MIR/AMDGPU/machine-function-info.ll @@ -14,6 +14,7 @@ ; CHECK-NEXT: gdsSize: 0 ; CHECK-NEXT: dynLDSAlign: 1 ; CHECK-NEXT: isEntryFunction: true +; CHECK-NEXT: isChainFunction: false ; CHECK-NEXT: noSignedZerosFPMath: false ; CHECK-NEXT: memoryBound: false ; CHECK-NEXT: waveLimiter: false @@ -61,6 +62,7 @@ ; CHECK-NEXT: gdsSize: 512 ; CHECK-NEXT: dynLDSAlign: 1 ; CHECK-NEXT: isEntryFunction: true +; CHECK-NEXT: isChainFunction: false ; CHECK-NEXT: noSignedZerosFPMath: false ; CHECK-NEXT: memoryBound: false ; CHECK-NEXT: waveLimiter: false @@ -119,6 +121,7 @@ ; CHECK-NEXT: gdsSize: 0 ; CHECK-NEXT: dynLDSAlign: 1 ; CHECK-NEXT: isEntryFunction: false +; CHECK-NEXT: isChainFunction: false ; CHECK-NEXT: noSignedZerosFPMath: false ; CHECK-NEXT: memoryBound: false ; CHECK-NEXT: waveLimiter: false @@ -169,6 +172,7 @@ ; CHECK-NEXT: gdsSize: 0 ; CHECK-NEXT: dynLDSAlign: 1 ; CHECK-NEXT: isEntryFunction: false +; CHECK-NEXT: isChainFunction: false ; CHECK-NEXT: noSignedZerosFPMath: true ; CHECK-NEXT: memoryBound: false ; CHECK-NEXT: waveLimiter: false