10b57cec5SDimitry Andric //===-- AMDGPU.h - MachineFunction passes hw codegen --------------*- C++ -*-=// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric /// \file 80b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPU_H 110b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_AMDGPU_H 120b57cec5SDimitry Andric 13e8d8bef9SDimitry Andric #include "llvm/IR/PassManager.h" 141fd87a68SDimitry Andric #include "llvm/Pass.h" 155f757f3fSDimitry Andric #include "llvm/Support/AMDGPUAddrSpace.h" 165ffd83dbSDimitry Andric #include "llvm/Support/CodeGen.h" 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric namespace llvm { 190b57cec5SDimitry Andric 205f757f3fSDimitry Andric class AMDGPUTargetMachine; 210b57cec5SDimitry Andric class TargetMachine; 220b57cec5SDimitry Andric 235ffd83dbSDimitry Andric // GlobalISel passes 245ffd83dbSDimitry Andric void initializeAMDGPUPreLegalizerCombinerPass(PassRegistry &); 255ffd83dbSDimitry Andric FunctionPass *createAMDGPUPreLegalizeCombiner(bool IsOptNone); 265ffd83dbSDimitry Andric void initializeAMDGPUPostLegalizerCombinerPass(PassRegistry &); 275ffd83dbSDimitry Andric FunctionPass *createAMDGPUPostLegalizeCombiner(bool IsOptNone); 285ffd83dbSDimitry Andric FunctionPass *createAMDGPURegBankCombiner(bool IsOptNone); 295ffd83dbSDimitry Andric void initializeAMDGPURegBankCombinerPass(PassRegistry &); 305ffd83dbSDimitry Andric 3106c3fb27SDimitry Andric void initializeAMDGPURegBankSelectPass(PassRegistry &); 3206c3fb27SDimitry Andric 330b57cec5SDimitry Andric // SI Passes 340b57cec5SDimitry Andric FunctionPass *createGCNDPPCombinePass(); 350b57cec5SDimitry Andric FunctionPass *createSIAnnotateControlFlowPass(); 360b57cec5SDimitry Andric FunctionPass *createSIFoldOperandsPass(); 370b57cec5SDimitry Andric FunctionPass *createSIPeepholeSDWAPass(); 380b57cec5SDimitry Andric FunctionPass *createSILowerI1CopiesPass(); 395f757f3fSDimitry Andric FunctionPass *createAMDGPUGlobalISelDivergenceLoweringPass(); 400b57cec5SDimitry Andric FunctionPass *createSIShrinkInstructionsPass(); 410b57cec5SDimitry Andric FunctionPass *createSILoadStoreOptimizerPass(); 420b57cec5SDimitry Andric FunctionPass *createSIWholeQuadModePass(); 430b57cec5SDimitry Andric FunctionPass *createSIFixControlFlowLiveIntervalsPass(); 440b57cec5SDimitry Andric FunctionPass *createSIOptimizeExecMaskingPreRAPass(); 45fe6060f1SDimitry Andric FunctionPass *createSIOptimizeVGPRLiveRangePass(); 460b57cec5SDimitry Andric FunctionPass *createSIFixSGPRCopiesPass(); 475f757f3fSDimitry Andric FunctionPass *createLowerWWMCopiesPass(); 480b57cec5SDimitry Andric FunctionPass *createSIMemoryLegalizerPass(); 490b57cec5SDimitry Andric FunctionPass *createSIInsertWaitcntsPass(); 500b57cec5SDimitry Andric FunctionPass *createSIPreAllocateWWMRegsPass(); 510b57cec5SDimitry Andric FunctionPass *createSIFormMemoryClausesPass(); 525ffd83dbSDimitry Andric 535ffd83dbSDimitry Andric FunctionPass *createSIPostRABundlerPass(); 545f757f3fSDimitry Andric FunctionPass *createAMDGPUImageIntrinsicOptimizerPass(const TargetMachine *); 5506c3fb27SDimitry Andric ModulePass *createAMDGPURemoveIncompatibleFunctionsPass(const TargetMachine *); 560b57cec5SDimitry Andric FunctionPass *createAMDGPUCodeGenPreparePass(); 57e8d8bef9SDimitry Andric FunctionPass *createAMDGPULateCodeGenPreparePass(); 580b57cec5SDimitry Andric FunctionPass *createAMDGPUMachineCFGStructurizerPass(); 590b57cec5SDimitry Andric FunctionPass *createAMDGPURewriteOutArgumentsPass(); 605f757f3fSDimitry Andric ModulePass * 615f757f3fSDimitry Andric createAMDGPULowerModuleLDSLegacyPass(const AMDGPUTargetMachine *TM = nullptr); 62*0fca6ea1SDimitry Andric ModulePass *createAMDGPULowerBufferFatPointersPass(); 630b57cec5SDimitry Andric FunctionPass *createSIModeRegisterPass(); 64fe6060f1SDimitry Andric FunctionPass *createGCNPreRAOptimizationsPass(); 650b57cec5SDimitry Andric 66e8d8bef9SDimitry Andric struct AMDGPUSimplifyLibCallsPass : PassInfoMixin<AMDGPUSimplifyLibCallsPass> { 675f757f3fSDimitry Andric AMDGPUSimplifyLibCallsPass() {} 685f757f3fSDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 695f757f3fSDimitry Andric }; 705f757f3fSDimitry Andric 715f757f3fSDimitry Andric struct AMDGPUImageIntrinsicOptimizerPass 725f757f3fSDimitry Andric : PassInfoMixin<AMDGPUImageIntrinsicOptimizerPass> { 735f757f3fSDimitry Andric AMDGPUImageIntrinsicOptimizerPass(TargetMachine &TM) : TM(TM) {} 74e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 75e8d8bef9SDimitry Andric 76e8d8bef9SDimitry Andric private: 77e8d8bef9SDimitry Andric TargetMachine &TM; 78e8d8bef9SDimitry Andric }; 79e8d8bef9SDimitry Andric 80e8d8bef9SDimitry Andric struct AMDGPUUseNativeCallsPass : PassInfoMixin<AMDGPUUseNativeCallsPass> { 81e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 82e8d8bef9SDimitry Andric }; 83e8d8bef9SDimitry Andric 84*0fca6ea1SDimitry Andric void initializeAMDGPUDAGToDAGISelLegacyPass(PassRegistry &); 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric void initializeAMDGPUMachineCFGStructurizerPass(PassRegistry&); 870b57cec5SDimitry Andric extern char &AMDGPUMachineCFGStructurizerID; 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric void initializeAMDGPUAlwaysInlinePass(PassRegistry&); 900b57cec5SDimitry Andric 910b57cec5SDimitry Andric Pass *createAMDGPUAnnotateKernelFeaturesPass(); 925f757f3fSDimitry Andric Pass *createAMDGPUAttributorLegacyPass(); 935f757f3fSDimitry Andric void initializeAMDGPUAttributorLegacyPass(PassRegistry &); 940b57cec5SDimitry Andric void initializeAMDGPUAnnotateKernelFeaturesPass(PassRegistry &); 950b57cec5SDimitry Andric extern char &AMDGPUAnnotateKernelFeaturesID; 960b57cec5SDimitry Andric 9706c3fb27SDimitry Andric // DPP/Iterative option enables the atomic optimizer with given strategy 9806c3fb27SDimitry Andric // whereas None disables the atomic optimizer. 9906c3fb27SDimitry Andric enum class ScanOptions { DPP, Iterative, None }; 10006c3fb27SDimitry Andric FunctionPass *createAMDGPUAtomicOptimizerPass(ScanOptions ScanStrategy); 1010b57cec5SDimitry Andric void initializeAMDGPUAtomicOptimizerPass(PassRegistry &); 1020b57cec5SDimitry Andric extern char &AMDGPUAtomicOptimizerID; 1030b57cec5SDimitry Andric 104bdd1243dSDimitry Andric ModulePass *createAMDGPUCtorDtorLoweringLegacyPass(); 105bdd1243dSDimitry Andric void initializeAMDGPUCtorDtorLoweringLegacyPass(PassRegistry &); 106bdd1243dSDimitry Andric extern char &AMDGPUCtorDtorLoweringLegacyPassID; 107349cc55cSDimitry Andric 1080b57cec5SDimitry Andric FunctionPass *createAMDGPULowerKernelArgumentsPass(); 1090b57cec5SDimitry Andric void initializeAMDGPULowerKernelArgumentsPass(PassRegistry &); 1100b57cec5SDimitry Andric extern char &AMDGPULowerKernelArgumentsID; 1110b57cec5SDimitry Andric 112349cc55cSDimitry Andric FunctionPass *createAMDGPUPromoteKernelArgumentsPass(); 113349cc55cSDimitry Andric void initializeAMDGPUPromoteKernelArgumentsPass(PassRegistry &); 114349cc55cSDimitry Andric extern char &AMDGPUPromoteKernelArgumentsID; 115349cc55cSDimitry Andric 116349cc55cSDimitry Andric struct AMDGPUPromoteKernelArgumentsPass 117349cc55cSDimitry Andric : PassInfoMixin<AMDGPUPromoteKernelArgumentsPass> { 118349cc55cSDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 119349cc55cSDimitry Andric }; 120349cc55cSDimitry Andric 1210b57cec5SDimitry Andric ModulePass *createAMDGPULowerKernelAttributesPass(); 1220b57cec5SDimitry Andric void initializeAMDGPULowerKernelAttributesPass(PassRegistry &); 1230b57cec5SDimitry Andric extern char &AMDGPULowerKernelAttributesID; 1240b57cec5SDimitry Andric 125e8d8bef9SDimitry Andric struct AMDGPULowerKernelAttributesPass 126e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPULowerKernelAttributesPass> { 127e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 128e8d8bef9SDimitry Andric }; 129e8d8bef9SDimitry Andric 1305f757f3fSDimitry Andric void initializeAMDGPULowerModuleLDSLegacyPass(PassRegistry &); 1315f757f3fSDimitry Andric extern char &AMDGPULowerModuleLDSLegacyPassID; 132fe6060f1SDimitry Andric 133fe6060f1SDimitry Andric struct AMDGPULowerModuleLDSPass : PassInfoMixin<AMDGPULowerModuleLDSPass> { 1345f757f3fSDimitry Andric const AMDGPUTargetMachine &TM; 1355f757f3fSDimitry Andric AMDGPULowerModuleLDSPass(const AMDGPUTargetMachine &TM_) : TM(TM_) {} 1365f757f3fSDimitry Andric 137fe6060f1SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 138fe6060f1SDimitry Andric }; 139fe6060f1SDimitry Andric 140*0fca6ea1SDimitry Andric void initializeAMDGPULowerBufferFatPointersPass(PassRegistry &); 141*0fca6ea1SDimitry Andric extern char &AMDGPULowerBufferFatPointersID; 142*0fca6ea1SDimitry Andric 143*0fca6ea1SDimitry Andric struct AMDGPULowerBufferFatPointersPass 144*0fca6ea1SDimitry Andric : PassInfoMixin<AMDGPULowerBufferFatPointersPass> { 145*0fca6ea1SDimitry Andric AMDGPULowerBufferFatPointersPass(const TargetMachine &TM) : TM(TM) {} 146*0fca6ea1SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 147*0fca6ea1SDimitry Andric 148*0fca6ea1SDimitry Andric private: 149*0fca6ea1SDimitry Andric const TargetMachine &TM; 150*0fca6ea1SDimitry Andric }; 151*0fca6ea1SDimitry Andric 1520b57cec5SDimitry Andric void initializeAMDGPURewriteOutArgumentsPass(PassRegistry &); 1530b57cec5SDimitry Andric extern char &AMDGPURewriteOutArgumentsID; 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andric void initializeGCNDPPCombinePass(PassRegistry &); 1560b57cec5SDimitry Andric extern char &GCNDPPCombineID; 1570b57cec5SDimitry Andric 1580b57cec5SDimitry Andric void initializeSIFoldOperandsPass(PassRegistry &); 1590b57cec5SDimitry Andric extern char &SIFoldOperandsID; 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric void initializeSIPeepholeSDWAPass(PassRegistry &); 1620b57cec5SDimitry Andric extern char &SIPeepholeSDWAID; 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric void initializeSIShrinkInstructionsPass(PassRegistry&); 1650b57cec5SDimitry Andric extern char &SIShrinkInstructionsID; 1660b57cec5SDimitry Andric 1670b57cec5SDimitry Andric void initializeSIFixSGPRCopiesPass(PassRegistry &); 1680b57cec5SDimitry Andric extern char &SIFixSGPRCopiesID; 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric void initializeSIFixVGPRCopiesPass(PassRegistry &); 1710b57cec5SDimitry Andric extern char &SIFixVGPRCopiesID; 1720b57cec5SDimitry Andric 1735f757f3fSDimitry Andric void initializeSILowerWWMCopiesPass(PassRegistry &); 1745f757f3fSDimitry Andric extern char &SILowerWWMCopiesID; 1755f757f3fSDimitry Andric 1760b57cec5SDimitry Andric void initializeSILowerI1CopiesPass(PassRegistry &); 1770b57cec5SDimitry Andric extern char &SILowerI1CopiesID; 1780b57cec5SDimitry Andric 1795f757f3fSDimitry Andric void initializeAMDGPUGlobalISelDivergenceLoweringPass(PassRegistry &); 1805f757f3fSDimitry Andric extern char &AMDGPUGlobalISelDivergenceLoweringID; 1815f757f3fSDimitry Andric 1827a6dacacSDimitry Andric void initializeAMDGPUMarkLastScratchLoadPass(PassRegistry &); 1837a6dacacSDimitry Andric extern char &AMDGPUMarkLastScratchLoadID; 1847a6dacacSDimitry Andric 1850b57cec5SDimitry Andric void initializeSILowerSGPRSpillsPass(PassRegistry &); 1860b57cec5SDimitry Andric extern char &SILowerSGPRSpillsID; 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andric void initializeSILoadStoreOptimizerPass(PassRegistry &); 1890b57cec5SDimitry Andric extern char &SILoadStoreOptimizerID; 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andric void initializeSIWholeQuadModePass(PassRegistry &); 1920b57cec5SDimitry Andric extern char &SIWholeQuadModeID; 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric void initializeSILowerControlFlowPass(PassRegistry &); 1950b57cec5SDimitry Andric extern char &SILowerControlFlowID; 1960b57cec5SDimitry Andric 1975ffd83dbSDimitry Andric void initializeSIPreEmitPeepholePass(PassRegistry &); 1985ffd83dbSDimitry Andric extern char &SIPreEmitPeepholeID; 1995ffd83dbSDimitry Andric 200fe6060f1SDimitry Andric void initializeSILateBranchLoweringPass(PassRegistry &); 201fe6060f1SDimitry Andric extern char &SILateBranchLoweringPassID; 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPass(PassRegistry &); 2040b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingID; 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andric void initializeSIPreAllocateWWMRegsPass(PassRegistry &); 2070b57cec5SDimitry Andric extern char &SIPreAllocateWWMRegsID; 2080b57cec5SDimitry Andric 2095f757f3fSDimitry Andric void initializeAMDGPUImageIntrinsicOptimizerPass(PassRegistry &); 2105f757f3fSDimitry Andric extern char &AMDGPUImageIntrinsicOptimizerID; 2110b57cec5SDimitry Andric 2120b57cec5SDimitry Andric void initializeAMDGPUPerfHintAnalysisPass(PassRegistry &); 2130b57cec5SDimitry Andric extern char &AMDGPUPerfHintAnalysisID; 2140b57cec5SDimitry Andric 2155f757f3fSDimitry Andric void initializeGCNRegPressurePrinterPass(PassRegistry &); 2165f757f3fSDimitry Andric extern char &GCNRegPressurePrinterID; 2175f757f3fSDimitry Andric 2180b57cec5SDimitry Andric // Passes common to R600 and SI 2190b57cec5SDimitry Andric FunctionPass *createAMDGPUPromoteAlloca(); 2200b57cec5SDimitry Andric void initializeAMDGPUPromoteAllocaPass(PassRegistry&); 2210b57cec5SDimitry Andric extern char &AMDGPUPromoteAllocaID; 2220b57cec5SDimitry Andric 2235ffd83dbSDimitry Andric FunctionPass *createAMDGPUPromoteAllocaToVector(); 2245ffd83dbSDimitry Andric void initializeAMDGPUPromoteAllocaToVectorPass(PassRegistry&); 2255ffd83dbSDimitry Andric extern char &AMDGPUPromoteAllocaToVectorID; 2265ffd83dbSDimitry Andric 227e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaPass : PassInfoMixin<AMDGPUPromoteAllocaPass> { 228e8d8bef9SDimitry Andric AMDGPUPromoteAllocaPass(TargetMachine &TM) : TM(TM) {} 229e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 230e8d8bef9SDimitry Andric 231e8d8bef9SDimitry Andric private: 232e8d8bef9SDimitry Andric TargetMachine &TM; 233e8d8bef9SDimitry Andric }; 234e8d8bef9SDimitry Andric 235e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaToVectorPass 236e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPromoteAllocaToVectorPass> { 237e8d8bef9SDimitry Andric AMDGPUPromoteAllocaToVectorPass(TargetMachine &TM) : TM(TM) {} 238e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 239e8d8bef9SDimitry Andric 240e8d8bef9SDimitry Andric private: 241e8d8bef9SDimitry Andric TargetMachine &TM; 242e8d8bef9SDimitry Andric }; 243e8d8bef9SDimitry Andric 24406c3fb27SDimitry Andric struct AMDGPUAtomicOptimizerPass : PassInfoMixin<AMDGPUAtomicOptimizerPass> { 24506c3fb27SDimitry Andric AMDGPUAtomicOptimizerPass(TargetMachine &TM, ScanOptions ScanImpl) 24606c3fb27SDimitry Andric : TM(TM), ScanImpl(ScanImpl) {} 24706c3fb27SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 24806c3fb27SDimitry Andric 24906c3fb27SDimitry Andric private: 25006c3fb27SDimitry Andric TargetMachine &TM; 25106c3fb27SDimitry Andric ScanOptions ScanImpl; 25206c3fb27SDimitry Andric }; 25306c3fb27SDimitry Andric 2540b57cec5SDimitry Andric Pass *createAMDGPUStructurizeCFGPass(); 2555f757f3fSDimitry Andric FunctionPass *createAMDGPUISelDag(TargetMachine &TM, CodeGenOptLevel OptLevel); 2560b57cec5SDimitry Andric ModulePass *createAMDGPUAlwaysInlinePass(bool GlobalOpt = true); 257e8d8bef9SDimitry Andric 258e8d8bef9SDimitry Andric struct AMDGPUAlwaysInlinePass : PassInfoMixin<AMDGPUAlwaysInlinePass> { 259e8d8bef9SDimitry Andric AMDGPUAlwaysInlinePass(bool GlobalOpt = true) : GlobalOpt(GlobalOpt) {} 260e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 261e8d8bef9SDimitry Andric 262e8d8bef9SDimitry Andric private: 263e8d8bef9SDimitry Andric bool GlobalOpt; 264e8d8bef9SDimitry Andric }; 265e8d8bef9SDimitry Andric 26606c3fb27SDimitry Andric class AMDGPUCodeGenPreparePass 26706c3fb27SDimitry Andric : public PassInfoMixin<AMDGPUCodeGenPreparePass> { 26806c3fb27SDimitry Andric private: 26906c3fb27SDimitry Andric TargetMachine &TM; 27006c3fb27SDimitry Andric 27106c3fb27SDimitry Andric public: 27206c3fb27SDimitry Andric AMDGPUCodeGenPreparePass(TargetMachine &TM) : TM(TM){}; 27306c3fb27SDimitry Andric PreservedAnalyses run(Function &, FunctionAnalysisManager &); 27406c3fb27SDimitry Andric }; 27506c3fb27SDimitry Andric 2765f757f3fSDimitry Andric class AMDGPULowerKernelArgumentsPass 2775f757f3fSDimitry Andric : public PassInfoMixin<AMDGPULowerKernelArgumentsPass> { 2785f757f3fSDimitry Andric private: 2795f757f3fSDimitry Andric TargetMachine &TM; 2805f757f3fSDimitry Andric 2815f757f3fSDimitry Andric public: 2825f757f3fSDimitry Andric AMDGPULowerKernelArgumentsPass(TargetMachine &TM) : TM(TM){}; 2835f757f3fSDimitry Andric PreservedAnalyses run(Function &, FunctionAnalysisManager &); 2845f757f3fSDimitry Andric }; 2855f757f3fSDimitry Andric 2865f757f3fSDimitry Andric class AMDGPUAttributorPass : public PassInfoMixin<AMDGPUAttributorPass> { 2875f757f3fSDimitry Andric private: 2885f757f3fSDimitry Andric TargetMachine &TM; 2895f757f3fSDimitry Andric 2905f757f3fSDimitry Andric public: 2915f757f3fSDimitry Andric AMDGPUAttributorPass(TargetMachine &TM) : TM(TM){}; 2925f757f3fSDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 2935f757f3fSDimitry Andric }; 2945f757f3fSDimitry Andric 2950b57cec5SDimitry Andric FunctionPass *createAMDGPUAnnotateUniformValues(); 2960b57cec5SDimitry Andric 2978bcb0991SDimitry Andric ModulePass *createAMDGPUPrintfRuntimeBinding(); 2988bcb0991SDimitry Andric void initializeAMDGPUPrintfRuntimeBindingPass(PassRegistry&); 2998bcb0991SDimitry Andric extern char &AMDGPUPrintfRuntimeBindingID; 3008bcb0991SDimitry Andric 301fe6060f1SDimitry Andric void initializeAMDGPUResourceUsageAnalysisPass(PassRegistry &); 302fe6060f1SDimitry Andric extern char &AMDGPUResourceUsageAnalysisID; 303fe6060f1SDimitry Andric 304e8d8bef9SDimitry Andric struct AMDGPUPrintfRuntimeBindingPass 305e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPrintfRuntimeBindingPass> { 306e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 307e8d8bef9SDimitry Andric }; 308e8d8bef9SDimitry Andric 3090b57cec5SDimitry Andric ModulePass* createAMDGPUUnifyMetadataPass(); 3100b57cec5SDimitry Andric void initializeAMDGPUUnifyMetadataPass(PassRegistry&); 3110b57cec5SDimitry Andric extern char &AMDGPUUnifyMetadataID; 3120b57cec5SDimitry Andric 313e8d8bef9SDimitry Andric struct AMDGPUUnifyMetadataPass : PassInfoMixin<AMDGPUUnifyMetadataPass> { 314e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 315e8d8bef9SDimitry Andric }; 316e8d8bef9SDimitry Andric 3170b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPreRAPass(PassRegistry&); 3180b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingPreRAID; 3190b57cec5SDimitry Andric 320fe6060f1SDimitry Andric void initializeSIOptimizeVGPRLiveRangePass(PassRegistry &); 321fe6060f1SDimitry Andric extern char &SIOptimizeVGPRLiveRangeID; 322fe6060f1SDimitry Andric 3230b57cec5SDimitry Andric void initializeAMDGPUAnnotateUniformValuesPass(PassRegistry&); 3240b57cec5SDimitry Andric extern char &AMDGPUAnnotateUniformValuesPassID; 3250b57cec5SDimitry Andric 3260b57cec5SDimitry Andric void initializeAMDGPUCodeGenPreparePass(PassRegistry&); 3270b57cec5SDimitry Andric extern char &AMDGPUCodeGenPrepareID; 3280b57cec5SDimitry Andric 32906c3fb27SDimitry Andric void initializeAMDGPURemoveIncompatibleFunctionsPass(PassRegistry &); 33006c3fb27SDimitry Andric extern char &AMDGPURemoveIncompatibleFunctionsID; 33106c3fb27SDimitry Andric 332e8d8bef9SDimitry Andric void initializeAMDGPULateCodeGenPreparePass(PassRegistry &); 333e8d8bef9SDimitry Andric extern char &AMDGPULateCodeGenPrepareID; 334e8d8bef9SDimitry Andric 3355f757f3fSDimitry Andric FunctionPass *createAMDGPURewriteUndefForPHILegacyPass(); 3365f757f3fSDimitry Andric void initializeAMDGPURewriteUndefForPHILegacyPass(PassRegistry &); 3375f757f3fSDimitry Andric extern char &AMDGPURewriteUndefForPHILegacyPassID; 3385f757f3fSDimitry Andric 3395f757f3fSDimitry Andric class AMDGPURewriteUndefForPHIPass 3405f757f3fSDimitry Andric : public PassInfoMixin<AMDGPURewriteUndefForPHIPass> { 3415f757f3fSDimitry Andric public: 3425f757f3fSDimitry Andric AMDGPURewriteUndefForPHIPass() = default; 3435f757f3fSDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 3445f757f3fSDimitry Andric }; 345bdd1243dSDimitry Andric 3460b57cec5SDimitry Andric void initializeSIAnnotateControlFlowPass(PassRegistry&); 3470b57cec5SDimitry Andric extern char &SIAnnotateControlFlowPassID; 3480b57cec5SDimitry Andric 3490b57cec5SDimitry Andric void initializeSIMemoryLegalizerPass(PassRegistry&); 3500b57cec5SDimitry Andric extern char &SIMemoryLegalizerID; 3510b57cec5SDimitry Andric 3520b57cec5SDimitry Andric void initializeSIModeRegisterPass(PassRegistry&); 3530b57cec5SDimitry Andric extern char &SIModeRegisterID; 3540b57cec5SDimitry Andric 35581ad6265SDimitry Andric void initializeAMDGPUInsertDelayAluPass(PassRegistry &); 35681ad6265SDimitry Andric extern char &AMDGPUInsertDelayAluID; 35781ad6265SDimitry Andric 3585f757f3fSDimitry Andric void initializeAMDGPUInsertSingleUseVDSTPass(PassRegistry &); 3595f757f3fSDimitry Andric extern char &AMDGPUInsertSingleUseVDSTID; 3605f757f3fSDimitry Andric 3615ffd83dbSDimitry Andric void initializeSIInsertHardClausesPass(PassRegistry &); 3625ffd83dbSDimitry Andric extern char &SIInsertHardClausesID; 3635ffd83dbSDimitry Andric 3640b57cec5SDimitry Andric void initializeSIInsertWaitcntsPass(PassRegistry&); 3650b57cec5SDimitry Andric extern char &SIInsertWaitcntsID; 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andric void initializeSIFormMemoryClausesPass(PassRegistry&); 3680b57cec5SDimitry Andric extern char &SIFormMemoryClausesID; 3690b57cec5SDimitry Andric 3705ffd83dbSDimitry Andric void initializeSIPostRABundlerPass(PassRegistry&); 3715ffd83dbSDimitry Andric extern char &SIPostRABundlerID; 3725ffd83dbSDimitry Andric 373753f127fSDimitry Andric void initializeGCNCreateVOPDPass(PassRegistry &); 374753f127fSDimitry Andric extern char &GCNCreateVOPDID; 375753f127fSDimitry Andric 3760b57cec5SDimitry Andric void initializeAMDGPUUnifyDivergentExitNodesPass(PassRegistry&); 3770b57cec5SDimitry Andric extern char &AMDGPUUnifyDivergentExitNodesID; 3780b57cec5SDimitry Andric 3790b57cec5SDimitry Andric ImmutablePass *createAMDGPUAAWrapperPass(); 3800b57cec5SDimitry Andric void initializeAMDGPUAAWrapperPassPass(PassRegistry&); 3810b57cec5SDimitry Andric ImmutablePass *createAMDGPUExternalAAWrapperPass(); 3820b57cec5SDimitry Andric void initializeAMDGPUExternalAAWrapperPass(PassRegistry&); 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andric void initializeAMDGPUArgumentUsageInfoPass(PassRegistry &); 3850b57cec5SDimitry Andric 3860b57cec5SDimitry Andric ModulePass *createAMDGPUOpenCLEnqueuedBlockLoweringPass(); 3870b57cec5SDimitry Andric void initializeAMDGPUOpenCLEnqueuedBlockLoweringPass(PassRegistry &); 3880b57cec5SDimitry Andric extern char &AMDGPUOpenCLEnqueuedBlockLoweringID; 3890b57cec5SDimitry Andric 3900b57cec5SDimitry Andric void initializeGCNNSAReassignPass(PassRegistry &); 3910b57cec5SDimitry Andric extern char &GCNNSAReassignID; 3920b57cec5SDimitry Andric 39306c3fb27SDimitry Andric void initializeGCNPreRALongBranchRegPass(PassRegistry &); 39406c3fb27SDimitry Andric extern char &GCNPreRALongBranchRegID; 39506c3fb27SDimitry Andric 396fe6060f1SDimitry Andric void initializeGCNPreRAOptimizationsPass(PassRegistry &); 397fe6060f1SDimitry Andric extern char &GCNPreRAOptimizationsID; 398fe6060f1SDimitry Andric 39981ad6265SDimitry Andric FunctionPass *createAMDGPUSetWavePriorityPass(); 40081ad6265SDimitry Andric void initializeAMDGPUSetWavePriorityPass(PassRegistry &); 40181ad6265SDimitry Andric 40206c3fb27SDimitry Andric void initializeGCNRewritePartialRegUsesPass(llvm::PassRegistry &); 40306c3fb27SDimitry Andric extern char &GCNRewritePartialRegUsesID; 40406c3fb27SDimitry Andric 4050b57cec5SDimitry Andric namespace AMDGPU { 4060b57cec5SDimitry Andric enum TargetIndex { 4070b57cec5SDimitry Andric TI_CONSTDATA_START, 4080b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD0, 4090b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD1, 4100b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD2, 4110b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD3 4120b57cec5SDimitry Andric }; 413e8d8bef9SDimitry Andric 414e8d8bef9SDimitry Andric // FIXME: Missing constant_32bit 415e8d8bef9SDimitry Andric inline bool isFlatGlobalAddrSpace(unsigned AS) { 416e8d8bef9SDimitry Andric return AS == AMDGPUAS::GLOBAL_ADDRESS || 417e8d8bef9SDimitry Andric AS == AMDGPUAS::FLAT_ADDRESS || 418e8d8bef9SDimitry Andric AS == AMDGPUAS::CONSTANT_ADDRESS || 419e8d8bef9SDimitry Andric AS > AMDGPUAS::MAX_AMDGPU_ADDRESS; 420e8d8bef9SDimitry Andric } 42106c3fb27SDimitry Andric 42206c3fb27SDimitry Andric inline bool isExtendedGlobalAddrSpace(unsigned AS) { 42306c3fb27SDimitry Andric return AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::CONSTANT_ADDRESS || 42406c3fb27SDimitry Andric AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT || 42506c3fb27SDimitry Andric AS > AMDGPUAS::MAX_AMDGPU_ADDRESS; 42606c3fb27SDimitry Andric } 42706c3fb27SDimitry Andric 42806c3fb27SDimitry Andric static inline bool addrspacesMayAlias(unsigned AS1, unsigned AS2) { 4295f757f3fSDimitry Andric static_assert(AMDGPUAS::MAX_AMDGPU_ADDRESS <= 9, "Addr space out of range"); 43006c3fb27SDimitry Andric 43106c3fb27SDimitry Andric if (AS1 > AMDGPUAS::MAX_AMDGPU_ADDRESS || AS2 > AMDGPUAS::MAX_AMDGPU_ADDRESS) 43206c3fb27SDimitry Andric return true; 43306c3fb27SDimitry Andric 4345f757f3fSDimitry Andric // This array is indexed by address space value enum elements 0 ... to 9 43506c3fb27SDimitry Andric // clang-format off 4365f757f3fSDimitry Andric static const bool ASAliasRules[10][10] = { 4375f757f3fSDimitry Andric /* Flat Global Region Group Constant Private Const32 BufFatPtr BufRsrc BufStrdPtr */ 4385f757f3fSDimitry Andric /* Flat */ {true, true, false, true, true, true, true, true, true, true}, 4395f757f3fSDimitry Andric /* Global */ {true, true, false, false, true, false, true, true, true, true}, 4405f757f3fSDimitry Andric /* Region */ {false, false, true, false, false, false, false, false, false, false}, 4415f757f3fSDimitry Andric /* Group */ {true, false, false, true, false, false, false, false, false, false}, 4425f757f3fSDimitry Andric /* Constant */ {true, true, false, false, false, false, true, true, true, true}, 4435f757f3fSDimitry Andric /* Private */ {true, false, false, false, false, true, false, false, false, false}, 4445f757f3fSDimitry Andric /* Constant 32-bit */ {true, true, false, false, true, false, false, true, true, true}, 4455f757f3fSDimitry Andric /* Buffer Fat Ptr */ {true, true, false, false, true, false, true, true, true, true}, 4465f757f3fSDimitry Andric /* Buffer Resource */ {true, true, false, false, true, false, true, true, true, true}, 4475f757f3fSDimitry Andric /* Buffer Strided Ptr */ {true, true, false, false, true, false, true, true, true, true}, 44806c3fb27SDimitry Andric }; 44906c3fb27SDimitry Andric // clang-format on 45006c3fb27SDimitry Andric 45106c3fb27SDimitry Andric return ASAliasRules[AS1][AS2]; 45206c3fb27SDimitry Andric } 45306c3fb27SDimitry Andric 454e8d8bef9SDimitry Andric } 455e8d8bef9SDimitry Andric 456e8d8bef9SDimitry Andric } // End namespace llvm 457e8d8bef9SDimitry Andric 4580b57cec5SDimitry Andric #endif 459