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); 620b57cec5SDimitry Andric FunctionPass *createSIModeRegisterPass(); 63fe6060f1SDimitry Andric FunctionPass *createGCNPreRAOptimizationsPass(); 640b57cec5SDimitry Andric 65e8d8bef9SDimitry Andric struct AMDGPUSimplifyLibCallsPass : PassInfoMixin<AMDGPUSimplifyLibCallsPass> { 665f757f3fSDimitry Andric AMDGPUSimplifyLibCallsPass() {} 675f757f3fSDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 685f757f3fSDimitry Andric }; 695f757f3fSDimitry Andric 705f757f3fSDimitry Andric struct AMDGPUImageIntrinsicOptimizerPass 715f757f3fSDimitry Andric : PassInfoMixin<AMDGPUImageIntrinsicOptimizerPass> { 725f757f3fSDimitry Andric AMDGPUImageIntrinsicOptimizerPass(TargetMachine &TM) : TM(TM) {} 73e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 74e8d8bef9SDimitry Andric 75e8d8bef9SDimitry Andric private: 76e8d8bef9SDimitry Andric TargetMachine &TM; 77e8d8bef9SDimitry Andric }; 78e8d8bef9SDimitry Andric 79e8d8bef9SDimitry Andric struct AMDGPUUseNativeCallsPass : PassInfoMixin<AMDGPUUseNativeCallsPass> { 80e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 81e8d8bef9SDimitry Andric }; 82e8d8bef9SDimitry Andric 830b57cec5SDimitry Andric void initializeAMDGPUDAGToDAGISelPass(PassRegistry&); 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric void initializeAMDGPUMachineCFGStructurizerPass(PassRegistry&); 860b57cec5SDimitry Andric extern char &AMDGPUMachineCFGStructurizerID; 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric void initializeAMDGPUAlwaysInlinePass(PassRegistry&); 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric Pass *createAMDGPUAnnotateKernelFeaturesPass(); 915f757f3fSDimitry Andric Pass *createAMDGPUAttributorLegacyPass(); 925f757f3fSDimitry Andric void initializeAMDGPUAttributorLegacyPass(PassRegistry &); 930b57cec5SDimitry Andric void initializeAMDGPUAnnotateKernelFeaturesPass(PassRegistry &); 940b57cec5SDimitry Andric extern char &AMDGPUAnnotateKernelFeaturesID; 950b57cec5SDimitry Andric 9606c3fb27SDimitry Andric // DPP/Iterative option enables the atomic optimizer with given strategy 9706c3fb27SDimitry Andric // whereas None disables the atomic optimizer. 9806c3fb27SDimitry Andric enum class ScanOptions { DPP, Iterative, None }; 9906c3fb27SDimitry Andric FunctionPass *createAMDGPUAtomicOptimizerPass(ScanOptions ScanStrategy); 1000b57cec5SDimitry Andric void initializeAMDGPUAtomicOptimizerPass(PassRegistry &); 1010b57cec5SDimitry Andric extern char &AMDGPUAtomicOptimizerID; 1020b57cec5SDimitry Andric 103bdd1243dSDimitry Andric ModulePass *createAMDGPUCtorDtorLoweringLegacyPass(); 104bdd1243dSDimitry Andric void initializeAMDGPUCtorDtorLoweringLegacyPass(PassRegistry &); 105bdd1243dSDimitry Andric extern char &AMDGPUCtorDtorLoweringLegacyPassID; 106349cc55cSDimitry Andric 1070b57cec5SDimitry Andric FunctionPass *createAMDGPULowerKernelArgumentsPass(); 1080b57cec5SDimitry Andric void initializeAMDGPULowerKernelArgumentsPass(PassRegistry &); 1090b57cec5SDimitry Andric extern char &AMDGPULowerKernelArgumentsID; 1100b57cec5SDimitry Andric 111349cc55cSDimitry Andric FunctionPass *createAMDGPUPromoteKernelArgumentsPass(); 112349cc55cSDimitry Andric void initializeAMDGPUPromoteKernelArgumentsPass(PassRegistry &); 113349cc55cSDimitry Andric extern char &AMDGPUPromoteKernelArgumentsID; 114349cc55cSDimitry Andric 115349cc55cSDimitry Andric struct AMDGPUPromoteKernelArgumentsPass 116349cc55cSDimitry Andric : PassInfoMixin<AMDGPUPromoteKernelArgumentsPass> { 117349cc55cSDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 118349cc55cSDimitry Andric }; 119349cc55cSDimitry Andric 1200b57cec5SDimitry Andric ModulePass *createAMDGPULowerKernelAttributesPass(); 1210b57cec5SDimitry Andric void initializeAMDGPULowerKernelAttributesPass(PassRegistry &); 1220b57cec5SDimitry Andric extern char &AMDGPULowerKernelAttributesID; 1230b57cec5SDimitry Andric 124e8d8bef9SDimitry Andric struct AMDGPULowerKernelAttributesPass 125e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPULowerKernelAttributesPass> { 126e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 127e8d8bef9SDimitry Andric }; 128e8d8bef9SDimitry Andric 1295f757f3fSDimitry Andric void initializeAMDGPULowerModuleLDSLegacyPass(PassRegistry &); 1305f757f3fSDimitry Andric extern char &AMDGPULowerModuleLDSLegacyPassID; 131fe6060f1SDimitry Andric 132fe6060f1SDimitry Andric struct AMDGPULowerModuleLDSPass : PassInfoMixin<AMDGPULowerModuleLDSPass> { 1335f757f3fSDimitry Andric const AMDGPUTargetMachine &TM; 1345f757f3fSDimitry Andric AMDGPULowerModuleLDSPass(const AMDGPUTargetMachine &TM_) : TM(TM_) {} 1355f757f3fSDimitry Andric 136fe6060f1SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 137fe6060f1SDimitry Andric }; 138fe6060f1SDimitry Andric 1390b57cec5SDimitry Andric void initializeAMDGPURewriteOutArgumentsPass(PassRegistry &); 1400b57cec5SDimitry Andric extern char &AMDGPURewriteOutArgumentsID; 1410b57cec5SDimitry Andric 1420b57cec5SDimitry Andric void initializeGCNDPPCombinePass(PassRegistry &); 1430b57cec5SDimitry Andric extern char &GCNDPPCombineID; 1440b57cec5SDimitry Andric 1450b57cec5SDimitry Andric void initializeSIFoldOperandsPass(PassRegistry &); 1460b57cec5SDimitry Andric extern char &SIFoldOperandsID; 1470b57cec5SDimitry Andric 1480b57cec5SDimitry Andric void initializeSIPeepholeSDWAPass(PassRegistry &); 1490b57cec5SDimitry Andric extern char &SIPeepholeSDWAID; 1500b57cec5SDimitry Andric 1510b57cec5SDimitry Andric void initializeSIShrinkInstructionsPass(PassRegistry&); 1520b57cec5SDimitry Andric extern char &SIShrinkInstructionsID; 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andric void initializeSIFixSGPRCopiesPass(PassRegistry &); 1550b57cec5SDimitry Andric extern char &SIFixSGPRCopiesID; 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric void initializeSIFixVGPRCopiesPass(PassRegistry &); 1580b57cec5SDimitry Andric extern char &SIFixVGPRCopiesID; 1590b57cec5SDimitry Andric 1605f757f3fSDimitry Andric void initializeSILowerWWMCopiesPass(PassRegistry &); 1615f757f3fSDimitry Andric extern char &SILowerWWMCopiesID; 1625f757f3fSDimitry Andric 1630b57cec5SDimitry Andric void initializeSILowerI1CopiesPass(PassRegistry &); 1640b57cec5SDimitry Andric extern char &SILowerI1CopiesID; 1650b57cec5SDimitry Andric 1665f757f3fSDimitry Andric void initializeAMDGPUGlobalISelDivergenceLoweringPass(PassRegistry &); 1675f757f3fSDimitry Andric extern char &AMDGPUGlobalISelDivergenceLoweringID; 1685f757f3fSDimitry Andric 169*7a6dacacSDimitry Andric void initializeAMDGPUMarkLastScratchLoadPass(PassRegistry &); 170*7a6dacacSDimitry Andric extern char &AMDGPUMarkLastScratchLoadID; 171*7a6dacacSDimitry Andric 1720b57cec5SDimitry Andric void initializeSILowerSGPRSpillsPass(PassRegistry &); 1730b57cec5SDimitry Andric extern char &SILowerSGPRSpillsID; 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric void initializeSILoadStoreOptimizerPass(PassRegistry &); 1760b57cec5SDimitry Andric extern char &SILoadStoreOptimizerID; 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andric void initializeSIWholeQuadModePass(PassRegistry &); 1790b57cec5SDimitry Andric extern char &SIWholeQuadModeID; 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric void initializeSILowerControlFlowPass(PassRegistry &); 1820b57cec5SDimitry Andric extern char &SILowerControlFlowID; 1830b57cec5SDimitry Andric 1845ffd83dbSDimitry Andric void initializeSIPreEmitPeepholePass(PassRegistry &); 1855ffd83dbSDimitry Andric extern char &SIPreEmitPeepholeID; 1865ffd83dbSDimitry Andric 187fe6060f1SDimitry Andric void initializeSILateBranchLoweringPass(PassRegistry &); 188fe6060f1SDimitry Andric extern char &SILateBranchLoweringPassID; 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPass(PassRegistry &); 1910b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingID; 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric void initializeSIPreAllocateWWMRegsPass(PassRegistry &); 1940b57cec5SDimitry Andric extern char &SIPreAllocateWWMRegsID; 1950b57cec5SDimitry Andric 1965f757f3fSDimitry Andric void initializeAMDGPUImageIntrinsicOptimizerPass(PassRegistry &); 1975f757f3fSDimitry Andric extern char &AMDGPUImageIntrinsicOptimizerID; 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric void initializeAMDGPUPerfHintAnalysisPass(PassRegistry &); 2000b57cec5SDimitry Andric extern char &AMDGPUPerfHintAnalysisID; 2010b57cec5SDimitry Andric 2025f757f3fSDimitry Andric void initializeGCNRegPressurePrinterPass(PassRegistry &); 2035f757f3fSDimitry Andric extern char &GCNRegPressurePrinterID; 2045f757f3fSDimitry Andric 2050b57cec5SDimitry Andric // Passes common to R600 and SI 2060b57cec5SDimitry Andric FunctionPass *createAMDGPUPromoteAlloca(); 2070b57cec5SDimitry Andric void initializeAMDGPUPromoteAllocaPass(PassRegistry&); 2080b57cec5SDimitry Andric extern char &AMDGPUPromoteAllocaID; 2090b57cec5SDimitry Andric 2105ffd83dbSDimitry Andric FunctionPass *createAMDGPUPromoteAllocaToVector(); 2115ffd83dbSDimitry Andric void initializeAMDGPUPromoteAllocaToVectorPass(PassRegistry&); 2125ffd83dbSDimitry Andric extern char &AMDGPUPromoteAllocaToVectorID; 2135ffd83dbSDimitry Andric 214e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaPass : PassInfoMixin<AMDGPUPromoteAllocaPass> { 215e8d8bef9SDimitry Andric AMDGPUPromoteAllocaPass(TargetMachine &TM) : TM(TM) {} 216e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 217e8d8bef9SDimitry Andric 218e8d8bef9SDimitry Andric private: 219e8d8bef9SDimitry Andric TargetMachine &TM; 220e8d8bef9SDimitry Andric }; 221e8d8bef9SDimitry Andric 222e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaToVectorPass 223e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPromoteAllocaToVectorPass> { 224e8d8bef9SDimitry Andric AMDGPUPromoteAllocaToVectorPass(TargetMachine &TM) : TM(TM) {} 225e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 226e8d8bef9SDimitry Andric 227e8d8bef9SDimitry Andric private: 228e8d8bef9SDimitry Andric TargetMachine &TM; 229e8d8bef9SDimitry Andric }; 230e8d8bef9SDimitry Andric 23106c3fb27SDimitry Andric struct AMDGPUAtomicOptimizerPass : PassInfoMixin<AMDGPUAtomicOptimizerPass> { 23206c3fb27SDimitry Andric AMDGPUAtomicOptimizerPass(TargetMachine &TM, ScanOptions ScanImpl) 23306c3fb27SDimitry Andric : TM(TM), ScanImpl(ScanImpl) {} 23406c3fb27SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 23506c3fb27SDimitry Andric 23606c3fb27SDimitry Andric private: 23706c3fb27SDimitry Andric TargetMachine &TM; 23806c3fb27SDimitry Andric ScanOptions ScanImpl; 23906c3fb27SDimitry Andric }; 24006c3fb27SDimitry Andric 2410b57cec5SDimitry Andric Pass *createAMDGPUStructurizeCFGPass(); 2425f757f3fSDimitry Andric FunctionPass *createAMDGPUISelDag(TargetMachine &TM, CodeGenOptLevel OptLevel); 2430b57cec5SDimitry Andric ModulePass *createAMDGPUAlwaysInlinePass(bool GlobalOpt = true); 244e8d8bef9SDimitry Andric 245e8d8bef9SDimitry Andric struct AMDGPUAlwaysInlinePass : PassInfoMixin<AMDGPUAlwaysInlinePass> { 246e8d8bef9SDimitry Andric AMDGPUAlwaysInlinePass(bool GlobalOpt = true) : GlobalOpt(GlobalOpt) {} 247e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 248e8d8bef9SDimitry Andric 249e8d8bef9SDimitry Andric private: 250e8d8bef9SDimitry Andric bool GlobalOpt; 251e8d8bef9SDimitry Andric }; 252e8d8bef9SDimitry Andric 25306c3fb27SDimitry Andric class AMDGPUCodeGenPreparePass 25406c3fb27SDimitry Andric : public PassInfoMixin<AMDGPUCodeGenPreparePass> { 25506c3fb27SDimitry Andric private: 25606c3fb27SDimitry Andric TargetMachine &TM; 25706c3fb27SDimitry Andric 25806c3fb27SDimitry Andric public: 25906c3fb27SDimitry Andric AMDGPUCodeGenPreparePass(TargetMachine &TM) : TM(TM){}; 26006c3fb27SDimitry Andric PreservedAnalyses run(Function &, FunctionAnalysisManager &); 26106c3fb27SDimitry Andric }; 26206c3fb27SDimitry Andric 2635f757f3fSDimitry Andric class AMDGPULowerKernelArgumentsPass 2645f757f3fSDimitry Andric : public PassInfoMixin<AMDGPULowerKernelArgumentsPass> { 2655f757f3fSDimitry Andric private: 2665f757f3fSDimitry Andric TargetMachine &TM; 2675f757f3fSDimitry Andric 2685f757f3fSDimitry Andric public: 2695f757f3fSDimitry Andric AMDGPULowerKernelArgumentsPass(TargetMachine &TM) : TM(TM){}; 2705f757f3fSDimitry Andric PreservedAnalyses run(Function &, FunctionAnalysisManager &); 2715f757f3fSDimitry Andric }; 2725f757f3fSDimitry Andric 2735f757f3fSDimitry Andric class AMDGPUAttributorPass : public PassInfoMixin<AMDGPUAttributorPass> { 2745f757f3fSDimitry Andric private: 2755f757f3fSDimitry Andric TargetMachine &TM; 2765f757f3fSDimitry Andric 2775f757f3fSDimitry Andric public: 2785f757f3fSDimitry Andric AMDGPUAttributorPass(TargetMachine &TM) : TM(TM){}; 2795f757f3fSDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 2805f757f3fSDimitry Andric }; 2815f757f3fSDimitry Andric 2820b57cec5SDimitry Andric FunctionPass *createAMDGPUAnnotateUniformValues(); 2830b57cec5SDimitry Andric 2848bcb0991SDimitry Andric ModulePass *createAMDGPUPrintfRuntimeBinding(); 2858bcb0991SDimitry Andric void initializeAMDGPUPrintfRuntimeBindingPass(PassRegistry&); 2868bcb0991SDimitry Andric extern char &AMDGPUPrintfRuntimeBindingID; 2878bcb0991SDimitry Andric 288fe6060f1SDimitry Andric void initializeAMDGPUResourceUsageAnalysisPass(PassRegistry &); 289fe6060f1SDimitry Andric extern char &AMDGPUResourceUsageAnalysisID; 290fe6060f1SDimitry Andric 291e8d8bef9SDimitry Andric struct AMDGPUPrintfRuntimeBindingPass 292e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPrintfRuntimeBindingPass> { 293e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 294e8d8bef9SDimitry Andric }; 295e8d8bef9SDimitry Andric 2960b57cec5SDimitry Andric ModulePass* createAMDGPUUnifyMetadataPass(); 2970b57cec5SDimitry Andric void initializeAMDGPUUnifyMetadataPass(PassRegistry&); 2980b57cec5SDimitry Andric extern char &AMDGPUUnifyMetadataID; 2990b57cec5SDimitry Andric 300e8d8bef9SDimitry Andric struct AMDGPUUnifyMetadataPass : PassInfoMixin<AMDGPUUnifyMetadataPass> { 301e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 302e8d8bef9SDimitry Andric }; 303e8d8bef9SDimitry Andric 3040b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPreRAPass(PassRegistry&); 3050b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingPreRAID; 3060b57cec5SDimitry Andric 307fe6060f1SDimitry Andric void initializeSIOptimizeVGPRLiveRangePass(PassRegistry &); 308fe6060f1SDimitry Andric extern char &SIOptimizeVGPRLiveRangeID; 309fe6060f1SDimitry Andric 3100b57cec5SDimitry Andric void initializeAMDGPUAnnotateUniformValuesPass(PassRegistry&); 3110b57cec5SDimitry Andric extern char &AMDGPUAnnotateUniformValuesPassID; 3120b57cec5SDimitry Andric 3130b57cec5SDimitry Andric void initializeAMDGPUCodeGenPreparePass(PassRegistry&); 3140b57cec5SDimitry Andric extern char &AMDGPUCodeGenPrepareID; 3150b57cec5SDimitry Andric 31606c3fb27SDimitry Andric void initializeAMDGPURemoveIncompatibleFunctionsPass(PassRegistry &); 31706c3fb27SDimitry Andric extern char &AMDGPURemoveIncompatibleFunctionsID; 31806c3fb27SDimitry Andric 319e8d8bef9SDimitry Andric void initializeAMDGPULateCodeGenPreparePass(PassRegistry &); 320e8d8bef9SDimitry Andric extern char &AMDGPULateCodeGenPrepareID; 321e8d8bef9SDimitry Andric 3225f757f3fSDimitry Andric FunctionPass *createAMDGPURewriteUndefForPHILegacyPass(); 3235f757f3fSDimitry Andric void initializeAMDGPURewriteUndefForPHILegacyPass(PassRegistry &); 3245f757f3fSDimitry Andric extern char &AMDGPURewriteUndefForPHILegacyPassID; 3255f757f3fSDimitry Andric 3265f757f3fSDimitry Andric class AMDGPURewriteUndefForPHIPass 3275f757f3fSDimitry Andric : public PassInfoMixin<AMDGPURewriteUndefForPHIPass> { 3285f757f3fSDimitry Andric public: 3295f757f3fSDimitry Andric AMDGPURewriteUndefForPHIPass() = default; 3305f757f3fSDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 3315f757f3fSDimitry Andric }; 332bdd1243dSDimitry Andric 3330b57cec5SDimitry Andric void initializeSIAnnotateControlFlowPass(PassRegistry&); 3340b57cec5SDimitry Andric extern char &SIAnnotateControlFlowPassID; 3350b57cec5SDimitry Andric 3360b57cec5SDimitry Andric void initializeSIMemoryLegalizerPass(PassRegistry&); 3370b57cec5SDimitry Andric extern char &SIMemoryLegalizerID; 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric void initializeSIModeRegisterPass(PassRegistry&); 3400b57cec5SDimitry Andric extern char &SIModeRegisterID; 3410b57cec5SDimitry Andric 34281ad6265SDimitry Andric void initializeAMDGPUInsertDelayAluPass(PassRegistry &); 34381ad6265SDimitry Andric extern char &AMDGPUInsertDelayAluID; 34481ad6265SDimitry Andric 3455f757f3fSDimitry Andric void initializeAMDGPUInsertSingleUseVDSTPass(PassRegistry &); 3465f757f3fSDimitry Andric extern char &AMDGPUInsertSingleUseVDSTID; 3475f757f3fSDimitry Andric 3485ffd83dbSDimitry Andric void initializeSIInsertHardClausesPass(PassRegistry &); 3495ffd83dbSDimitry Andric extern char &SIInsertHardClausesID; 3505ffd83dbSDimitry Andric 3510b57cec5SDimitry Andric void initializeSIInsertWaitcntsPass(PassRegistry&); 3520b57cec5SDimitry Andric extern char &SIInsertWaitcntsID; 3530b57cec5SDimitry Andric 3540b57cec5SDimitry Andric void initializeSIFormMemoryClausesPass(PassRegistry&); 3550b57cec5SDimitry Andric extern char &SIFormMemoryClausesID; 3560b57cec5SDimitry Andric 3575ffd83dbSDimitry Andric void initializeSIPostRABundlerPass(PassRegistry&); 3585ffd83dbSDimitry Andric extern char &SIPostRABundlerID; 3595ffd83dbSDimitry Andric 360753f127fSDimitry Andric void initializeGCNCreateVOPDPass(PassRegistry &); 361753f127fSDimitry Andric extern char &GCNCreateVOPDID; 362753f127fSDimitry Andric 3630b57cec5SDimitry Andric void initializeAMDGPUUnifyDivergentExitNodesPass(PassRegistry&); 3640b57cec5SDimitry Andric extern char &AMDGPUUnifyDivergentExitNodesID; 3650b57cec5SDimitry Andric 3660b57cec5SDimitry Andric ImmutablePass *createAMDGPUAAWrapperPass(); 3670b57cec5SDimitry Andric void initializeAMDGPUAAWrapperPassPass(PassRegistry&); 3680b57cec5SDimitry Andric ImmutablePass *createAMDGPUExternalAAWrapperPass(); 3690b57cec5SDimitry Andric void initializeAMDGPUExternalAAWrapperPass(PassRegistry&); 3700b57cec5SDimitry Andric 3710b57cec5SDimitry Andric void initializeAMDGPUArgumentUsageInfoPass(PassRegistry &); 3720b57cec5SDimitry Andric 3730b57cec5SDimitry Andric ModulePass *createAMDGPUOpenCLEnqueuedBlockLoweringPass(); 3740b57cec5SDimitry Andric void initializeAMDGPUOpenCLEnqueuedBlockLoweringPass(PassRegistry &); 3750b57cec5SDimitry Andric extern char &AMDGPUOpenCLEnqueuedBlockLoweringID; 3760b57cec5SDimitry Andric 3770b57cec5SDimitry Andric void initializeGCNNSAReassignPass(PassRegistry &); 3780b57cec5SDimitry Andric extern char &GCNNSAReassignID; 3790b57cec5SDimitry Andric 38006c3fb27SDimitry Andric void initializeGCNPreRALongBranchRegPass(PassRegistry &); 38106c3fb27SDimitry Andric extern char &GCNPreRALongBranchRegID; 38206c3fb27SDimitry Andric 383fe6060f1SDimitry Andric void initializeGCNPreRAOptimizationsPass(PassRegistry &); 384fe6060f1SDimitry Andric extern char &GCNPreRAOptimizationsID; 385fe6060f1SDimitry Andric 38681ad6265SDimitry Andric FunctionPass *createAMDGPUSetWavePriorityPass(); 38781ad6265SDimitry Andric void initializeAMDGPUSetWavePriorityPass(PassRegistry &); 38881ad6265SDimitry Andric 38906c3fb27SDimitry Andric void initializeGCNRewritePartialRegUsesPass(llvm::PassRegistry &); 39006c3fb27SDimitry Andric extern char &GCNRewritePartialRegUsesID; 39106c3fb27SDimitry Andric 3920b57cec5SDimitry Andric namespace AMDGPU { 3930b57cec5SDimitry Andric enum TargetIndex { 3940b57cec5SDimitry Andric TI_CONSTDATA_START, 3950b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD0, 3960b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD1, 3970b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD2, 3980b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD3 3990b57cec5SDimitry Andric }; 400e8d8bef9SDimitry Andric 401e8d8bef9SDimitry Andric // FIXME: Missing constant_32bit 402e8d8bef9SDimitry Andric inline bool isFlatGlobalAddrSpace(unsigned AS) { 403e8d8bef9SDimitry Andric return AS == AMDGPUAS::GLOBAL_ADDRESS || 404e8d8bef9SDimitry Andric AS == AMDGPUAS::FLAT_ADDRESS || 405e8d8bef9SDimitry Andric AS == AMDGPUAS::CONSTANT_ADDRESS || 406e8d8bef9SDimitry Andric AS > AMDGPUAS::MAX_AMDGPU_ADDRESS; 407e8d8bef9SDimitry Andric } 40806c3fb27SDimitry Andric 40906c3fb27SDimitry Andric inline bool isExtendedGlobalAddrSpace(unsigned AS) { 41006c3fb27SDimitry Andric return AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::CONSTANT_ADDRESS || 41106c3fb27SDimitry Andric AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT || 41206c3fb27SDimitry Andric AS > AMDGPUAS::MAX_AMDGPU_ADDRESS; 41306c3fb27SDimitry Andric } 41406c3fb27SDimitry Andric 41506c3fb27SDimitry Andric static inline bool addrspacesMayAlias(unsigned AS1, unsigned AS2) { 4165f757f3fSDimitry Andric static_assert(AMDGPUAS::MAX_AMDGPU_ADDRESS <= 9, "Addr space out of range"); 41706c3fb27SDimitry Andric 41806c3fb27SDimitry Andric if (AS1 > AMDGPUAS::MAX_AMDGPU_ADDRESS || AS2 > AMDGPUAS::MAX_AMDGPU_ADDRESS) 41906c3fb27SDimitry Andric return true; 42006c3fb27SDimitry Andric 4215f757f3fSDimitry Andric // This array is indexed by address space value enum elements 0 ... to 9 42206c3fb27SDimitry Andric // clang-format off 4235f757f3fSDimitry Andric static const bool ASAliasRules[10][10] = { 4245f757f3fSDimitry Andric /* Flat Global Region Group Constant Private Const32 BufFatPtr BufRsrc BufStrdPtr */ 4255f757f3fSDimitry Andric /* Flat */ {true, true, false, true, true, true, true, true, true, true}, 4265f757f3fSDimitry Andric /* Global */ {true, true, false, false, true, false, true, true, true, true}, 4275f757f3fSDimitry Andric /* Region */ {false, false, true, false, false, false, false, false, false, false}, 4285f757f3fSDimitry Andric /* Group */ {true, false, false, true, false, false, false, false, false, false}, 4295f757f3fSDimitry Andric /* Constant */ {true, true, false, false, false, false, true, true, true, true}, 4305f757f3fSDimitry Andric /* Private */ {true, false, false, false, false, true, false, false, false, false}, 4315f757f3fSDimitry Andric /* Constant 32-bit */ {true, true, false, false, true, false, false, true, true, true}, 4325f757f3fSDimitry Andric /* Buffer Fat Ptr */ {true, true, false, false, true, false, true, true, true, true}, 4335f757f3fSDimitry Andric /* Buffer Resource */ {true, true, false, false, true, false, true, true, true, true}, 4345f757f3fSDimitry Andric /* Buffer Strided Ptr */ {true, true, false, false, true, false, true, true, true, true}, 43506c3fb27SDimitry Andric }; 43606c3fb27SDimitry Andric // clang-format on 43706c3fb27SDimitry Andric 43806c3fb27SDimitry Andric return ASAliasRules[AS1][AS2]; 43906c3fb27SDimitry Andric } 44006c3fb27SDimitry Andric 441e8d8bef9SDimitry Andric } 442e8d8bef9SDimitry Andric 443e8d8bef9SDimitry Andric } // End namespace llvm 444e8d8bef9SDimitry Andric 4450b57cec5SDimitry Andric #endif 446