diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-11-19 20:06:13 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-11-19 20:06:13 +0000 |
| commit | c0981da47d5696fe36474fcf86b4ce03ae3ff818 (patch) | |
| tree | f42add1021b9f2ac6a69ac7cf6c4499962739a45 /llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp | |
| parent | 344a3780b2e33f6ca763666c380202b18aab72a3 (diff) | |
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp index ef46e53b7460..cb511e5e3483 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUResourceUsageAnalysis.cpp @@ -29,6 +29,8 @@ #include "SIMachineFunctionInfo.h" #include "llvm/Analysis/CallGraph.h" #include "llvm/CodeGen/TargetPassConfig.h" +#include "llvm/IR/GlobalAlias.h" +#include "llvm/IR/GlobalValue.h" #include "llvm/Target/TargetMachine.h" using namespace llvm; @@ -61,7 +63,8 @@ static const Function *getCalleeFunction(const MachineOperand &Op) { assert(Op.getImm() == 0); return nullptr; } - + if (auto *GA = dyn_cast<GlobalAlias>(Op.getGlobal())) + return cast<Function>(GA->getOperand(0)); return cast<Function>(Op.getGlobal()); } @@ -83,10 +86,15 @@ int32_t AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo::getTotalNumSGPRs( } int32_t AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo::getTotalNumVGPRs( + const GCNSubtarget &ST, int32_t ArgNumAGPR, int32_t ArgNumVGPR) const { + if (ST.hasGFX90AInsts() && ArgNumAGPR) + return alignTo(ArgNumVGPR, 4) + ArgNumAGPR; + return std::max(ArgNumVGPR, ArgNumAGPR); +} + +int32_t AMDGPUResourceUsageAnalysis::SIFunctionResourceInfo::getTotalNumVGPRs( const GCNSubtarget &ST) const { - if (ST.hasGFX90AInsts() && NumAGPR) - return alignTo(NumVGPR, 4) + NumAGPR; - return std::max(NumVGPR, NumAGPR); + return getTotalNumVGPRs(ST, NumAGPR, NumVGPR); } bool AMDGPUResourceUsageAnalysis::runOnSCC(CallGraphSCC &SCC) { @@ -444,6 +452,25 @@ AMDGPUResourceUsageAnalysis::analyzeResourceUsage( if (!IsIndirect) I = CallGraphResourceInfo.find(Callee); + // FIXME: Call site could have norecurse on it + if (!Callee || !Callee->doesNotRecurse()) { + Info.HasRecursion = true; + + // TODO: If we happen to know there is no stack usage in the + // callgraph, we don't need to assume an infinitely growing stack. + if (!MI.isReturn()) { + // We don't need to assume an unknown stack size for tail calls. + + // FIXME: This only benefits in the case where the kernel does not + // directly call the tail called function. If a kernel directly + // calls a tail recursive function, we'll assume maximum stack size + // based on the regular call instruction. + CalleeFrameSize = + std::max(CalleeFrameSize, + static_cast<uint64_t>(AssumedStackSizeForExternalCall)); + } + } + if (IsIndirect || I == CallGraphResourceInfo.end()) { CalleeFrameSize = std::max(CalleeFrameSize, @@ -468,10 +495,6 @@ AMDGPUResourceUsageAnalysis::analyzeResourceUsage( Info.HasRecursion |= I->second.HasRecursion; Info.HasIndirectCall |= I->second.HasIndirectCall; } - - // FIXME: Call site could have norecurse on it - if (!Callee || !Callee->doesNotRecurse()) - Info.HasRecursion = true; } } } |
