Path: blob/main/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.cpp
35294 views
//===----------------------------------------------------------------------===//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#include "AMDGPUArgumentUsageInfo.h"9#include "AMDGPU.h"10#include "AMDGPUTargetMachine.h"11#include "MCTargetDesc/AMDGPUMCTargetDesc.h"12#include "SIRegisterInfo.h"13#include "llvm/CodeGen/TargetRegisterInfo.h"14#include "llvm/IR/Function.h"15#include "llvm/Support/NativeFormatting.h"16#include "llvm/Support/raw_ostream.h"1718using namespace llvm;1920#define DEBUG_TYPE "amdgpu-argument-reg-usage-info"2122INITIALIZE_PASS(AMDGPUArgumentUsageInfo, DEBUG_TYPE,23"Argument Register Usage Information Storage", false, true)2425void ArgDescriptor::print(raw_ostream &OS,26const TargetRegisterInfo *TRI) const {27if (!isSet()) {28OS << "<not set>\n";29return;30}3132if (isRegister())33OS << "Reg " << printReg(getRegister(), TRI);34else35OS << "Stack offset " << getStackOffset();3637if (isMasked()) {38OS << " & ";39llvm::write_hex(OS, Mask, llvm::HexPrintStyle::PrefixLower);40}4142OS << '\n';43}4445char AMDGPUArgumentUsageInfo::ID = 0;4647const AMDGPUFunctionArgInfo AMDGPUArgumentUsageInfo::ExternFunctionInfo{};4849// Hardcoded registers from fixed function ABI50const AMDGPUFunctionArgInfo AMDGPUArgumentUsageInfo::FixedABIFunctionInfo51= AMDGPUFunctionArgInfo::fixedABILayout();5253bool AMDGPUArgumentUsageInfo::doInitialization(Module &M) {54return false;55}5657bool AMDGPUArgumentUsageInfo::doFinalization(Module &M) {58ArgInfoMap.clear();59return false;60}6162// TODO: Print preload kernargs?63void AMDGPUArgumentUsageInfo::print(raw_ostream &OS, const Module *M) const {64for (const auto &FI : ArgInfoMap) {65OS << "Arguments for " << FI.first->getName() << '\n'66<< " PrivateSegmentBuffer: " << FI.second.PrivateSegmentBuffer67<< " DispatchPtr: " << FI.second.DispatchPtr68<< " QueuePtr: " << FI.second.QueuePtr69<< " KernargSegmentPtr: " << FI.second.KernargSegmentPtr70<< " DispatchID: " << FI.second.DispatchID71<< " FlatScratchInit: " << FI.second.FlatScratchInit72<< " PrivateSegmentSize: " << FI.second.PrivateSegmentSize73<< " WorkGroupIDX: " << FI.second.WorkGroupIDX74<< " WorkGroupIDY: " << FI.second.WorkGroupIDY75<< " WorkGroupIDZ: " << FI.second.WorkGroupIDZ76<< " WorkGroupInfo: " << FI.second.WorkGroupInfo77<< " LDSKernelId: " << FI.second.LDSKernelId78<< " PrivateSegmentWaveByteOffset: "79<< FI.second.PrivateSegmentWaveByteOffset80<< " ImplicitBufferPtr: " << FI.second.ImplicitBufferPtr81<< " ImplicitArgPtr: " << FI.second.ImplicitArgPtr82<< " WorkItemIDX " << FI.second.WorkItemIDX83<< " WorkItemIDY " << FI.second.WorkItemIDY84<< " WorkItemIDZ " << FI.second.WorkItemIDZ85<< '\n';86}87}8889std::tuple<const ArgDescriptor *, const TargetRegisterClass *, LLT>90AMDGPUFunctionArgInfo::getPreloadedValue(91AMDGPUFunctionArgInfo::PreloadedValue Value) const {92switch (Value) {93case AMDGPUFunctionArgInfo::PRIVATE_SEGMENT_BUFFER: {94return std::tuple(PrivateSegmentBuffer ? &PrivateSegmentBuffer : nullptr,95&AMDGPU::SGPR_128RegClass, LLT::fixed_vector(4, 32));96}97case AMDGPUFunctionArgInfo::IMPLICIT_BUFFER_PTR:98return std::tuple(ImplicitBufferPtr ? &ImplicitBufferPtr : nullptr,99&AMDGPU::SGPR_64RegClass,100LLT::pointer(AMDGPUAS::CONSTANT_ADDRESS, 64));101case AMDGPUFunctionArgInfo::WORKGROUP_ID_X:102return std::tuple(WorkGroupIDX ? &WorkGroupIDX : nullptr,103&AMDGPU::SGPR_32RegClass, LLT::scalar(32));104case AMDGPUFunctionArgInfo::WORKGROUP_ID_Y:105return std::tuple(WorkGroupIDY ? &WorkGroupIDY : nullptr,106&AMDGPU::SGPR_32RegClass, LLT::scalar(32));107case AMDGPUFunctionArgInfo::WORKGROUP_ID_Z:108return std::tuple(WorkGroupIDZ ? &WorkGroupIDZ : nullptr,109&AMDGPU::SGPR_32RegClass, LLT::scalar(32));110case AMDGPUFunctionArgInfo::LDS_KERNEL_ID:111return std::tuple(LDSKernelId ? &LDSKernelId : nullptr,112&AMDGPU::SGPR_32RegClass, LLT::scalar(32));113case AMDGPUFunctionArgInfo::PRIVATE_SEGMENT_WAVE_BYTE_OFFSET:114return std::tuple(115PrivateSegmentWaveByteOffset ? &PrivateSegmentWaveByteOffset : nullptr,116&AMDGPU::SGPR_32RegClass, LLT::scalar(32));117case AMDGPUFunctionArgInfo::PRIVATE_SEGMENT_SIZE:118return {PrivateSegmentSize ? &PrivateSegmentSize : nullptr,119&AMDGPU::SGPR_32RegClass, LLT::scalar(32)};120case AMDGPUFunctionArgInfo::KERNARG_SEGMENT_PTR:121return std::tuple(KernargSegmentPtr ? &KernargSegmentPtr : nullptr,122&AMDGPU::SGPR_64RegClass,123LLT::pointer(AMDGPUAS::CONSTANT_ADDRESS, 64));124case AMDGPUFunctionArgInfo::IMPLICIT_ARG_PTR:125return std::tuple(ImplicitArgPtr ? &ImplicitArgPtr : nullptr,126&AMDGPU::SGPR_64RegClass,127LLT::pointer(AMDGPUAS::CONSTANT_ADDRESS, 64));128case AMDGPUFunctionArgInfo::DISPATCH_ID:129return std::tuple(DispatchID ? &DispatchID : nullptr,130&AMDGPU::SGPR_64RegClass, LLT::scalar(64));131case AMDGPUFunctionArgInfo::FLAT_SCRATCH_INIT:132return std::tuple(FlatScratchInit ? &FlatScratchInit : nullptr,133&AMDGPU::SGPR_64RegClass, LLT::scalar(64));134case AMDGPUFunctionArgInfo::DISPATCH_PTR:135return std::tuple(DispatchPtr ? &DispatchPtr : nullptr,136&AMDGPU::SGPR_64RegClass,137LLT::pointer(AMDGPUAS::CONSTANT_ADDRESS, 64));138case AMDGPUFunctionArgInfo::QUEUE_PTR:139return std::tuple(QueuePtr ? &QueuePtr : nullptr, &AMDGPU::SGPR_64RegClass,140LLT::pointer(AMDGPUAS::CONSTANT_ADDRESS, 64));141case AMDGPUFunctionArgInfo::WORKITEM_ID_X:142return std::tuple(WorkItemIDX ? &WorkItemIDX : nullptr,143&AMDGPU::VGPR_32RegClass, LLT::scalar(32));144case AMDGPUFunctionArgInfo::WORKITEM_ID_Y:145return std::tuple(WorkItemIDY ? &WorkItemIDY : nullptr,146&AMDGPU::VGPR_32RegClass, LLT::scalar(32));147case AMDGPUFunctionArgInfo::WORKITEM_ID_Z:148return std::tuple(WorkItemIDZ ? &WorkItemIDZ : nullptr,149&AMDGPU::VGPR_32RegClass, LLT::scalar(32));150}151llvm_unreachable("unexpected preloaded value type");152}153154AMDGPUFunctionArgInfo AMDGPUFunctionArgInfo::fixedABILayout() {155AMDGPUFunctionArgInfo AI;156AI.PrivateSegmentBuffer157= ArgDescriptor::createRegister(AMDGPU::SGPR0_SGPR1_SGPR2_SGPR3);158AI.DispatchPtr = ArgDescriptor::createRegister(AMDGPU::SGPR4_SGPR5);159AI.QueuePtr = ArgDescriptor::createRegister(AMDGPU::SGPR6_SGPR7);160161// Do not pass kernarg segment pointer, only pass increment version in its162// place.163AI.ImplicitArgPtr = ArgDescriptor::createRegister(AMDGPU::SGPR8_SGPR9);164AI.DispatchID = ArgDescriptor::createRegister(AMDGPU::SGPR10_SGPR11);165166// Skip FlatScratchInit/PrivateSegmentSize167AI.WorkGroupIDX = ArgDescriptor::createRegister(AMDGPU::SGPR12);168AI.WorkGroupIDY = ArgDescriptor::createRegister(AMDGPU::SGPR13);169AI.WorkGroupIDZ = ArgDescriptor::createRegister(AMDGPU::SGPR14);170AI.LDSKernelId = ArgDescriptor::createRegister(AMDGPU::SGPR15);171172const unsigned Mask = 0x3ff;173AI.WorkItemIDX = ArgDescriptor::createRegister(AMDGPU::VGPR31, Mask);174AI.WorkItemIDY = ArgDescriptor::createRegister(AMDGPU::VGPR31, Mask << 10);175AI.WorkItemIDZ = ArgDescriptor::createRegister(AMDGPU::VGPR31, Mask << 20);176return AI;177}178179const AMDGPUFunctionArgInfo &180AMDGPUArgumentUsageInfo::lookupFuncArgInfo(const Function &F) const {181auto I = ArgInfoMap.find(&F);182if (I == ArgInfoMap.end())183return FixedABIFunctionInfo;184return I->second;185}186187188