xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPU.h (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
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