Path: blob/main/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h
35269 views
//==- AMDGPUArgumentrUsageInfo.h - Function Arg Usage Info -------*- C++ -*-==//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUARGUMENTUSAGEINFO_H9#define LLVM_LIB_TARGET_AMDGPU_AMDGPUARGUMENTUSAGEINFO_H1011#include "llvm/ADT/DenseMap.h"12#include "llvm/CodeGen/Register.h"13#include "llvm/Pass.h"1415namespace llvm {1617class Function;18class LLT;19class raw_ostream;20class TargetRegisterClass;21class TargetRegisterInfo;2223struct ArgDescriptor {24private:25friend struct AMDGPUFunctionArgInfo;26friend class AMDGPUArgumentUsageInfo;2728union {29MCRegister Reg;30unsigned StackOffset;31};3233// Bitmask to locate argument within the register.34unsigned Mask;3536bool IsStack : 1;37bool IsSet : 1;3839public:40ArgDescriptor(unsigned Val = 0, unsigned Mask = ~0u, bool IsStack = false,41bool IsSet = false)42: Reg(Val), Mask(Mask), IsStack(IsStack), IsSet(IsSet) {}4344static ArgDescriptor createRegister(Register Reg, unsigned Mask = ~0u) {45return ArgDescriptor(Reg, Mask, false, true);46}4748static ArgDescriptor createStack(unsigned Offset, unsigned Mask = ~0u) {49return ArgDescriptor(Offset, Mask, true, true);50}5152static ArgDescriptor createArg(const ArgDescriptor &Arg, unsigned Mask) {53return ArgDescriptor(Arg.Reg, Mask, Arg.IsStack, Arg.IsSet);54}5556bool isSet() const {57return IsSet;58}5960explicit operator bool() const {61return isSet();62}6364bool isRegister() const {65return !IsStack;66}6768MCRegister getRegister() const {69assert(!IsStack);70return Reg;71}7273unsigned getStackOffset() const {74assert(IsStack);75return StackOffset;76}7778unsigned getMask() const {79return Mask;80}8182bool isMasked() const {83return Mask != ~0u;84}8586void print(raw_ostream &OS, const TargetRegisterInfo *TRI = nullptr) const;87};8889inline raw_ostream &operator<<(raw_ostream &OS, const ArgDescriptor &Arg) {90Arg.print(OS);91return OS;92}9394struct KernArgPreloadDescriptor : public ArgDescriptor {95KernArgPreloadDescriptor() {}96SmallVector<MCRegister> Regs;97};9899struct AMDGPUFunctionArgInfo {100// clang-format off101enum PreloadedValue {102// SGPRS:103PRIVATE_SEGMENT_BUFFER = 0,104DISPATCH_PTR = 1,105QUEUE_PTR = 2,106KERNARG_SEGMENT_PTR = 3,107DISPATCH_ID = 4,108FLAT_SCRATCH_INIT = 5,109LDS_KERNEL_ID = 6, // LLVM internal, not part of the ABI110WORKGROUP_ID_X = 10,111WORKGROUP_ID_Y = 11,112WORKGROUP_ID_Z = 12,113PRIVATE_SEGMENT_WAVE_BYTE_OFFSET = 14,114IMPLICIT_BUFFER_PTR = 15,115IMPLICIT_ARG_PTR = 16,116PRIVATE_SEGMENT_SIZE = 17,117118// VGPRS:119WORKITEM_ID_X = 18,120WORKITEM_ID_Y = 19,121WORKITEM_ID_Z = 20,122FIRST_VGPR_VALUE = WORKITEM_ID_X123};124// clang-format on125126// Kernel input registers setup for the HSA ABI in allocation order.127128// User SGPRs in kernels129// XXX - Can these require argument spills?130ArgDescriptor PrivateSegmentBuffer;131ArgDescriptor DispatchPtr;132ArgDescriptor QueuePtr;133ArgDescriptor KernargSegmentPtr;134ArgDescriptor DispatchID;135ArgDescriptor FlatScratchInit;136ArgDescriptor PrivateSegmentSize;137ArgDescriptor LDSKernelId;138139// System SGPRs in kernels.140ArgDescriptor WorkGroupIDX;141ArgDescriptor WorkGroupIDY;142ArgDescriptor WorkGroupIDZ;143ArgDescriptor WorkGroupInfo;144ArgDescriptor PrivateSegmentWaveByteOffset;145146// Pointer with offset from kernargsegmentptr to where special ABI arguments147// are passed to callable functions.148ArgDescriptor ImplicitArgPtr;149150// Input registers for non-HSA ABI151ArgDescriptor ImplicitBufferPtr;152153// VGPRs inputs. For entry functions these are either v0, v1 and v2 or packed154// into v0, 10 bits per dimension if packed-tid is set.155ArgDescriptor WorkItemIDX;156ArgDescriptor WorkItemIDY;157ArgDescriptor WorkItemIDZ;158159// Map the index of preloaded kernel arguments to its descriptor.160SmallDenseMap<int, KernArgPreloadDescriptor> PreloadKernArgs{};161162std::tuple<const ArgDescriptor *, const TargetRegisterClass *, LLT>163getPreloadedValue(PreloadedValue Value) const;164165static AMDGPUFunctionArgInfo fixedABILayout();166};167168class AMDGPUArgumentUsageInfo : public ImmutablePass {169private:170DenseMap<const Function *, AMDGPUFunctionArgInfo> ArgInfoMap;171172public:173static char ID;174175static const AMDGPUFunctionArgInfo ExternFunctionInfo;176static const AMDGPUFunctionArgInfo FixedABIFunctionInfo;177178AMDGPUArgumentUsageInfo() : ImmutablePass(ID) { }179180void getAnalysisUsage(AnalysisUsage &AU) const override {181AU.setPreservesAll();182}183184bool doInitialization(Module &M) override;185bool doFinalization(Module &M) override;186187void print(raw_ostream &OS, const Module *M = nullptr) const override;188189void setFuncArgInfo(const Function &F, const AMDGPUFunctionArgInfo &ArgInfo) {190ArgInfoMap[&F] = ArgInfo;191}192193const AMDGPUFunctionArgInfo &lookupFuncArgInfo(const Function &F) const;194};195196} // end namespace llvm197198#endif199200201