xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPU.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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);
62*0fca6ea1SDimitry Andric ModulePass *createAMDGPULowerBufferFatPointersPass();
630b57cec5SDimitry Andric FunctionPass *createSIModeRegisterPass();
64fe6060f1SDimitry Andric FunctionPass *createGCNPreRAOptimizationsPass();
650b57cec5SDimitry Andric 
66e8d8bef9SDimitry Andric struct AMDGPUSimplifyLibCallsPass : PassInfoMixin<AMDGPUSimplifyLibCallsPass> {
675f757f3fSDimitry Andric   AMDGPUSimplifyLibCallsPass() {}
685f757f3fSDimitry Andric   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
695f757f3fSDimitry Andric };
705f757f3fSDimitry Andric 
715f757f3fSDimitry Andric struct AMDGPUImageIntrinsicOptimizerPass
725f757f3fSDimitry Andric     : PassInfoMixin<AMDGPUImageIntrinsicOptimizerPass> {
735f757f3fSDimitry Andric   AMDGPUImageIntrinsicOptimizerPass(TargetMachine &TM) : TM(TM) {}
74e8d8bef9SDimitry Andric   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
75e8d8bef9SDimitry Andric 
76e8d8bef9SDimitry Andric private:
77e8d8bef9SDimitry Andric   TargetMachine &TM;
78e8d8bef9SDimitry Andric };
79e8d8bef9SDimitry Andric 
80e8d8bef9SDimitry Andric struct AMDGPUUseNativeCallsPass : PassInfoMixin<AMDGPUUseNativeCallsPass> {
81e8d8bef9SDimitry Andric   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
82e8d8bef9SDimitry Andric };
83e8d8bef9SDimitry Andric 
84*0fca6ea1SDimitry Andric void initializeAMDGPUDAGToDAGISelLegacyPass(PassRegistry &);
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric void initializeAMDGPUMachineCFGStructurizerPass(PassRegistry&);
870b57cec5SDimitry Andric extern char &AMDGPUMachineCFGStructurizerID;
880b57cec5SDimitry Andric 
890b57cec5SDimitry Andric void initializeAMDGPUAlwaysInlinePass(PassRegistry&);
900b57cec5SDimitry Andric 
910b57cec5SDimitry Andric Pass *createAMDGPUAnnotateKernelFeaturesPass();
925f757f3fSDimitry Andric Pass *createAMDGPUAttributorLegacyPass();
935f757f3fSDimitry Andric void initializeAMDGPUAttributorLegacyPass(PassRegistry &);
940b57cec5SDimitry Andric void initializeAMDGPUAnnotateKernelFeaturesPass(PassRegistry &);
950b57cec5SDimitry Andric extern char &AMDGPUAnnotateKernelFeaturesID;
960b57cec5SDimitry Andric 
9706c3fb27SDimitry Andric // DPP/Iterative option enables the atomic optimizer with given strategy
9806c3fb27SDimitry Andric // whereas None disables the atomic optimizer.
9906c3fb27SDimitry Andric enum class ScanOptions { DPP, Iterative, None };
10006c3fb27SDimitry Andric FunctionPass *createAMDGPUAtomicOptimizerPass(ScanOptions ScanStrategy);
1010b57cec5SDimitry Andric void initializeAMDGPUAtomicOptimizerPass(PassRegistry &);
1020b57cec5SDimitry Andric extern char &AMDGPUAtomicOptimizerID;
1030b57cec5SDimitry Andric 
104bdd1243dSDimitry Andric ModulePass *createAMDGPUCtorDtorLoweringLegacyPass();
105bdd1243dSDimitry Andric void initializeAMDGPUCtorDtorLoweringLegacyPass(PassRegistry &);
106bdd1243dSDimitry Andric extern char &AMDGPUCtorDtorLoweringLegacyPassID;
107349cc55cSDimitry Andric 
1080b57cec5SDimitry Andric FunctionPass *createAMDGPULowerKernelArgumentsPass();
1090b57cec5SDimitry Andric void initializeAMDGPULowerKernelArgumentsPass(PassRegistry &);
1100b57cec5SDimitry Andric extern char &AMDGPULowerKernelArgumentsID;
1110b57cec5SDimitry Andric 
112349cc55cSDimitry Andric FunctionPass *createAMDGPUPromoteKernelArgumentsPass();
113349cc55cSDimitry Andric void initializeAMDGPUPromoteKernelArgumentsPass(PassRegistry &);
114349cc55cSDimitry Andric extern char &AMDGPUPromoteKernelArgumentsID;
115349cc55cSDimitry Andric 
116349cc55cSDimitry Andric struct AMDGPUPromoteKernelArgumentsPass
117349cc55cSDimitry Andric     : PassInfoMixin<AMDGPUPromoteKernelArgumentsPass> {
118349cc55cSDimitry Andric   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
119349cc55cSDimitry Andric };
120349cc55cSDimitry 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 
1305f757f3fSDimitry Andric void initializeAMDGPULowerModuleLDSLegacyPass(PassRegistry &);
1315f757f3fSDimitry Andric extern char &AMDGPULowerModuleLDSLegacyPassID;
132fe6060f1SDimitry Andric 
133fe6060f1SDimitry Andric struct AMDGPULowerModuleLDSPass : PassInfoMixin<AMDGPULowerModuleLDSPass> {
1345f757f3fSDimitry Andric   const AMDGPUTargetMachine &TM;
1355f757f3fSDimitry Andric   AMDGPULowerModuleLDSPass(const AMDGPUTargetMachine &TM_) : TM(TM_) {}
1365f757f3fSDimitry Andric 
137fe6060f1SDimitry Andric   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
138fe6060f1SDimitry Andric };
139fe6060f1SDimitry Andric 
140*0fca6ea1SDimitry Andric void initializeAMDGPULowerBufferFatPointersPass(PassRegistry &);
141*0fca6ea1SDimitry Andric extern char &AMDGPULowerBufferFatPointersID;
142*0fca6ea1SDimitry Andric 
143*0fca6ea1SDimitry Andric struct AMDGPULowerBufferFatPointersPass
144*0fca6ea1SDimitry Andric     : PassInfoMixin<AMDGPULowerBufferFatPointersPass> {
145*0fca6ea1SDimitry Andric   AMDGPULowerBufferFatPointersPass(const TargetMachine &TM) : TM(TM) {}
146*0fca6ea1SDimitry Andric   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
147*0fca6ea1SDimitry Andric 
148*0fca6ea1SDimitry Andric private:
149*0fca6ea1SDimitry Andric   const TargetMachine &TM;
150*0fca6ea1SDimitry Andric };
151*0fca6ea1SDimitry Andric 
1520b57cec5SDimitry Andric void initializeAMDGPURewriteOutArgumentsPass(PassRegistry &);
1530b57cec5SDimitry Andric extern char &AMDGPURewriteOutArgumentsID;
1540b57cec5SDimitry Andric 
1550b57cec5SDimitry Andric void initializeGCNDPPCombinePass(PassRegistry &);
1560b57cec5SDimitry Andric extern char &GCNDPPCombineID;
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric void initializeSIFoldOperandsPass(PassRegistry &);
1590b57cec5SDimitry Andric extern char &SIFoldOperandsID;
1600b57cec5SDimitry Andric 
1610b57cec5SDimitry Andric void initializeSIPeepholeSDWAPass(PassRegistry &);
1620b57cec5SDimitry Andric extern char &SIPeepholeSDWAID;
1630b57cec5SDimitry Andric 
1640b57cec5SDimitry Andric void initializeSIShrinkInstructionsPass(PassRegistry&);
1650b57cec5SDimitry Andric extern char &SIShrinkInstructionsID;
1660b57cec5SDimitry Andric 
1670b57cec5SDimitry Andric void initializeSIFixSGPRCopiesPass(PassRegistry &);
1680b57cec5SDimitry Andric extern char &SIFixSGPRCopiesID;
1690b57cec5SDimitry Andric 
1700b57cec5SDimitry Andric void initializeSIFixVGPRCopiesPass(PassRegistry &);
1710b57cec5SDimitry Andric extern char &SIFixVGPRCopiesID;
1720b57cec5SDimitry Andric 
1735f757f3fSDimitry Andric void initializeSILowerWWMCopiesPass(PassRegistry &);
1745f757f3fSDimitry Andric extern char &SILowerWWMCopiesID;
1755f757f3fSDimitry Andric 
1760b57cec5SDimitry Andric void initializeSILowerI1CopiesPass(PassRegistry &);
1770b57cec5SDimitry Andric extern char &SILowerI1CopiesID;
1780b57cec5SDimitry Andric 
1795f757f3fSDimitry Andric void initializeAMDGPUGlobalISelDivergenceLoweringPass(PassRegistry &);
1805f757f3fSDimitry Andric extern char &AMDGPUGlobalISelDivergenceLoweringID;
1815f757f3fSDimitry Andric 
1827a6dacacSDimitry Andric void initializeAMDGPUMarkLastScratchLoadPass(PassRegistry &);
1837a6dacacSDimitry Andric extern char &AMDGPUMarkLastScratchLoadID;
1847a6dacacSDimitry Andric 
1850b57cec5SDimitry Andric void initializeSILowerSGPRSpillsPass(PassRegistry &);
1860b57cec5SDimitry Andric extern char &SILowerSGPRSpillsID;
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric void initializeSILoadStoreOptimizerPass(PassRegistry &);
1890b57cec5SDimitry Andric extern char &SILoadStoreOptimizerID;
1900b57cec5SDimitry Andric 
1910b57cec5SDimitry Andric void initializeSIWholeQuadModePass(PassRegistry &);
1920b57cec5SDimitry Andric extern char &SIWholeQuadModeID;
1930b57cec5SDimitry Andric 
1940b57cec5SDimitry Andric void initializeSILowerControlFlowPass(PassRegistry &);
1950b57cec5SDimitry Andric extern char &SILowerControlFlowID;
1960b57cec5SDimitry Andric 
1975ffd83dbSDimitry Andric void initializeSIPreEmitPeepholePass(PassRegistry &);
1985ffd83dbSDimitry Andric extern char &SIPreEmitPeepholeID;
1995ffd83dbSDimitry Andric 
200fe6060f1SDimitry Andric void initializeSILateBranchLoweringPass(PassRegistry &);
201fe6060f1SDimitry Andric extern char &SILateBranchLoweringPassID;
2020b57cec5SDimitry Andric 
2030b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPass(PassRegistry &);
2040b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingID;
2050b57cec5SDimitry Andric 
2060b57cec5SDimitry Andric void initializeSIPreAllocateWWMRegsPass(PassRegistry &);
2070b57cec5SDimitry Andric extern char &SIPreAllocateWWMRegsID;
2080b57cec5SDimitry Andric 
2095f757f3fSDimitry Andric void initializeAMDGPUImageIntrinsicOptimizerPass(PassRegistry &);
2105f757f3fSDimitry Andric extern char &AMDGPUImageIntrinsicOptimizerID;
2110b57cec5SDimitry Andric 
2120b57cec5SDimitry Andric void initializeAMDGPUPerfHintAnalysisPass(PassRegistry &);
2130b57cec5SDimitry Andric extern char &AMDGPUPerfHintAnalysisID;
2140b57cec5SDimitry Andric 
2155f757f3fSDimitry Andric void initializeGCNRegPressurePrinterPass(PassRegistry &);
2165f757f3fSDimitry Andric extern char &GCNRegPressurePrinterID;
2175f757f3fSDimitry Andric 
2180b57cec5SDimitry Andric // Passes common to R600 and SI
2190b57cec5SDimitry Andric FunctionPass *createAMDGPUPromoteAlloca();
2200b57cec5SDimitry Andric void initializeAMDGPUPromoteAllocaPass(PassRegistry&);
2210b57cec5SDimitry Andric extern char &AMDGPUPromoteAllocaID;
2220b57cec5SDimitry Andric 
2235ffd83dbSDimitry Andric FunctionPass *createAMDGPUPromoteAllocaToVector();
2245ffd83dbSDimitry Andric void initializeAMDGPUPromoteAllocaToVectorPass(PassRegistry&);
2255ffd83dbSDimitry Andric extern char &AMDGPUPromoteAllocaToVectorID;
2265ffd83dbSDimitry Andric 
227e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaPass : PassInfoMixin<AMDGPUPromoteAllocaPass> {
228e8d8bef9SDimitry Andric   AMDGPUPromoteAllocaPass(TargetMachine &TM) : TM(TM) {}
229e8d8bef9SDimitry Andric   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
230e8d8bef9SDimitry Andric 
231e8d8bef9SDimitry Andric private:
232e8d8bef9SDimitry Andric   TargetMachine &TM;
233e8d8bef9SDimitry Andric };
234e8d8bef9SDimitry Andric 
235e8d8bef9SDimitry Andric struct AMDGPUPromoteAllocaToVectorPass
236e8d8bef9SDimitry Andric     : PassInfoMixin<AMDGPUPromoteAllocaToVectorPass> {
237e8d8bef9SDimitry Andric   AMDGPUPromoteAllocaToVectorPass(TargetMachine &TM) : TM(TM) {}
238e8d8bef9SDimitry Andric   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
239e8d8bef9SDimitry Andric 
240e8d8bef9SDimitry Andric private:
241e8d8bef9SDimitry Andric   TargetMachine &TM;
242e8d8bef9SDimitry Andric };
243e8d8bef9SDimitry Andric 
24406c3fb27SDimitry Andric struct AMDGPUAtomicOptimizerPass : PassInfoMixin<AMDGPUAtomicOptimizerPass> {
24506c3fb27SDimitry Andric   AMDGPUAtomicOptimizerPass(TargetMachine &TM, ScanOptions ScanImpl)
24606c3fb27SDimitry Andric       : TM(TM), ScanImpl(ScanImpl) {}
24706c3fb27SDimitry Andric   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
24806c3fb27SDimitry Andric 
24906c3fb27SDimitry Andric private:
25006c3fb27SDimitry Andric   TargetMachine &TM;
25106c3fb27SDimitry Andric   ScanOptions ScanImpl;
25206c3fb27SDimitry Andric };
25306c3fb27SDimitry Andric 
2540b57cec5SDimitry Andric Pass *createAMDGPUStructurizeCFGPass();
2555f757f3fSDimitry Andric FunctionPass *createAMDGPUISelDag(TargetMachine &TM, CodeGenOptLevel OptLevel);
2560b57cec5SDimitry Andric ModulePass *createAMDGPUAlwaysInlinePass(bool GlobalOpt = true);
257e8d8bef9SDimitry Andric 
258e8d8bef9SDimitry Andric struct AMDGPUAlwaysInlinePass : PassInfoMixin<AMDGPUAlwaysInlinePass> {
259e8d8bef9SDimitry Andric   AMDGPUAlwaysInlinePass(bool GlobalOpt = true) : GlobalOpt(GlobalOpt) {}
260e8d8bef9SDimitry Andric   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
261e8d8bef9SDimitry Andric 
262e8d8bef9SDimitry Andric private:
263e8d8bef9SDimitry Andric   bool GlobalOpt;
264e8d8bef9SDimitry Andric };
265e8d8bef9SDimitry Andric 
26606c3fb27SDimitry Andric class AMDGPUCodeGenPreparePass
26706c3fb27SDimitry Andric     : public PassInfoMixin<AMDGPUCodeGenPreparePass> {
26806c3fb27SDimitry Andric private:
26906c3fb27SDimitry Andric   TargetMachine &TM;
27006c3fb27SDimitry Andric 
27106c3fb27SDimitry Andric public:
27206c3fb27SDimitry Andric   AMDGPUCodeGenPreparePass(TargetMachine &TM) : TM(TM){};
27306c3fb27SDimitry Andric   PreservedAnalyses run(Function &, FunctionAnalysisManager &);
27406c3fb27SDimitry Andric };
27506c3fb27SDimitry Andric 
2765f757f3fSDimitry Andric class AMDGPULowerKernelArgumentsPass
2775f757f3fSDimitry Andric     : public PassInfoMixin<AMDGPULowerKernelArgumentsPass> {
2785f757f3fSDimitry Andric private:
2795f757f3fSDimitry Andric   TargetMachine &TM;
2805f757f3fSDimitry Andric 
2815f757f3fSDimitry Andric public:
2825f757f3fSDimitry Andric   AMDGPULowerKernelArgumentsPass(TargetMachine &TM) : TM(TM){};
2835f757f3fSDimitry Andric   PreservedAnalyses run(Function &, FunctionAnalysisManager &);
2845f757f3fSDimitry Andric };
2855f757f3fSDimitry Andric 
2865f757f3fSDimitry Andric class AMDGPUAttributorPass : public PassInfoMixin<AMDGPUAttributorPass> {
2875f757f3fSDimitry Andric private:
2885f757f3fSDimitry Andric   TargetMachine &TM;
2895f757f3fSDimitry Andric 
2905f757f3fSDimitry Andric public:
2915f757f3fSDimitry Andric   AMDGPUAttributorPass(TargetMachine &TM) : TM(TM){};
2925f757f3fSDimitry Andric   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
2935f757f3fSDimitry Andric };
2945f757f3fSDimitry Andric 
2950b57cec5SDimitry Andric FunctionPass *createAMDGPUAnnotateUniformValues();
2960b57cec5SDimitry Andric 
2978bcb0991SDimitry Andric ModulePass *createAMDGPUPrintfRuntimeBinding();
2988bcb0991SDimitry Andric void initializeAMDGPUPrintfRuntimeBindingPass(PassRegistry&);
2998bcb0991SDimitry Andric extern char &AMDGPUPrintfRuntimeBindingID;
3008bcb0991SDimitry Andric 
301fe6060f1SDimitry Andric void initializeAMDGPUResourceUsageAnalysisPass(PassRegistry &);
302fe6060f1SDimitry Andric extern char &AMDGPUResourceUsageAnalysisID;
303fe6060f1SDimitry Andric 
304e8d8bef9SDimitry Andric struct AMDGPUPrintfRuntimeBindingPass
305e8d8bef9SDimitry Andric     : PassInfoMixin<AMDGPUPrintfRuntimeBindingPass> {
306e8d8bef9SDimitry Andric   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
307e8d8bef9SDimitry Andric };
308e8d8bef9SDimitry Andric 
3090b57cec5SDimitry Andric ModulePass* createAMDGPUUnifyMetadataPass();
3100b57cec5SDimitry Andric void initializeAMDGPUUnifyMetadataPass(PassRegistry&);
3110b57cec5SDimitry Andric extern char &AMDGPUUnifyMetadataID;
3120b57cec5SDimitry Andric 
313e8d8bef9SDimitry Andric struct AMDGPUUnifyMetadataPass : PassInfoMixin<AMDGPUUnifyMetadataPass> {
314e8d8bef9SDimitry Andric   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
315e8d8bef9SDimitry Andric };
316e8d8bef9SDimitry Andric 
3170b57cec5SDimitry Andric void initializeSIOptimizeExecMaskingPreRAPass(PassRegistry&);
3180b57cec5SDimitry Andric extern char &SIOptimizeExecMaskingPreRAID;
3190b57cec5SDimitry Andric 
320fe6060f1SDimitry Andric void initializeSIOptimizeVGPRLiveRangePass(PassRegistry &);
321fe6060f1SDimitry Andric extern char &SIOptimizeVGPRLiveRangeID;
322fe6060f1SDimitry Andric 
3230b57cec5SDimitry Andric void initializeAMDGPUAnnotateUniformValuesPass(PassRegistry&);
3240b57cec5SDimitry Andric extern char &AMDGPUAnnotateUniformValuesPassID;
3250b57cec5SDimitry Andric 
3260b57cec5SDimitry Andric void initializeAMDGPUCodeGenPreparePass(PassRegistry&);
3270b57cec5SDimitry Andric extern char &AMDGPUCodeGenPrepareID;
3280b57cec5SDimitry Andric 
32906c3fb27SDimitry Andric void initializeAMDGPURemoveIncompatibleFunctionsPass(PassRegistry &);
33006c3fb27SDimitry Andric extern char &AMDGPURemoveIncompatibleFunctionsID;
33106c3fb27SDimitry Andric 
332e8d8bef9SDimitry Andric void initializeAMDGPULateCodeGenPreparePass(PassRegistry &);
333e8d8bef9SDimitry Andric extern char &AMDGPULateCodeGenPrepareID;
334e8d8bef9SDimitry Andric 
3355f757f3fSDimitry Andric FunctionPass *createAMDGPURewriteUndefForPHILegacyPass();
3365f757f3fSDimitry Andric void initializeAMDGPURewriteUndefForPHILegacyPass(PassRegistry &);
3375f757f3fSDimitry Andric extern char &AMDGPURewriteUndefForPHILegacyPassID;
3385f757f3fSDimitry Andric 
3395f757f3fSDimitry Andric class AMDGPURewriteUndefForPHIPass
3405f757f3fSDimitry Andric     : public PassInfoMixin<AMDGPURewriteUndefForPHIPass> {
3415f757f3fSDimitry Andric public:
3425f757f3fSDimitry Andric   AMDGPURewriteUndefForPHIPass() = default;
3435f757f3fSDimitry Andric   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
3445f757f3fSDimitry Andric };
345bdd1243dSDimitry Andric 
3460b57cec5SDimitry Andric void initializeSIAnnotateControlFlowPass(PassRegistry&);
3470b57cec5SDimitry Andric extern char &SIAnnotateControlFlowPassID;
3480b57cec5SDimitry Andric 
3490b57cec5SDimitry Andric void initializeSIMemoryLegalizerPass(PassRegistry&);
3500b57cec5SDimitry Andric extern char &SIMemoryLegalizerID;
3510b57cec5SDimitry Andric 
3520b57cec5SDimitry Andric void initializeSIModeRegisterPass(PassRegistry&);
3530b57cec5SDimitry Andric extern char &SIModeRegisterID;
3540b57cec5SDimitry Andric 
35581ad6265SDimitry Andric void initializeAMDGPUInsertDelayAluPass(PassRegistry &);
35681ad6265SDimitry Andric extern char &AMDGPUInsertDelayAluID;
35781ad6265SDimitry Andric 
3585f757f3fSDimitry Andric void initializeAMDGPUInsertSingleUseVDSTPass(PassRegistry &);
3595f757f3fSDimitry Andric extern char &AMDGPUInsertSingleUseVDSTID;
3605f757f3fSDimitry Andric 
3615ffd83dbSDimitry Andric void initializeSIInsertHardClausesPass(PassRegistry &);
3625ffd83dbSDimitry Andric extern char &SIInsertHardClausesID;
3635ffd83dbSDimitry Andric 
3640b57cec5SDimitry Andric void initializeSIInsertWaitcntsPass(PassRegistry&);
3650b57cec5SDimitry Andric extern char &SIInsertWaitcntsID;
3660b57cec5SDimitry Andric 
3670b57cec5SDimitry Andric void initializeSIFormMemoryClausesPass(PassRegistry&);
3680b57cec5SDimitry Andric extern char &SIFormMemoryClausesID;
3690b57cec5SDimitry Andric 
3705ffd83dbSDimitry Andric void initializeSIPostRABundlerPass(PassRegistry&);
3715ffd83dbSDimitry Andric extern char &SIPostRABundlerID;
3725ffd83dbSDimitry Andric 
373753f127fSDimitry Andric void initializeGCNCreateVOPDPass(PassRegistry &);
374753f127fSDimitry Andric extern char &GCNCreateVOPDID;
375753f127fSDimitry Andric 
3760b57cec5SDimitry Andric void initializeAMDGPUUnifyDivergentExitNodesPass(PassRegistry&);
3770b57cec5SDimitry Andric extern char &AMDGPUUnifyDivergentExitNodesID;
3780b57cec5SDimitry Andric 
3790b57cec5SDimitry Andric ImmutablePass *createAMDGPUAAWrapperPass();
3800b57cec5SDimitry Andric void initializeAMDGPUAAWrapperPassPass(PassRegistry&);
3810b57cec5SDimitry Andric ImmutablePass *createAMDGPUExternalAAWrapperPass();
3820b57cec5SDimitry Andric void initializeAMDGPUExternalAAWrapperPass(PassRegistry&);
3830b57cec5SDimitry Andric 
3840b57cec5SDimitry Andric void initializeAMDGPUArgumentUsageInfoPass(PassRegistry &);
3850b57cec5SDimitry Andric 
3860b57cec5SDimitry Andric ModulePass *createAMDGPUOpenCLEnqueuedBlockLoweringPass();
3870b57cec5SDimitry Andric void initializeAMDGPUOpenCLEnqueuedBlockLoweringPass(PassRegistry &);
3880b57cec5SDimitry Andric extern char &AMDGPUOpenCLEnqueuedBlockLoweringID;
3890b57cec5SDimitry Andric 
3900b57cec5SDimitry Andric void initializeGCNNSAReassignPass(PassRegistry &);
3910b57cec5SDimitry Andric extern char &GCNNSAReassignID;
3920b57cec5SDimitry Andric 
39306c3fb27SDimitry Andric void initializeGCNPreRALongBranchRegPass(PassRegistry &);
39406c3fb27SDimitry Andric extern char &GCNPreRALongBranchRegID;
39506c3fb27SDimitry Andric 
396fe6060f1SDimitry Andric void initializeGCNPreRAOptimizationsPass(PassRegistry &);
397fe6060f1SDimitry Andric extern char &GCNPreRAOptimizationsID;
398fe6060f1SDimitry Andric 
39981ad6265SDimitry Andric FunctionPass *createAMDGPUSetWavePriorityPass();
40081ad6265SDimitry Andric void initializeAMDGPUSetWavePriorityPass(PassRegistry &);
40181ad6265SDimitry Andric 
40206c3fb27SDimitry Andric void initializeGCNRewritePartialRegUsesPass(llvm::PassRegistry &);
40306c3fb27SDimitry Andric extern char &GCNRewritePartialRegUsesID;
40406c3fb27SDimitry Andric 
4050b57cec5SDimitry Andric namespace AMDGPU {
4060b57cec5SDimitry Andric enum TargetIndex {
4070b57cec5SDimitry Andric   TI_CONSTDATA_START,
4080b57cec5SDimitry Andric   TI_SCRATCH_RSRC_DWORD0,
4090b57cec5SDimitry Andric   TI_SCRATCH_RSRC_DWORD1,
4100b57cec5SDimitry Andric   TI_SCRATCH_RSRC_DWORD2,
4110b57cec5SDimitry Andric   TI_SCRATCH_RSRC_DWORD3
4120b57cec5SDimitry Andric };
413e8d8bef9SDimitry Andric 
414e8d8bef9SDimitry Andric // FIXME: Missing constant_32bit
415e8d8bef9SDimitry Andric inline bool isFlatGlobalAddrSpace(unsigned AS) {
416e8d8bef9SDimitry Andric   return AS == AMDGPUAS::GLOBAL_ADDRESS ||
417e8d8bef9SDimitry Andric          AS == AMDGPUAS::FLAT_ADDRESS ||
418e8d8bef9SDimitry Andric          AS == AMDGPUAS::CONSTANT_ADDRESS ||
419e8d8bef9SDimitry Andric          AS > AMDGPUAS::MAX_AMDGPU_ADDRESS;
420e8d8bef9SDimitry Andric }
42106c3fb27SDimitry Andric 
42206c3fb27SDimitry Andric inline bool isExtendedGlobalAddrSpace(unsigned AS) {
42306c3fb27SDimitry Andric   return AS == AMDGPUAS::GLOBAL_ADDRESS || AS == AMDGPUAS::CONSTANT_ADDRESS ||
42406c3fb27SDimitry Andric          AS == AMDGPUAS::CONSTANT_ADDRESS_32BIT ||
42506c3fb27SDimitry Andric          AS > AMDGPUAS::MAX_AMDGPU_ADDRESS;
42606c3fb27SDimitry Andric }
42706c3fb27SDimitry Andric 
42806c3fb27SDimitry Andric static inline bool addrspacesMayAlias(unsigned AS1, unsigned AS2) {
4295f757f3fSDimitry Andric   static_assert(AMDGPUAS::MAX_AMDGPU_ADDRESS <= 9, "Addr space out of range");
43006c3fb27SDimitry Andric 
43106c3fb27SDimitry Andric   if (AS1 > AMDGPUAS::MAX_AMDGPU_ADDRESS || AS2 > AMDGPUAS::MAX_AMDGPU_ADDRESS)
43206c3fb27SDimitry Andric     return true;
43306c3fb27SDimitry Andric 
4345f757f3fSDimitry Andric   // This array is indexed by address space value enum elements 0 ... to 9
43506c3fb27SDimitry Andric   // clang-format off
4365f757f3fSDimitry Andric   static const bool ASAliasRules[10][10] = {
4375f757f3fSDimitry Andric     /*                       Flat   Global Region  Group Constant Private Const32 BufFatPtr BufRsrc BufStrdPtr */
4385f757f3fSDimitry Andric     /* Flat     */            {true,  true,  false, true,  true,  true,  true,  true,  true,  true},
4395f757f3fSDimitry Andric     /* Global   */            {true,  true,  false, false, true,  false, true,  true,  true,  true},
4405f757f3fSDimitry Andric     /* Region   */            {false, false, true,  false, false, false, false, false, false, false},
4415f757f3fSDimitry Andric     /* Group    */            {true,  false, false, true,  false, false, false, false, false, false},
4425f757f3fSDimitry Andric     /* Constant */            {true,  true,  false, false, false, false, true,  true,  true,  true},
4435f757f3fSDimitry Andric     /* Private  */            {true,  false, false, false, false, true,  false, false, false, false},
4445f757f3fSDimitry Andric     /* Constant 32-bit */     {true,  true,  false, false, true,  false, false, true,  true,  true},
4455f757f3fSDimitry Andric     /* Buffer Fat Ptr  */     {true,  true,  false, false, true,  false, true,  true,  true,  true},
4465f757f3fSDimitry Andric     /* Buffer Resource */     {true,  true,  false, false, true,  false, true,  true,  true,  true},
4475f757f3fSDimitry Andric     /* Buffer Strided Ptr  */ {true,  true,  false, false, true,  false, true,  true,  true,  true},
44806c3fb27SDimitry Andric   };
44906c3fb27SDimitry Andric   // clang-format on
45006c3fb27SDimitry Andric 
45106c3fb27SDimitry Andric   return ASAliasRules[AS1][AS2];
45206c3fb27SDimitry Andric }
45306c3fb27SDimitry Andric 
454e8d8bef9SDimitry Andric }
455e8d8bef9SDimitry Andric 
456e8d8bef9SDimitry Andric } // End namespace llvm
457e8d8bef9SDimitry Andric 
4580b57cec5SDimitry Andric #endif
459