diff options
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; } } } |
