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