Path: blob/main/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPU.h
35268 views
//===-- AMDGPU.h - MachineFunction passes hw codegen --------------*- 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/// \file7//===----------------------------------------------------------------------===//89#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPU_H10#define LLVM_LIB_TARGET_AMDGPU_AMDGPU_H1112#include "llvm/IR/PassManager.h"13#include "llvm/Pass.h"14#include "llvm/Support/AMDGPUAddrSpace.h"15#include "llvm/Support/CodeGen.h"1617namespace llvm {1819class AMDGPUTargetMachine;20class TargetMachine;2122// GlobalISel passes23void initializeAMDGPUPreLegalizerCombinerPass(PassRegistry &);24FunctionPass *createAMDGPUPreLegalizeCombiner(bool IsOptNone);25void initializeAMDGPUPostLegalizerCombinerPass(PassRegistry &);26FunctionPass *createAMDGPUPostLegalizeCombiner(bool IsOptNone);27FunctionPass *createAMDGPURegBankCombiner(bool IsOptNone);28void initializeAMDGPURegBankCombinerPass(PassRegistry &);2930void initializeAMDGPURegBankSelectPass(PassRegistry &);3132// SI Passes33FunctionPass *createGCNDPPCombinePass();34FunctionPass *createSIAnnotateControlFlowPass();35FunctionPass *createSIFoldOperandsPass();36FunctionPass *createSIPeepholeSDWAPass();37FunctionPass *createSILowerI1CopiesPass();38FunctionPass *createAMDGPUGlobalISelDivergenceLoweringPass();39FunctionPass *createSIShrinkInstructionsPass();40FunctionPass *createSILoadStoreOptimizerPass();41FunctionPass *createSIWholeQuadModePass();42FunctionPass *createSIFixControlFlowLiveIntervalsPass();43FunctionPass *createSIOptimizeExecMaskingPreRAPass();44FunctionPass *createSIOptimizeVGPRLiveRangePass();45FunctionPass *createSIFixSGPRCopiesPass();46FunctionPass *createLowerWWMCopiesPass();47FunctionPass *createSIMemoryLegalizerPass();48FunctionPass *createSIInsertWaitcntsPass();49FunctionPass *createSIPreAllocateWWMRegsPass();50FunctionPass *createSIFormMemoryClausesPass();5152FunctionPass *createSIPostRABundlerPass();53FunctionPass *createAMDGPUImageIntrinsicOptimizerPass(const TargetMachine *);54ModulePass *createAMDGPURemoveIncompatibleFunctionsPass(const TargetMachine *);55FunctionPass *createAMDGPUCodeGenPreparePass();56FunctionPass *createAMDGPULateCodeGenPreparePass();57FunctionPass *createAMDGPUMachineCFGStructurizerPass();58FunctionPass *createAMDGPURewriteOutArgumentsPass();59ModulePass *60createAMDGPULowerModuleLDSLegacyPass(const AMDGPUTargetMachine *TM = nullptr);61ModulePass *createAMDGPULowerBufferFatPointersPass();62FunctionPass *createSIModeRegisterPass();63FunctionPass *createGCNPreRAOptimizationsPass();6465struct AMDGPUSimplifyLibCallsPass : PassInfoMixin<AMDGPUSimplifyLibCallsPass> {66AMDGPUSimplifyLibCallsPass() {}67PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);68};6970struct AMDGPUImageIntrinsicOptimizerPass71: PassInfoMixin<AMDGPUImageIntrinsicOptimizerPass> {72AMDGPUImageIntrinsicOptimizerPass(TargetMachine &TM) : TM(TM) {}73PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);7475private:76TargetMachine &TM;77};7879struct AMDGPUUseNativeCallsPass : PassInfoMixin<AMDGPUUseNativeCallsPass> {80PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);81};8283void initializeAMDGPUDAGToDAGISelLegacyPass(PassRegistry &);8485void initializeAMDGPUMachineCFGStructurizerPass(PassRegistry&);86extern char &AMDGPUMachineCFGStructurizerID;8788void initializeAMDGPUAlwaysInlinePass(PassRegistry&);8990Pass *createAMDGPUAnnotateKernelFeaturesPass();91Pass *createAMDGPUAttributorLegacyPass();92void initializeAMDGPUAttributorLegacyPass(PassRegistry &);93void initializeAMDGPUAnnotateKernelFeaturesPass(PassRegistry &);94extern char &AMDGPUAnnotateKernelFeaturesID;9596// DPP/Iterative option enables the atomic optimizer with given strategy97// whereas None disables the atomic optimizer.98enum class ScanOptions { DPP, Iterative, None };99FunctionPass *createAMDGPUAtomicOptimizerPass(ScanOptions ScanStrategy);100void initializeAMDGPUAtomicOptimizerPass(PassRegistry &);101extern char &AMDGPUAtomicOptimizerID;102103ModulePass *createAMDGPUCtorDtorLoweringLegacyPass();104void initializeAMDGPUCtorDtorLoweringLegacyPass(PassRegistry &);105extern char &AMDGPUCtorDtorLoweringLegacyPassID;106107FunctionPass *createAMDGPULowerKernelArgumentsPass();108void initializeAMDGPULowerKernelArgumentsPass(PassRegistry &);109extern char &AMDGPULowerKernelArgumentsID;110111FunctionPass *createAMDGPUPromoteKernelArgumentsPass();112void initializeAMDGPUPromoteKernelArgumentsPass(PassRegistry &);113extern char &AMDGPUPromoteKernelArgumentsID;114115struct AMDGPUPromoteKernelArgumentsPass116: PassInfoMixin<AMDGPUPromoteKernelArgumentsPass> {117PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);118};119120ModulePass *createAMDGPULowerKernelAttributesPass();121void initializeAMDGPULowerKernelAttributesPass(PassRegistry &);122extern char &AMDGPULowerKernelAttributesID;123124struct AMDGPULowerKernelAttributesPass125: PassInfoMixin<AMDGPULowerKernelAttributesPass> {126PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);127};128129void initializeAMDGPULowerModuleLDSLegacyPass(PassRegistry &);130extern char &AMDGPULowerModuleLDSLegacyPassID;131132struct AMDGPULowerModuleLDSPass : PassInfoMixin<AMDGPULowerModuleLDSPass> {133const AMDGPUTargetMachine &TM;134AMDGPULowerModuleLDSPass(const AMDGPUTargetMachine &TM_) : TM(TM_) {}135136PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);137};138139void initializeAMDGPULowerBufferFatPointersPass(PassRegistry &);140extern char &AMDGPULowerBufferFatPointersID;141142struct AMDGPULowerBufferFatPointersPass143: PassInfoMixin<AMDGPULowerBufferFatPointersPass> {144AMDGPULowerBufferFatPointersPass(const TargetMachine &TM) : TM(TM) {}145PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);146147private:148const TargetMachine &TM;149};150151void initializeAMDGPURewriteOutArgumentsPass(PassRegistry &);152extern char &AMDGPURewriteOutArgumentsID;153154void initializeGCNDPPCombinePass(PassRegistry &);155extern char &GCNDPPCombineID;156157void initializeSIFoldOperandsPass(PassRegistry &);158extern char &SIFoldOperandsID;159160void initializeSIPeepholeSDWAPass(PassRegistry &);161extern char &SIPeepholeSDWAID;162163void initializeSIShrinkInstructionsPass(PassRegistry&);164extern char &SIShrinkInstructionsID;165166void initializeSIFixSGPRCopiesPass(PassRegistry &);167extern char &SIFixSGPRCopiesID;168169void initializeSIFixVGPRCopiesPass(PassRegistry &);170extern char &SIFixVGPRCopiesID;171172void initializeSILowerWWMCopiesPass(PassRegistry &);173extern char &SILowerWWMCopiesID;174175void initializeSILowerI1CopiesPass(PassRegistry &);176extern char &SILowerI1CopiesID;177178void initializeAMDGPUGlobalISelDivergenceLoweringPass(PassRegistry &);179extern char &AMDGPUGlobalISelDivergenceLoweringID;180181void initializeAMDGPUMarkLastScratchLoadPass(PassRegistry &);182extern char &AMDGPUMarkLastScratchLoadID;183184void initializeSILowerSGPRSpillsPass(PassRegistry &);185extern char &SILowerSGPRSpillsID;186187void initializeSILoadStoreOptimizerPass(PassRegistry &);188extern char &SILoadStoreOptimizerID;189190void initializeSIWholeQuadModePass(PassRegistry &);191extern char &SIWholeQuadModeID;192193void initializeSILowerControlFlowPass(PassRegistry &);194extern char &SILowerControlFlowID;195196void initializeSIPreEmitPeepholePass(PassRegistry &);197extern char &SIPreEmitPeepholeID;198199void initializeSILateBranchLoweringPass(PassRegistry &);200extern char &SILateBranchLoweringPassID;201202void initializeSIOptimizeExecMaskingPass(PassRegistry &);203extern char &SIOptimizeExecMaskingID;204205void initializeSIPreAllocateWWMRegsPass(PassRegistry &);206extern char &SIPreAllocateWWMRegsID;207208void initializeAMDGPUImageIntrinsicOptimizerPass(PassRegistry &);209extern char &AMDGPUImageIntrinsicOptimizerID;210211void initializeAMDGPUPerfHintAnalysisPass(PassRegistry &);212extern char &AMDGPUPerfHintAnalysisID;213214void initializeGCNRegPressurePrinterPass(PassRegistry &);215extern char &GCNRegPressurePrinterID;216217// Passes common to R600 and SI218FunctionPass *createAMDGPUPromoteAlloca();219void initializeAMDGPUPromoteAllocaPass(PassRegistry&);220extern char &AMDGPUPromoteAllocaID;221222FunctionPass *createAMDGPUPromoteAllocaToVector();223void initializeAMDGPUPromoteAllocaToVectorPass(PassRegistry&);224extern char &AMDGPUPromoteAllocaToVectorID;225226struct AMDGPUPromoteAllocaPass : PassInfoMixin<AMDGPUPromoteAllocaPass> {227AMDGPUPromoteAllocaPass(TargetMachine &TM) : TM(TM) {}228PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);229230private:231TargetMachine &TM;232};233234struct AMDGPUPromoteAllocaToVectorPass235: PassInfoMixin<AMDGPUPromoteAllocaToVectorPass> {236AMDGPUPromoteAllocaToVectorPass(TargetMachine &TM) : TM(TM) {}237PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);238239private:240TargetMachine &TM;241};242243struct AMDGPUAtomicOptimizerPass : PassInfoMixin<AMDGPUAtomicOptimizerPass> {244AMDGPUAtomicOptimizerPass(TargetMachine &TM, ScanOptions ScanImpl)245: TM(TM), ScanImpl(ScanImpl) {}246PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);247248private:249TargetMachine &TM;250ScanOptions ScanImpl;251};252253Pass *createAMDGPUStructurizeCFGPass();254FunctionPass *createAMDGPUISelDag(TargetMachine &TM, CodeGenOptLevel OptLevel);255ModulePass *createAMDGPUAlwaysInlinePass(bool GlobalOpt = true);256257struct AMDGPUAlwaysInlinePass : PassInfoMixin<AMDGPUAlwaysInlinePass> {258AMDGPUAlwaysInlinePass(bool GlobalOpt = true) : GlobalOpt(GlobalOpt) {}259PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);260261private:262bool GlobalOpt;263};264265class AMDGPUCodeGenPreparePass266: public PassInfoMixin<AMDGPUCodeGenPreparePass> {267private:268TargetMachine &TM;269270public:271AMDGPUCodeGenPreparePass(TargetMachine &TM) : TM(TM){};272PreservedAnalyses run(Function &, FunctionAnalysisManager &);273};274275class AMDGPULowerKernelArgumentsPass276: public PassInfoMixin<AMDGPULowerKernelArgumentsPass> {277private:278TargetMachine &TM;279280public:281AMDGPULowerKernelArgumentsPass(TargetMachine &TM) : TM(TM){};282PreservedAnalyses run(Function &, FunctionAnalysisManager &);283};284285class AMDGPUAttributorPass : public PassInfoMixin<AMDGPUAttributorPass> {286private:287TargetMachine &TM;288289public:290AMDGPUAttributorPass(TargetMachine &TM) : TM(TM){};291PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);292};293294FunctionPass *createAMDGPUAnnotateUniformValues();295296ModulePass *createAMDGPUPrintfRuntimeBinding();297void initializeAMDGPUPrintfRuntimeBindingPass(PassRegistry&);298extern char &AMDGPUPrintfRuntimeBindingID;299300void initializeAMDGPUResourceUsageAnalysisPass(PassRegistry &);301extern char &AMDGPUResourceUsageAnalysisID;302303struct AMDGPUPrintfRuntimeBindingPass304: PassInfoMixin<AMDGPUPrintfRuntimeBindingPass> {305PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);306};307308ModulePass* createAMDGPUUnifyMetadataPass();309void initializeAMDGPUUnifyMetadataPass(PassRegistry&);310extern char &AMDGPUUnifyMetadataID;311312struct AMDGPUUnifyMetadataPass : PassInfoMixin<AMDGPUUnifyMetadataPass> {313PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);314};315316void initializeSIOptimizeExecMaskingPreRAPass(PassRegistry&);317extern char &SIOptimizeExecMaskingPreRAID;318319void initializeSIOptimizeVGPRLiveRangePass(PassRegistry &);320extern char &SIOptimizeVGPRLiveRangeID;321322void initializeAMDGPUAnnotateUniformValuesPass(PassRegistry&);323extern char &AMDGPUAnnotateUniformValuesPassID;324325void initializeAMDGPUCodeGenPreparePass(PassRegistry&);326extern char &AMDGPUCodeGenPrepareID;327328void initializeAMDGPURemoveIncompatibleFunctionsPass(PassRegistry &);329extern char &AMDGPURemoveIncompatibleFunctionsID;330331void initializeAMDGPULateCodeGenPreparePass(PassRegistry &);332extern char &AMDGPULateCodeGenPrepareID;333334FunctionPass *createAMDGPURewriteUndefForPHILegacyPass();335void initializeAMDGPURewriteUndefForPHILegacyPass(PassRegistry &);336extern char &AMDGPURewriteUndefForPHILegacyPassID;337338class AMDGPURewriteUndefForPHIPass339: public PassInfoMixin<AMDGPURewriteUndefForPHIPass> {340public:341AMDGPURewriteUndefForPHIPass() = default;342PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);343};344345void initializeSIAnnotateControlFlowPass(PassRegistry&);346extern char &SIAnnotateControlFlowPassID;347348void initializeSIMemoryLegalizerPass(PassRegistry&);349extern char &SIMemoryLegalizerID;350351void initializeSIModeRegisterPass(PassRegistry&);352extern char &SIModeRegisterID;353354void initializeAMDGPUInsertDelayAluPass(PassRegistry &);355extern char &AMDGPUInsertDelayAluID;356357void initializeAMDGPUInsertSingleUseVDSTPass(PassRegistry &);358extern char &AMDGPUInsertSingleUseVDSTID;359360void initializeSIInsertHardClausesPass(PassRegistry &);361extern char &SIInsertHardClausesID;362363void initializeSIInsertWaitcntsPass(PassRegistry&);364extern char &SIInsertWaitcntsID;365366void initializeSIFormMemoryClausesPass(PassRegistry&);367extern char &SIFormMemoryClausesID;368369void initializeSIPostRABundlerPass(PassRegistry&);370extern char &SIPostRABundlerID;371372void initializeGCNCreateVOPDPass(PassRegistry &);373extern char &GCNCreateVOPDID;374375void initializeAMDGPUUnifyDivergentExitNodesPass(PassRegistry&);376extern char &AMDGPUUnifyDivergentExitNodesID;377378ImmutablePass *createAMDGPUAAWrapperPass();379void initializeAMDGPUAAWrapperPassPass(PassRegistry&);380ImmutablePass *createAMDGPUExternalAAWrapperPass();381void initializeAMDGPUExternalAAWrapperPass(PassRegistry&);382383void initializeAMDGPUArgumentUsageInfoPass(PassRegistry &);384385ModulePass *createAMDGPUOpenCLEnqueuedBlockLoweringPass();386void initializeAMDGPUOpenCLEnqueuedBlockLoweringPass(PassRegistry &);387extern char &AMDGPUOpenCLEnqueuedBlockLoweringID;388389void initializeGCNNSAReassignPass(PassRegistry &);390extern char &GCNNSAReassignID;391392void initializeGCNPreRALongBranchRegPass(PassRegistry &);393extern char &GCNPreRALongBranchRegID;394395void initializeGCNPreRAOptimizationsPass(PassRegistry &);396extern char &GCNPreRAOptimizationsID;397398FunctionPass *createAMDGPUSetWavePriorityPass();399void initializeAMDGPUSetWavePriorityPass(PassRegistry &);400401void initializeGCNRewritePartialRegUsesPass(llvm::PassRegistry &);402extern char &GCNRewritePartialRegUsesID;403404namespace AMDGPU {405enum TargetIndex {406TI_CONSTDATA_START,407TI_SCRATCH_RSRC_DWORD0,408TI_SCRATCH_RSRC_DWORD1,409TI_SCRATCH_RSRC_DWORD2,410TI_SCRATCH_RSRC_DWORD3411};412413// FIXME: Missing constant_32bit414inline bool isFlatGlobalAddrSpace(unsigned AS) {415return AS == AMDGPUAS::GLOBAL_ADDRESS ||416AS == AMDGPUAS::FLAT_ADDRESS ||417AS == AMDGPUAS::CONSTANT_ADDRESS ||418AS > AMDGPUAS::MAX_AMDGPU_ADDRESS;419}420421inline bool isExtendedGlobalAddrSpace(unsigned AS) {422return AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::CONSTANT_ADDRESS ||423AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT ||424AS > AMDGPUAS::MAX_AMDGPU_ADDRESS;425}426427static inline bool addrspacesMayAlias(unsigned AS1, unsigned AS2) {428static_assert(AMDGPUAS::MAX_AMDGPU_ADDRESS <= 9, "Addr space out of range");429430if (AS1 > AMDGPUAS::MAX_AMDGPU_ADDRESS || AS2 > AMDGPUAS::MAX_AMDGPU_ADDRESS)431return true;432433// This array is indexed by address space value enum elements 0 ... to 9434// clang-format off435static const bool ASAliasRules[10][10] = {436/* Flat Global Region Group Constant Private Const32 BufFatPtr BufRsrc BufStrdPtr */437/* Flat */ {true, true, false, true, true, true, true, true, true, true},438/* Global */ {true, true, false, false, true, false, true, true, true, true},439/* Region */ {false, false, true, false, false, false, false, false, false, false},440/* Group */ {true, false, false, true, false, false, false, false, false, false},441/* Constant */ {true, true, false, false, false, false, true, true, true, true},442/* Private */ {true, false, false, false, false, true, false, false, false, false},443/* Constant 32-bit */ {true, true, false, false, true, false, false, true, true, true},444/* Buffer Fat Ptr */ {true, true, false, false, true, false, true, true, true, true},445/* Buffer Resource */ {true, true, false, false, true, false, true, true, true, true},446/* Buffer Strided Ptr */ {true, true, false, false, true, false, true, true, true, true},447};448// clang-format on449450return ASAliasRules[AS1][AS2];451}452453}454455} // End namespace llvm456457#endif458459460