diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h index f0e7ee910f95..576e6cfe929e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h @@ -11,15 +11,13 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/CodeGen/Register.h" -#include "llvm/IR/Function.h" #include "llvm/Pass.h" +#include "llvm/Support/LowLevelTypeImpl.h" namespace llvm { class Function; class raw_ostream; -class GCNSubtarget; -class TargetMachine; class TargetRegisterClass; class TargetRegisterInfo; @@ -40,19 +38,22 @@ private: bool IsSet : 1; public: - ArgDescriptor(unsigned Val = 0, unsigned Mask = ~0u, + constexpr ArgDescriptor(unsigned Val = 0, unsigned Mask = ~0u, bool IsStack = false, bool IsSet = false) : Reg(Val), Mask(Mask), IsStack(IsStack), IsSet(IsSet) {} - static ArgDescriptor createRegister(Register Reg, unsigned Mask = ~0u) { + static constexpr ArgDescriptor createRegister(Register Reg, + unsigned Mask = ~0u) { return ArgDescriptor(Reg, Mask, false, true); } - static ArgDescriptor createStack(unsigned Offset, unsigned Mask = ~0u) { + static constexpr ArgDescriptor createStack(unsigned Offset, + unsigned Mask = ~0u) { return ArgDescriptor(Offset, Mask, true, true); } - static ArgDescriptor createArg(const ArgDescriptor &Arg, unsigned Mask) { + static constexpr ArgDescriptor createArg(const ArgDescriptor &Arg, + unsigned Mask) { return ArgDescriptor(Arg.Reg, Mask, Arg.IsStack, Arg.IsSet); } @@ -141,25 +142,29 @@ struct AMDGPUFunctionArgInfo { ArgDescriptor ImplicitArgPtr; // Input registers for non-HSA ABI - ArgDescriptor ImplicitBufferPtr = 0; + ArgDescriptor ImplicitBufferPtr; // VGPRs inputs. These are always v0, v1 and v2 for entry functions. ArgDescriptor WorkItemIDX; ArgDescriptor WorkItemIDY; ArgDescriptor WorkItemIDZ; - std::pair<const ArgDescriptor *, const TargetRegisterClass *> + std::tuple<const ArgDescriptor *, const TargetRegisterClass *, LLT> getPreloadedValue(PreloadedValue Value) const; + + static constexpr AMDGPUFunctionArgInfo fixedABILayout(); }; class AMDGPUArgumentUsageInfo : public ImmutablePass { private: - static const AMDGPUFunctionArgInfo ExternFunctionInfo; DenseMap<const Function *, AMDGPUFunctionArgInfo> ArgInfoMap; public: static char ID; + static const AMDGPUFunctionArgInfo ExternFunctionInfo; + static const AMDGPUFunctionArgInfo FixedABIFunctionInfo; + AMDGPUArgumentUsageInfo() : ImmutablePass(ID) { } void getAnalysisUsage(AnalysisUsage &AU) const override { @@ -175,15 +180,7 @@ public: ArgInfoMap[&F] = ArgInfo; } - const AMDGPUFunctionArgInfo &lookupFuncArgInfo(const Function &F) const { - auto I = ArgInfoMap.find(&F); - if (I == ArgInfoMap.end()) { - assert(F.isDeclaration()); - return ExternFunctionInfo; - } - - return I->second; - } + const AMDGPUFunctionArgInfo &lookupFuncArgInfo(const Function &F) const; }; } // end namespace llvm |