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" 15*5f757f3fSDimitry Andric #include "llvm/Support/AMDGPUAddrSpace.h" 165ffd83dbSDimitry Andric #include "llvm/Support/CodeGen.h" 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric namespace llvm { 190b57cec5SDimitry Andric 20*5f757f3fSDimitry 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(); 39*5f757f3fSDimitry 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(); 47*5f757f3fSDimitry 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(); 54*5f757f3fSDimitry 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(); 60*5f757f3fSDimitry Andric ModulePass * 61*5f757f3fSDimitry Andric createAMDGPULowerModuleLDSLegacyPass(const AMDGPUTargetMachine *TM = nullptr); 620b57cec5SDimitry Andric FunctionPass *createSIModeRegisterPass(); 63fe6060f1SDimitry Andric FunctionPass *createGCNPreRAOptimizationsPass(); 640b57cec5SDimitry Andric 65e8d8bef9SDimitry Andric struct AMDGPUSimplifyLibCallsPass : PassInfoMixin<AMDGPUSimplifyLibCallsPass> { 66*5f757f3fSDimitry Andric AMDGPUSimplifyLibCallsPass() {} 67*5f757f3fSDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 68*5f757f3fSDimitry Andric }; 69*5f757f3fSDimitry Andric 70*5f757f3fSDimitry Andric struct AMDGPUImageIntrinsicOptimizerPass 71*5f757f3fSDimitry Andric : PassInfoMixin<AMDGPUImageIntrinsicOptimizerPass> { 72*5f757f3fSDimitry 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(); 91*5f757f3fSDimitry Andric Pass *createAMDGPUAttributorLegacyPass(); 92*5f757f3fSDimitry 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 129*5f757f3fSDimitry Andric void initializeAMDGPULowerModuleLDSLegacyPass(PassRegistry &); 130*5f757f3fSDimitry Andric extern char &AMDGPULowerModuleLDSLegacyPassID; 131fe6060f1SDimitry Andric 132fe6060f1SDimitry Andric struct AMDGPULowerModuleLDSPass : PassInfoMixin<AMDGPULowerModuleLDSPass> { 133*5f757f3fSDimitry Andric const AMDGPUTargetMachine &TM; 134*5f757f3fSDimitry Andric AMDGPULowerModuleLDSPass(const AMDGPUTargetMachine &TM_) : TM(TM_) {} 135*5f757f3fSDimitry 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 160*5f757f3fSDimitry Andric void initializeSILowerWWMCopiesPass(PassRegistry &); 161*5f757f3fSDimitry Andric extern char &SILowerWWMCopiesID; 162*5f757f3fSDimitry Andric 1630b57cec5SDimitry Andric void initializeSILowerI1CopiesPass(PassRegistry &); 1640b57cec5SDimitry Andric extern char &SILowerI1CopiesID; 1650b57cec5SDimitry Andric 166*5f757f3fSDimitry Andric void initializeAMDGPUGlobalISelDivergenceLoweringPass(PassRegistry &); 167*5f757f3fSDimitry Andric extern char &AMDGPUGlobalISelDivergenceLoweringID; 168*5f757f3fSDimitry Andric 1690b57cec5SDimitry Andric void initializeSILowerSGPRSpillsPass(PassRegistry &); 1700b57cec5SDimitry Andric extern char &SILowerSGPRSpillsID; 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric void initializeSILoadStoreOptimizerPass(PassRegistry &); 1730b57cec5SDimitry Andric extern char &SILoadStoreOptimizerID; 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric void initializeSIWholeQuadModePass(PassRegistry &); 1760b57cec5SDimitry Andric extern char &SIWholeQuadModeID; 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andric void initializeSILowerControlFlowPass(PassRegistry &); 1790b57cec5SDimitry Andric extern char &SILowerControlFlowID; 1800b57cec5SDimitry Andric 1815ffd83dbSDimitry Andric void initializeSIPreEmitPeepholePass(PassRegistry &); 1825ffd83dbSDimitry Andric extern char &SIPreEmitPeepholeID; 1835ffd83dbSDimitry Andric 184fe6060f1SDimitry Andric void initializeSILateBranchLoweringPass(PassRegistry &); 185fe6060f1SDimitry Andric extern char &SILateBranchLoweringPassID; 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPass(PassRegistry &); 1880b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingID; 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric void initializeSIPreAllocateWWMRegsPass(PassRegistry &); 1910b57cec5SDimitry Andric extern char &SIPreAllocateWWMRegsID; 1920b57cec5SDimitry Andric 193*5f757f3fSDimitry Andric void initializeAMDGPUImageIntrinsicOptimizerPass(PassRegistry &); 194*5f757f3fSDimitry Andric extern char &AMDGPUImageIntrinsicOptimizerID; 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric void initializeAMDGPUPerfHintAnalysisPass(PassRegistry &); 1970b57cec5SDimitry Andric extern char &AMDGPUPerfHintAnalysisID; 1980b57cec5SDimitry Andric 199*5f757f3fSDimitry Andric void initializeGCNRegPressurePrinterPass(PassRegistry &); 200*5f757f3fSDimitry Andric extern char &GCNRegPressurePrinterID; 201*5f757f3fSDimitry Andric 2020b57cec5SDimitry Andric // Passes common to R600 and SI 2030b57cec5SDimitry Andric FunctionPass *createAMDGPUPromoteAlloca(); 2040b57cec5SDimitry Andric void initializeAMDGPUPromoteAllocaPass(PassRegistry&); 2050b57cec5SDimitry Andric extern char &AMDGPUPromoteAllocaID; 2060b57cec5SDimitry Andric 2075ffd83dbSDimitry Andric FunctionPass *createAMDGPUPromoteAllocaToVector(); 2085ffd83dbSDimitry Andric void initializeAMDGPUPromoteAllocaToVectorPass(PassRegistry&); 2095ffd83dbSDimitry Andric extern char &AMDGPUPromoteAllocaToVectorID; 2105ffd83dbSDimitry Andric 211e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaPass : PassInfoMixin<AMDGPUPromoteAllocaPass> { 212e8d8bef9SDimitry Andric AMDGPUPromoteAllocaPass(TargetMachine &TM) : TM(TM) {} 213e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 214e8d8bef9SDimitry Andric 215e8d8bef9SDimitry Andric private: 216e8d8bef9SDimitry Andric TargetMachine &TM; 217e8d8bef9SDimitry Andric }; 218e8d8bef9SDimitry Andric 219e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaToVectorPass 220e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPromoteAllocaToVectorPass> { 221e8d8bef9SDimitry Andric AMDGPUPromoteAllocaToVectorPass(TargetMachine &TM) : TM(TM) {} 222e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 223e8d8bef9SDimitry Andric 224e8d8bef9SDimitry Andric private: 225e8d8bef9SDimitry Andric TargetMachine &TM; 226e8d8bef9SDimitry Andric }; 227e8d8bef9SDimitry Andric 22806c3fb27SDimitry Andric struct AMDGPUAtomicOptimizerPass : PassInfoMixin<AMDGPUAtomicOptimizerPass> { 22906c3fb27SDimitry Andric AMDGPUAtomicOptimizerPass(TargetMachine &TM, ScanOptions ScanImpl) 23006c3fb27SDimitry Andric : TM(TM), ScanImpl(ScanImpl) {} 23106c3fb27SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 23206c3fb27SDimitry Andric 23306c3fb27SDimitry Andric private: 23406c3fb27SDimitry Andric TargetMachine &TM; 23506c3fb27SDimitry Andric ScanOptions ScanImpl; 23606c3fb27SDimitry Andric }; 23706c3fb27SDimitry Andric 2380b57cec5SDimitry Andric Pass *createAMDGPUStructurizeCFGPass(); 239*5f757f3fSDimitry Andric FunctionPass *createAMDGPUISelDag(TargetMachine &TM, CodeGenOptLevel OptLevel); 2400b57cec5SDimitry Andric ModulePass *createAMDGPUAlwaysInlinePass(bool GlobalOpt = true); 241e8d8bef9SDimitry Andric 242e8d8bef9SDimitry Andric struct AMDGPUAlwaysInlinePass : PassInfoMixin<AMDGPUAlwaysInlinePass> { 243e8d8bef9SDimitry Andric AMDGPUAlwaysInlinePass(bool GlobalOpt = true) : GlobalOpt(GlobalOpt) {} 244e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 245e8d8bef9SDimitry Andric 246e8d8bef9SDimitry Andric private: 247e8d8bef9SDimitry Andric bool GlobalOpt; 248e8d8bef9SDimitry Andric }; 249e8d8bef9SDimitry Andric 25006c3fb27SDimitry Andric class AMDGPUCodeGenPreparePass 25106c3fb27SDimitry Andric : public PassInfoMixin<AMDGPUCodeGenPreparePass> { 25206c3fb27SDimitry Andric private: 25306c3fb27SDimitry Andric TargetMachine &TM; 25406c3fb27SDimitry Andric 25506c3fb27SDimitry Andric public: 25606c3fb27SDimitry Andric AMDGPUCodeGenPreparePass(TargetMachine &TM) : TM(TM){}; 25706c3fb27SDimitry Andric PreservedAnalyses run(Function &, FunctionAnalysisManager &); 25806c3fb27SDimitry Andric }; 25906c3fb27SDimitry Andric 260*5f757f3fSDimitry Andric class AMDGPULowerKernelArgumentsPass 261*5f757f3fSDimitry Andric : public PassInfoMixin<AMDGPULowerKernelArgumentsPass> { 262*5f757f3fSDimitry Andric private: 263*5f757f3fSDimitry Andric TargetMachine &TM; 264*5f757f3fSDimitry Andric 265*5f757f3fSDimitry Andric public: 266*5f757f3fSDimitry Andric AMDGPULowerKernelArgumentsPass(TargetMachine &TM) : TM(TM){}; 267*5f757f3fSDimitry Andric PreservedAnalyses run(Function &, FunctionAnalysisManager &); 268*5f757f3fSDimitry Andric }; 269*5f757f3fSDimitry Andric 270*5f757f3fSDimitry Andric class AMDGPUAttributorPass : public PassInfoMixin<AMDGPUAttributorPass> { 271*5f757f3fSDimitry Andric private: 272*5f757f3fSDimitry Andric TargetMachine &TM; 273*5f757f3fSDimitry Andric 274*5f757f3fSDimitry Andric public: 275*5f757f3fSDimitry Andric AMDGPUAttributorPass(TargetMachine &TM) : TM(TM){}; 276*5f757f3fSDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 277*5f757f3fSDimitry Andric }; 278*5f757f3fSDimitry Andric 2790b57cec5SDimitry Andric FunctionPass *createAMDGPUAnnotateUniformValues(); 2800b57cec5SDimitry Andric 2818bcb0991SDimitry Andric ModulePass *createAMDGPUPrintfRuntimeBinding(); 2828bcb0991SDimitry Andric void initializeAMDGPUPrintfRuntimeBindingPass(PassRegistry&); 2838bcb0991SDimitry Andric extern char &AMDGPUPrintfRuntimeBindingID; 2848bcb0991SDimitry Andric 285fe6060f1SDimitry Andric void initializeAMDGPUResourceUsageAnalysisPass(PassRegistry &); 286fe6060f1SDimitry Andric extern char &AMDGPUResourceUsageAnalysisID; 287fe6060f1SDimitry Andric 288e8d8bef9SDimitry Andric struct AMDGPUPrintfRuntimeBindingPass 289e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPrintfRuntimeBindingPass> { 290e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 291e8d8bef9SDimitry Andric }; 292e8d8bef9SDimitry Andric 2930b57cec5SDimitry Andric ModulePass* createAMDGPUUnifyMetadataPass(); 2940b57cec5SDimitry Andric void initializeAMDGPUUnifyMetadataPass(PassRegistry&); 2950b57cec5SDimitry Andric extern char &AMDGPUUnifyMetadataID; 2960b57cec5SDimitry Andric 297e8d8bef9SDimitry Andric struct AMDGPUUnifyMetadataPass : PassInfoMixin<AMDGPUUnifyMetadataPass> { 298e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 299e8d8bef9SDimitry Andric }; 300e8d8bef9SDimitry Andric 3010b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPreRAPass(PassRegistry&); 3020b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingPreRAID; 3030b57cec5SDimitry Andric 304fe6060f1SDimitry Andric void initializeSIOptimizeVGPRLiveRangePass(PassRegistry &); 305fe6060f1SDimitry Andric extern char &SIOptimizeVGPRLiveRangeID; 306fe6060f1SDimitry Andric 3070b57cec5SDimitry Andric void initializeAMDGPUAnnotateUniformValuesPass(PassRegistry&); 3080b57cec5SDimitry Andric extern char &AMDGPUAnnotateUniformValuesPassID; 3090b57cec5SDimitry Andric 3100b57cec5SDimitry Andric void initializeAMDGPUCodeGenPreparePass(PassRegistry&); 3110b57cec5SDimitry Andric extern char &AMDGPUCodeGenPrepareID; 3120b57cec5SDimitry Andric 31306c3fb27SDimitry Andric void initializeAMDGPURemoveIncompatibleFunctionsPass(PassRegistry &); 31406c3fb27SDimitry Andric extern char &AMDGPURemoveIncompatibleFunctionsID; 31506c3fb27SDimitry Andric 316e8d8bef9SDimitry Andric void initializeAMDGPULateCodeGenPreparePass(PassRegistry &); 317e8d8bef9SDimitry Andric extern char &AMDGPULateCodeGenPrepareID; 318e8d8bef9SDimitry Andric 319*5f757f3fSDimitry Andric FunctionPass *createAMDGPURewriteUndefForPHILegacyPass(); 320*5f757f3fSDimitry Andric void initializeAMDGPURewriteUndefForPHILegacyPass(PassRegistry &); 321*5f757f3fSDimitry Andric extern char &AMDGPURewriteUndefForPHILegacyPassID; 322*5f757f3fSDimitry Andric 323*5f757f3fSDimitry Andric class AMDGPURewriteUndefForPHIPass 324*5f757f3fSDimitry Andric : public PassInfoMixin<AMDGPURewriteUndefForPHIPass> { 325*5f757f3fSDimitry Andric public: 326*5f757f3fSDimitry Andric AMDGPURewriteUndefForPHIPass() = default; 327*5f757f3fSDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 328*5f757f3fSDimitry Andric }; 329bdd1243dSDimitry Andric 3300b57cec5SDimitry Andric void initializeSIAnnotateControlFlowPass(PassRegistry&); 3310b57cec5SDimitry Andric extern char &SIAnnotateControlFlowPassID; 3320b57cec5SDimitry Andric 3330b57cec5SDimitry Andric void initializeSIMemoryLegalizerPass(PassRegistry&); 3340b57cec5SDimitry Andric extern char &SIMemoryLegalizerID; 3350b57cec5SDimitry Andric 3360b57cec5SDimitry Andric void initializeSIModeRegisterPass(PassRegistry&); 3370b57cec5SDimitry Andric extern char &SIModeRegisterID; 3380b57cec5SDimitry Andric 33981ad6265SDimitry Andric void initializeAMDGPUInsertDelayAluPass(PassRegistry &); 34081ad6265SDimitry Andric extern char &AMDGPUInsertDelayAluID; 34181ad6265SDimitry Andric 342*5f757f3fSDimitry Andric void initializeAMDGPUInsertSingleUseVDSTPass(PassRegistry &); 343*5f757f3fSDimitry Andric extern char &AMDGPUInsertSingleUseVDSTID; 344*5f757f3fSDimitry Andric 3455ffd83dbSDimitry Andric void initializeSIInsertHardClausesPass(PassRegistry &); 3465ffd83dbSDimitry Andric extern char &SIInsertHardClausesID; 3475ffd83dbSDimitry Andric 3480b57cec5SDimitry Andric void initializeSIInsertWaitcntsPass(PassRegistry&); 3490b57cec5SDimitry Andric extern char &SIInsertWaitcntsID; 3500b57cec5SDimitry Andric 3510b57cec5SDimitry Andric void initializeSIFormMemoryClausesPass(PassRegistry&); 3520b57cec5SDimitry Andric extern char &SIFormMemoryClausesID; 3530b57cec5SDimitry Andric 3545ffd83dbSDimitry Andric void initializeSIPostRABundlerPass(PassRegistry&); 3555ffd83dbSDimitry Andric extern char &SIPostRABundlerID; 3565ffd83dbSDimitry Andric 357753f127fSDimitry Andric void initializeGCNCreateVOPDPass(PassRegistry &); 358753f127fSDimitry Andric extern char &GCNCreateVOPDID; 359753f127fSDimitry Andric 3600b57cec5SDimitry Andric void initializeAMDGPUUnifyDivergentExitNodesPass(PassRegistry&); 3610b57cec5SDimitry Andric extern char &AMDGPUUnifyDivergentExitNodesID; 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andric ImmutablePass *createAMDGPUAAWrapperPass(); 3640b57cec5SDimitry Andric void initializeAMDGPUAAWrapperPassPass(PassRegistry&); 3650b57cec5SDimitry Andric ImmutablePass *createAMDGPUExternalAAWrapperPass(); 3660b57cec5SDimitry Andric void initializeAMDGPUExternalAAWrapperPass(PassRegistry&); 3670b57cec5SDimitry Andric 3680b57cec5SDimitry Andric void initializeAMDGPUArgumentUsageInfoPass(PassRegistry &); 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric ModulePass *createAMDGPUOpenCLEnqueuedBlockLoweringPass(); 3710b57cec5SDimitry Andric void initializeAMDGPUOpenCLEnqueuedBlockLoweringPass(PassRegistry &); 3720b57cec5SDimitry Andric extern char &AMDGPUOpenCLEnqueuedBlockLoweringID; 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andric void initializeGCNNSAReassignPass(PassRegistry &); 3750b57cec5SDimitry Andric extern char &GCNNSAReassignID; 3760b57cec5SDimitry Andric 37706c3fb27SDimitry Andric void initializeGCNPreRALongBranchRegPass(PassRegistry &); 37806c3fb27SDimitry Andric extern char &GCNPreRALongBranchRegID; 37906c3fb27SDimitry Andric 380fe6060f1SDimitry Andric void initializeGCNPreRAOptimizationsPass(PassRegistry &); 381fe6060f1SDimitry Andric extern char &GCNPreRAOptimizationsID; 382fe6060f1SDimitry Andric 38381ad6265SDimitry Andric FunctionPass *createAMDGPUSetWavePriorityPass(); 38481ad6265SDimitry Andric void initializeAMDGPUSetWavePriorityPass(PassRegistry &); 38581ad6265SDimitry Andric 38606c3fb27SDimitry Andric void initializeGCNRewritePartialRegUsesPass(llvm::PassRegistry &); 38706c3fb27SDimitry Andric extern char &GCNRewritePartialRegUsesID; 38806c3fb27SDimitry Andric 3890b57cec5SDimitry Andric namespace AMDGPU { 3900b57cec5SDimitry Andric enum TargetIndex { 3910b57cec5SDimitry Andric TI_CONSTDATA_START, 3920b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD0, 3930b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD1, 3940b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD2, 3950b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD3 3960b57cec5SDimitry Andric }; 397e8d8bef9SDimitry Andric 398e8d8bef9SDimitry Andric // FIXME: Missing constant_32bit 399e8d8bef9SDimitry Andric inline bool isFlatGlobalAddrSpace(unsigned AS) { 400e8d8bef9SDimitry Andric return AS == AMDGPUAS::GLOBAL_ADDRESS || 401e8d8bef9SDimitry Andric AS == AMDGPUAS::FLAT_ADDRESS || 402e8d8bef9SDimitry Andric AS == AMDGPUAS::CONSTANT_ADDRESS || 403e8d8bef9SDimitry Andric AS > AMDGPUAS::MAX_AMDGPU_ADDRESS; 404e8d8bef9SDimitry Andric } 40506c3fb27SDimitry Andric 40606c3fb27SDimitry Andric inline bool isExtendedGlobalAddrSpace(unsigned AS) { 40706c3fb27SDimitry Andric return AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::CONSTANT_ADDRESS || 40806c3fb27SDimitry Andric AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT || 40906c3fb27SDimitry Andric AS > AMDGPUAS::MAX_AMDGPU_ADDRESS; 41006c3fb27SDimitry Andric } 41106c3fb27SDimitry Andric 41206c3fb27SDimitry Andric static inline bool addrspacesMayAlias(unsigned AS1, unsigned AS2) { 413*5f757f3fSDimitry Andric static_assert(AMDGPUAS::MAX_AMDGPU_ADDRESS <= 9, "Addr space out of range"); 41406c3fb27SDimitry Andric 41506c3fb27SDimitry Andric if (AS1 > AMDGPUAS::MAX_AMDGPU_ADDRESS || AS2 > AMDGPUAS::MAX_AMDGPU_ADDRESS) 41606c3fb27SDimitry Andric return true; 41706c3fb27SDimitry Andric 418*5f757f3fSDimitry Andric // This array is indexed by address space value enum elements 0 ... to 9 41906c3fb27SDimitry Andric // clang-format off 420*5f757f3fSDimitry Andric static const bool ASAliasRules[10][10] = { 421*5f757f3fSDimitry Andric /* Flat Global Region Group Constant Private Const32 BufFatPtr BufRsrc BufStrdPtr */ 422*5f757f3fSDimitry Andric /* Flat */ {true, true, false, true, true, true, true, true, true, true}, 423*5f757f3fSDimitry Andric /* Global */ {true, true, false, false, true, false, true, true, true, true}, 424*5f757f3fSDimitry Andric /* Region */ {false, false, true, false, false, false, false, false, false, false}, 425*5f757f3fSDimitry Andric /* Group */ {true, false, false, true, false, false, false, false, false, false}, 426*5f757f3fSDimitry Andric /* Constant */ {true, true, false, false, false, false, true, true, true, true}, 427*5f757f3fSDimitry Andric /* Private */ {true, false, false, false, false, true, false, false, false, false}, 428*5f757f3fSDimitry Andric /* Constant 32-bit */ {true, true, false, false, true, false, false, true, true, true}, 429*5f757f3fSDimitry Andric /* Buffer Fat Ptr */ {true, true, false, false, true, false, true, true, true, true}, 430*5f757f3fSDimitry Andric /* Buffer Resource */ {true, true, false, false, true, false, true, true, true, true}, 431*5f757f3fSDimitry Andric /* Buffer Strided Ptr */ {true, true, false, false, true, false, true, true, true, true}, 43206c3fb27SDimitry Andric }; 43306c3fb27SDimitry Andric // clang-format on 43406c3fb27SDimitry Andric 43506c3fb27SDimitry Andric return ASAliasRules[AS1][AS2]; 43606c3fb27SDimitry Andric } 43706c3fb27SDimitry Andric 438e8d8bef9SDimitry Andric } 439e8d8bef9SDimitry Andric 440e8d8bef9SDimitry Andric } // End namespace llvm 441e8d8bef9SDimitry Andric 4420b57cec5SDimitry Andric #endif 443