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" 145ffd83dbSDimitry Andric #include "llvm/Support/CodeGen.h" 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric namespace llvm { 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric class FunctionPass; 190b57cec5SDimitry Andric class GCNTargetMachine; 205ffd83dbSDimitry Andric class ImmutablePass; 21*fe6060f1SDimitry Andric class MachineFunctionPass; 220b57cec5SDimitry Andric class ModulePass; 230b57cec5SDimitry Andric class Pass; 240b57cec5SDimitry Andric class Target; 250b57cec5SDimitry Andric class TargetMachine; 260b57cec5SDimitry Andric class TargetOptions; 270b57cec5SDimitry Andric class PassRegistry; 280b57cec5SDimitry Andric class Module; 290b57cec5SDimitry Andric 305ffd83dbSDimitry Andric // GlobalISel passes 315ffd83dbSDimitry Andric void initializeAMDGPUPreLegalizerCombinerPass(PassRegistry &); 325ffd83dbSDimitry Andric FunctionPass *createAMDGPUPreLegalizeCombiner(bool IsOptNone); 335ffd83dbSDimitry Andric void initializeAMDGPUPostLegalizerCombinerPass(PassRegistry &); 345ffd83dbSDimitry Andric FunctionPass *createAMDGPUPostLegalizeCombiner(bool IsOptNone); 355ffd83dbSDimitry Andric FunctionPass *createAMDGPURegBankCombiner(bool IsOptNone); 365ffd83dbSDimitry Andric void initializeAMDGPURegBankCombinerPass(PassRegistry &); 375ffd83dbSDimitry Andric 380b57cec5SDimitry Andric // R600 Passes 390b57cec5SDimitry Andric FunctionPass *createR600VectorRegMerger(); 400b57cec5SDimitry Andric FunctionPass *createR600ExpandSpecialInstrsPass(); 410b57cec5SDimitry Andric FunctionPass *createR600EmitClauseMarkers(); 420b57cec5SDimitry Andric FunctionPass *createR600ClauseMergePass(); 430b57cec5SDimitry Andric FunctionPass *createR600Packetizer(); 440b57cec5SDimitry Andric FunctionPass *createR600ControlFlowFinalizer(); 450b57cec5SDimitry Andric FunctionPass *createAMDGPUCFGStructurizerPass(); 460b57cec5SDimitry Andric FunctionPass *createR600ISelDag(TargetMachine *TM, CodeGenOpt::Level OptLevel); 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric // SI Passes 490b57cec5SDimitry Andric FunctionPass *createGCNDPPCombinePass(); 500b57cec5SDimitry Andric FunctionPass *createSIAnnotateControlFlowPass(); 510b57cec5SDimitry Andric FunctionPass *createSIFoldOperandsPass(); 520b57cec5SDimitry Andric FunctionPass *createSIPeepholeSDWAPass(); 530b57cec5SDimitry Andric FunctionPass *createSILowerI1CopiesPass(); 540b57cec5SDimitry Andric FunctionPass *createSIShrinkInstructionsPass(); 550b57cec5SDimitry Andric FunctionPass *createSILoadStoreOptimizerPass(); 560b57cec5SDimitry Andric FunctionPass *createSIWholeQuadModePass(); 570b57cec5SDimitry Andric FunctionPass *createSIFixControlFlowLiveIntervalsPass(); 580b57cec5SDimitry Andric FunctionPass *createSIOptimizeExecMaskingPreRAPass(); 59*fe6060f1SDimitry Andric FunctionPass *createSIOptimizeVGPRLiveRangePass(); 600b57cec5SDimitry Andric FunctionPass *createSIFixSGPRCopiesPass(); 610b57cec5SDimitry Andric FunctionPass *createSIMemoryLegalizerPass(); 620b57cec5SDimitry Andric FunctionPass *createSIInsertWaitcntsPass(); 630b57cec5SDimitry Andric FunctionPass *createSIPreAllocateWWMRegsPass(); 640b57cec5SDimitry Andric FunctionPass *createSIFormMemoryClausesPass(); 655ffd83dbSDimitry Andric 665ffd83dbSDimitry Andric FunctionPass *createSIPostRABundlerPass(); 675ffd83dbSDimitry Andric FunctionPass *createAMDGPUSimplifyLibCallsPass(const TargetMachine *); 680b57cec5SDimitry Andric FunctionPass *createAMDGPUUseNativeCallsPass(); 690b57cec5SDimitry Andric FunctionPass *createAMDGPUCodeGenPreparePass(); 70e8d8bef9SDimitry Andric FunctionPass *createAMDGPULateCodeGenPreparePass(); 710b57cec5SDimitry Andric FunctionPass *createAMDGPUMachineCFGStructurizerPass(); 720b57cec5SDimitry Andric FunctionPass *createAMDGPUPropagateAttributesEarlyPass(const TargetMachine *); 730b57cec5SDimitry Andric ModulePass *createAMDGPUPropagateAttributesLatePass(const TargetMachine *); 740b57cec5SDimitry Andric FunctionPass *createAMDGPURewriteOutArgumentsPass(); 75*fe6060f1SDimitry Andric ModulePass *createAMDGPUReplaceLDSUseWithPointerPass(); 76*fe6060f1SDimitry Andric ModulePass *createAMDGPULowerModuleLDSPass(); 770b57cec5SDimitry Andric FunctionPass *createSIModeRegisterPass(); 78*fe6060f1SDimitry Andric FunctionPass *createGCNPreRAOptimizationsPass(); 790b57cec5SDimitry Andric 80e8d8bef9SDimitry Andric struct AMDGPUSimplifyLibCallsPass : PassInfoMixin<AMDGPUSimplifyLibCallsPass> { 81e8d8bef9SDimitry Andric AMDGPUSimplifyLibCallsPass(TargetMachine &TM) : TM(TM) {} 82e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 83e8d8bef9SDimitry Andric 84e8d8bef9SDimitry Andric private: 85e8d8bef9SDimitry Andric TargetMachine &TM; 86e8d8bef9SDimitry Andric }; 87e8d8bef9SDimitry Andric 88e8d8bef9SDimitry Andric struct AMDGPUUseNativeCallsPass : PassInfoMixin<AMDGPUUseNativeCallsPass> { 89e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 90e8d8bef9SDimitry Andric }; 91e8d8bef9SDimitry Andric 920b57cec5SDimitry Andric void initializeAMDGPUDAGToDAGISelPass(PassRegistry&); 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric void initializeAMDGPUMachineCFGStructurizerPass(PassRegistry&); 950b57cec5SDimitry Andric extern char &AMDGPUMachineCFGStructurizerID; 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric void initializeAMDGPUAlwaysInlinePass(PassRegistry&); 980b57cec5SDimitry Andric 990b57cec5SDimitry Andric Pass *createAMDGPUAnnotateKernelFeaturesPass(); 100*fe6060f1SDimitry Andric Pass *createAMDGPUAttributorPass(); 101*fe6060f1SDimitry Andric void initializeAMDGPUAttributorPass(PassRegistry &); 1020b57cec5SDimitry Andric void initializeAMDGPUAnnotateKernelFeaturesPass(PassRegistry &); 1030b57cec5SDimitry Andric extern char &AMDGPUAnnotateKernelFeaturesID; 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric FunctionPass *createAMDGPUAtomicOptimizerPass(); 1060b57cec5SDimitry Andric void initializeAMDGPUAtomicOptimizerPass(PassRegistry &); 1070b57cec5SDimitry Andric extern char &AMDGPUAtomicOptimizerID; 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric ModulePass *createAMDGPULowerIntrinsicsPass(); 1100b57cec5SDimitry Andric void initializeAMDGPULowerIntrinsicsPass(PassRegistry &); 1110b57cec5SDimitry Andric extern char &AMDGPULowerIntrinsicsID; 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric ModulePass *createAMDGPUFixFunctionBitcastsPass(); 1140b57cec5SDimitry Andric void initializeAMDGPUFixFunctionBitcastsPass(PassRegistry &); 1150b57cec5SDimitry Andric extern char &AMDGPUFixFunctionBitcastsID; 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andric FunctionPass *createAMDGPULowerKernelArgumentsPass(); 1180b57cec5SDimitry Andric void initializeAMDGPULowerKernelArgumentsPass(PassRegistry &); 1190b57cec5SDimitry Andric extern char &AMDGPULowerKernelArgumentsID; 1200b57cec5SDimitry 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 1300b57cec5SDimitry Andric void initializeAMDGPUPropagateAttributesEarlyPass(PassRegistry &); 1310b57cec5SDimitry Andric extern char &AMDGPUPropagateAttributesEarlyID; 1320b57cec5SDimitry Andric 133e8d8bef9SDimitry Andric struct AMDGPUPropagateAttributesEarlyPass 134e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPropagateAttributesEarlyPass> { 135e8d8bef9SDimitry Andric AMDGPUPropagateAttributesEarlyPass(TargetMachine &TM) : TM(TM) {} 136e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 137e8d8bef9SDimitry Andric 138e8d8bef9SDimitry Andric private: 139e8d8bef9SDimitry Andric TargetMachine &TM; 140e8d8bef9SDimitry Andric }; 141e8d8bef9SDimitry Andric 1420b57cec5SDimitry Andric void initializeAMDGPUPropagateAttributesLatePass(PassRegistry &); 1430b57cec5SDimitry Andric extern char &AMDGPUPropagateAttributesLateID; 1440b57cec5SDimitry Andric 145e8d8bef9SDimitry Andric struct AMDGPUPropagateAttributesLatePass 146e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPropagateAttributesLatePass> { 147e8d8bef9SDimitry Andric AMDGPUPropagateAttributesLatePass(TargetMachine &TM) : TM(TM) {} 148e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 149e8d8bef9SDimitry Andric 150e8d8bef9SDimitry Andric private: 151e8d8bef9SDimitry Andric TargetMachine &TM; 152e8d8bef9SDimitry Andric }; 153e8d8bef9SDimitry Andric 154*fe6060f1SDimitry Andric void initializeAMDGPUReplaceLDSUseWithPointerPass(PassRegistry &); 155*fe6060f1SDimitry Andric extern char &AMDGPUReplaceLDSUseWithPointerID; 156*fe6060f1SDimitry Andric 157*fe6060f1SDimitry Andric struct AMDGPUReplaceLDSUseWithPointerPass 158*fe6060f1SDimitry Andric : PassInfoMixin<AMDGPUReplaceLDSUseWithPointerPass> { 159*fe6060f1SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 160*fe6060f1SDimitry Andric }; 161*fe6060f1SDimitry Andric 162*fe6060f1SDimitry Andric void initializeAMDGPULowerModuleLDSPass(PassRegistry &); 163*fe6060f1SDimitry Andric extern char &AMDGPULowerModuleLDSID; 164*fe6060f1SDimitry Andric 165*fe6060f1SDimitry Andric struct AMDGPULowerModuleLDSPass : PassInfoMixin<AMDGPULowerModuleLDSPass> { 166*fe6060f1SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 167*fe6060f1SDimitry Andric }; 168*fe6060f1SDimitry Andric 1690b57cec5SDimitry Andric void initializeAMDGPURewriteOutArgumentsPass(PassRegistry &); 1700b57cec5SDimitry Andric extern char &AMDGPURewriteOutArgumentsID; 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric void initializeGCNDPPCombinePass(PassRegistry &); 1730b57cec5SDimitry Andric extern char &GCNDPPCombineID; 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric void initializeR600ClauseMergePassPass(PassRegistry &); 1760b57cec5SDimitry Andric extern char &R600ClauseMergePassID; 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andric void initializeR600ControlFlowFinalizerPass(PassRegistry &); 1790b57cec5SDimitry Andric extern char &R600ControlFlowFinalizerID; 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric void initializeR600ExpandSpecialInstrsPassPass(PassRegistry &); 1820b57cec5SDimitry Andric extern char &R600ExpandSpecialInstrsPassID; 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric void initializeR600VectorRegMergerPass(PassRegistry &); 1850b57cec5SDimitry Andric extern char &R600VectorRegMergerID; 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric void initializeR600PacketizerPass(PassRegistry &); 1880b57cec5SDimitry Andric extern char &R600PacketizerID; 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric void initializeSIFoldOperandsPass(PassRegistry &); 1910b57cec5SDimitry Andric extern char &SIFoldOperandsID; 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric void initializeSIPeepholeSDWAPass(PassRegistry &); 1940b57cec5SDimitry Andric extern char &SIPeepholeSDWAID; 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric void initializeSIShrinkInstructionsPass(PassRegistry&); 1970b57cec5SDimitry Andric extern char &SIShrinkInstructionsID; 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric void initializeSIFixSGPRCopiesPass(PassRegistry &); 2000b57cec5SDimitry Andric extern char &SIFixSGPRCopiesID; 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric void initializeSIFixVGPRCopiesPass(PassRegistry &); 2030b57cec5SDimitry Andric extern char &SIFixVGPRCopiesID; 2040b57cec5SDimitry Andric 2050b57cec5SDimitry Andric void initializeSILowerI1CopiesPass(PassRegistry &); 2060b57cec5SDimitry Andric extern char &SILowerI1CopiesID; 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric void initializeSILowerSGPRSpillsPass(PassRegistry &); 2090b57cec5SDimitry Andric extern char &SILowerSGPRSpillsID; 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric void initializeSILoadStoreOptimizerPass(PassRegistry &); 2120b57cec5SDimitry Andric extern char &SILoadStoreOptimizerID; 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric void initializeSIWholeQuadModePass(PassRegistry &); 2150b57cec5SDimitry Andric extern char &SIWholeQuadModeID; 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andric void initializeSILowerControlFlowPass(PassRegistry &); 2180b57cec5SDimitry Andric extern char &SILowerControlFlowID; 2190b57cec5SDimitry Andric 2205ffd83dbSDimitry Andric void initializeSIPreEmitPeepholePass(PassRegistry &); 2215ffd83dbSDimitry Andric extern char &SIPreEmitPeepholeID; 2225ffd83dbSDimitry Andric 223*fe6060f1SDimitry Andric void initializeSILateBranchLoweringPass(PassRegistry &); 224*fe6060f1SDimitry Andric extern char &SILateBranchLoweringPassID; 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPass(PassRegistry &); 2270b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingID; 2280b57cec5SDimitry Andric 2290b57cec5SDimitry Andric void initializeSIPreAllocateWWMRegsPass(PassRegistry &); 2300b57cec5SDimitry Andric extern char &SIPreAllocateWWMRegsID; 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andric void initializeAMDGPUSimplifyLibCallsPass(PassRegistry &); 2330b57cec5SDimitry Andric extern char &AMDGPUSimplifyLibCallsID; 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andric void initializeAMDGPUUseNativeCallsPass(PassRegistry &); 2360b57cec5SDimitry Andric extern char &AMDGPUUseNativeCallsID; 2370b57cec5SDimitry Andric 2380b57cec5SDimitry Andric void initializeAMDGPUPerfHintAnalysisPass(PassRegistry &); 2390b57cec5SDimitry Andric extern char &AMDGPUPerfHintAnalysisID; 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andric // Passes common to R600 and SI 2420b57cec5SDimitry Andric FunctionPass *createAMDGPUPromoteAlloca(); 2430b57cec5SDimitry Andric void initializeAMDGPUPromoteAllocaPass(PassRegistry&); 2440b57cec5SDimitry Andric extern char &AMDGPUPromoteAllocaID; 2450b57cec5SDimitry Andric 2465ffd83dbSDimitry Andric FunctionPass *createAMDGPUPromoteAllocaToVector(); 2475ffd83dbSDimitry Andric void initializeAMDGPUPromoteAllocaToVectorPass(PassRegistry&); 2485ffd83dbSDimitry Andric extern char &AMDGPUPromoteAllocaToVectorID; 2495ffd83dbSDimitry Andric 250e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaPass : PassInfoMixin<AMDGPUPromoteAllocaPass> { 251e8d8bef9SDimitry Andric AMDGPUPromoteAllocaPass(TargetMachine &TM) : TM(TM) {} 252e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 253e8d8bef9SDimitry Andric 254e8d8bef9SDimitry Andric private: 255e8d8bef9SDimitry Andric TargetMachine &TM; 256e8d8bef9SDimitry Andric }; 257e8d8bef9SDimitry Andric 258e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaToVectorPass 259e8d8bef9SDimitry Andric : PassInfoMixin<AMDGPUPromoteAllocaToVectorPass> { 260e8d8bef9SDimitry Andric AMDGPUPromoteAllocaToVectorPass(TargetMachine &TM) : TM(TM) {} 261e8d8bef9SDimitry Andric PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 262e8d8bef9SDimitry Andric 263e8d8bef9SDimitry Andric private: 264e8d8bef9SDimitry Andric TargetMachine &TM; 265e8d8bef9SDimitry Andric }; 266e8d8bef9SDimitry Andric 2670b57cec5SDimitry Andric Pass *createAMDGPUStructurizeCFGPass(); 2680b57cec5SDimitry Andric FunctionPass *createAMDGPUISelDag( 2690b57cec5SDimitry Andric TargetMachine *TM = nullptr, 2700b57cec5SDimitry Andric CodeGenOpt::Level OptLevel = CodeGenOpt::Default); 2710b57cec5SDimitry Andric ModulePass *createAMDGPUAlwaysInlinePass(bool GlobalOpt = true); 272e8d8bef9SDimitry Andric 273e8d8bef9SDimitry Andric struct AMDGPUAlwaysInlinePass : PassInfoMixin<AMDGPUAlwaysInlinePass> { 274e8d8bef9SDimitry Andric AMDGPUAlwaysInlinePass(bool GlobalOpt = true) : GlobalOpt(GlobalOpt) {} 275e8d8bef9SDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 276e8d8bef9SDimitry Andric 277e8d8bef9SDimitry Andric private: 278e8d8bef9SDimitry Andric bool GlobalOpt; 279e8d8bef9SDimitry Andric }; 280e8d8bef9SDimitry Andric 2810b57cec5SDimitry Andric ModulePass *createR600OpenCLImageTypeLoweringPass(); 2820b57cec5SDimitry Andric FunctionPass *createAMDGPUAnnotateUniformValues(); 2830b57cec5SDimitry Andric 2848bcb0991SDimitry Andric ModulePass *createAMDGPUPrintfRuntimeBinding(); 2858bcb0991SDimitry Andric void initializeAMDGPUPrintfRuntimeBindingPass(PassRegistry&); 2868bcb0991SDimitry Andric extern char &AMDGPUPrintfRuntimeBindingID; 2878bcb0991SDimitry Andric 288*fe6060f1SDimitry Andric void initializeAMDGPUResourceUsageAnalysisPass(PassRegistry &); 289*fe6060f1SDimitry Andric extern char &AMDGPUResourceUsageAnalysisID; 290*fe6060f1SDimitry 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 307*fe6060f1SDimitry Andric void initializeSIOptimizeVGPRLiveRangePass(PassRegistry &); 308*fe6060f1SDimitry Andric extern char &SIOptimizeVGPRLiveRangeID; 309*fe6060f1SDimitry 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 316e8d8bef9SDimitry Andric void initializeAMDGPULateCodeGenPreparePass(PassRegistry &); 317e8d8bef9SDimitry Andric extern char &AMDGPULateCodeGenPrepareID; 318e8d8bef9SDimitry Andric 3190b57cec5SDimitry Andric void initializeSIAnnotateControlFlowPass(PassRegistry&); 3200b57cec5SDimitry Andric extern char &SIAnnotateControlFlowPassID; 3210b57cec5SDimitry Andric 3220b57cec5SDimitry Andric void initializeSIMemoryLegalizerPass(PassRegistry&); 3230b57cec5SDimitry Andric extern char &SIMemoryLegalizerID; 3240b57cec5SDimitry Andric 3250b57cec5SDimitry Andric void initializeSIModeRegisterPass(PassRegistry&); 3260b57cec5SDimitry Andric extern char &SIModeRegisterID; 3270b57cec5SDimitry Andric 3285ffd83dbSDimitry Andric void initializeSIInsertHardClausesPass(PassRegistry &); 3295ffd83dbSDimitry Andric extern char &SIInsertHardClausesID; 3305ffd83dbSDimitry Andric 3310b57cec5SDimitry Andric void initializeSIInsertWaitcntsPass(PassRegistry&); 3320b57cec5SDimitry Andric extern char &SIInsertWaitcntsID; 3330b57cec5SDimitry Andric 3340b57cec5SDimitry Andric void initializeSIFormMemoryClausesPass(PassRegistry&); 3350b57cec5SDimitry Andric extern char &SIFormMemoryClausesID; 3360b57cec5SDimitry Andric 3375ffd83dbSDimitry Andric void initializeSIPostRABundlerPass(PassRegistry&); 3385ffd83dbSDimitry Andric extern char &SIPostRABundlerID; 3395ffd83dbSDimitry Andric 3400b57cec5SDimitry Andric void initializeAMDGPUUnifyDivergentExitNodesPass(PassRegistry&); 3410b57cec5SDimitry Andric extern char &AMDGPUUnifyDivergentExitNodesID; 3420b57cec5SDimitry Andric 3430b57cec5SDimitry Andric ImmutablePass *createAMDGPUAAWrapperPass(); 3440b57cec5SDimitry Andric void initializeAMDGPUAAWrapperPassPass(PassRegistry&); 3450b57cec5SDimitry Andric ImmutablePass *createAMDGPUExternalAAWrapperPass(); 3460b57cec5SDimitry Andric void initializeAMDGPUExternalAAWrapperPass(PassRegistry&); 3470b57cec5SDimitry Andric 3480b57cec5SDimitry Andric void initializeAMDGPUArgumentUsageInfoPass(PassRegistry &); 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andric ModulePass *createAMDGPUOpenCLEnqueuedBlockLoweringPass(); 3510b57cec5SDimitry Andric void initializeAMDGPUOpenCLEnqueuedBlockLoweringPass(PassRegistry &); 3520b57cec5SDimitry Andric extern char &AMDGPUOpenCLEnqueuedBlockLoweringID; 3530b57cec5SDimitry Andric 3540b57cec5SDimitry Andric void initializeGCNNSAReassignPass(PassRegistry &); 3550b57cec5SDimitry Andric extern char &GCNNSAReassignID; 3560b57cec5SDimitry Andric 357*fe6060f1SDimitry Andric void initializeGCNPreRAOptimizationsPass(PassRegistry &); 358*fe6060f1SDimitry Andric extern char &GCNPreRAOptimizationsID; 359*fe6060f1SDimitry Andric 3600b57cec5SDimitry Andric namespace AMDGPU { 3610b57cec5SDimitry Andric enum TargetIndex { 3620b57cec5SDimitry Andric TI_CONSTDATA_START, 3630b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD0, 3640b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD1, 3650b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD2, 3660b57cec5SDimitry Andric TI_SCRATCH_RSRC_DWORD3 3670b57cec5SDimitry Andric }; 3680b57cec5SDimitry Andric } 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric /// OpenCL uses address spaces to differentiate between 3710b57cec5SDimitry Andric /// various memory regions on the hardware. On the CPU 3720b57cec5SDimitry Andric /// all of the address spaces point to the same memory, 3730b57cec5SDimitry Andric /// however on the GPU, each address space points to 3740b57cec5SDimitry Andric /// a separate piece of memory that is unique from other 3750b57cec5SDimitry Andric /// memory locations. 3760b57cec5SDimitry Andric namespace AMDGPUAS { 3770b57cec5SDimitry Andric enum : unsigned { 3780b57cec5SDimitry Andric // The maximum value for flat, generic, local, private, constant and region. 3790b57cec5SDimitry Andric MAX_AMDGPU_ADDRESS = 7, 3800b57cec5SDimitry Andric 3810b57cec5SDimitry Andric FLAT_ADDRESS = 0, ///< Address space for flat memory. 3820b57cec5SDimitry Andric GLOBAL_ADDRESS = 1, ///< Address space for global memory (RAT0, VTX0). 3830b57cec5SDimitry Andric REGION_ADDRESS = 2, ///< Address space for region memory. (GDS) 3840b57cec5SDimitry Andric 3850b57cec5SDimitry Andric CONSTANT_ADDRESS = 4, ///< Address space for constant memory (VTX2). 3860b57cec5SDimitry Andric LOCAL_ADDRESS = 3, ///< Address space for local memory. 3870b57cec5SDimitry Andric PRIVATE_ADDRESS = 5, ///< Address space for private memory. 3880b57cec5SDimitry Andric 3890b57cec5SDimitry Andric CONSTANT_ADDRESS_32BIT = 6, ///< Address space for 32-bit constant memory. 3900b57cec5SDimitry Andric 3910b57cec5SDimitry Andric BUFFER_FAT_POINTER = 7, ///< Address space for 160-bit buffer fat pointers. 3920b57cec5SDimitry Andric 3930b57cec5SDimitry Andric /// Address space for direct addressible parameter memory (CONST0). 3940b57cec5SDimitry Andric PARAM_D_ADDRESS = 6, 3950b57cec5SDimitry Andric /// Address space for indirect addressible parameter memory (VTX1). 3960b57cec5SDimitry Andric PARAM_I_ADDRESS = 7, 3970b57cec5SDimitry Andric 3980b57cec5SDimitry Andric // Do not re-order the CONSTANT_BUFFER_* enums. Several places depend on 3990b57cec5SDimitry Andric // this order to be able to dynamically index a constant buffer, for 4000b57cec5SDimitry Andric // example: 4010b57cec5SDimitry Andric // 4020b57cec5SDimitry Andric // ConstantBufferAS = CONSTANT_BUFFER_0 + CBIdx 4030b57cec5SDimitry Andric 4040b57cec5SDimitry Andric CONSTANT_BUFFER_0 = 8, 4050b57cec5SDimitry Andric CONSTANT_BUFFER_1 = 9, 4060b57cec5SDimitry Andric CONSTANT_BUFFER_2 = 10, 4070b57cec5SDimitry Andric CONSTANT_BUFFER_3 = 11, 4080b57cec5SDimitry Andric CONSTANT_BUFFER_4 = 12, 4090b57cec5SDimitry Andric CONSTANT_BUFFER_5 = 13, 4100b57cec5SDimitry Andric CONSTANT_BUFFER_6 = 14, 4110b57cec5SDimitry Andric CONSTANT_BUFFER_7 = 15, 4120b57cec5SDimitry Andric CONSTANT_BUFFER_8 = 16, 4130b57cec5SDimitry Andric CONSTANT_BUFFER_9 = 17, 4140b57cec5SDimitry Andric CONSTANT_BUFFER_10 = 18, 4150b57cec5SDimitry Andric CONSTANT_BUFFER_11 = 19, 4160b57cec5SDimitry Andric CONSTANT_BUFFER_12 = 20, 4170b57cec5SDimitry Andric CONSTANT_BUFFER_13 = 21, 4180b57cec5SDimitry Andric CONSTANT_BUFFER_14 = 22, 4190b57cec5SDimitry Andric CONSTANT_BUFFER_15 = 23, 4200b57cec5SDimitry Andric 4210b57cec5SDimitry Andric // Some places use this if the address space can't be determined. 4220b57cec5SDimitry Andric UNKNOWN_ADDRESS_SPACE = ~0u, 4230b57cec5SDimitry Andric }; 4240b57cec5SDimitry Andric } 4250b57cec5SDimitry Andric 426e8d8bef9SDimitry Andric namespace AMDGPU { 427e8d8bef9SDimitry Andric 428e8d8bef9SDimitry Andric // FIXME: Missing constant_32bit 429e8d8bef9SDimitry Andric inline bool isFlatGlobalAddrSpace(unsigned AS) { 430e8d8bef9SDimitry Andric return AS == AMDGPUAS::GLOBAL_ADDRESS || 431e8d8bef9SDimitry Andric AS == AMDGPUAS::FLAT_ADDRESS || 432e8d8bef9SDimitry Andric AS == AMDGPUAS::CONSTANT_ADDRESS || 433e8d8bef9SDimitry Andric AS > AMDGPUAS::MAX_AMDGPU_ADDRESS; 434e8d8bef9SDimitry Andric } 435e8d8bef9SDimitry Andric } 436e8d8bef9SDimitry Andric 437e8d8bef9SDimitry Andric } // End namespace llvm 438e8d8bef9SDimitry Andric 4390b57cec5SDimitry Andric #endif 440