1//===-- SPIRV.h - Top-level interface for SPIR-V representation -*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIB_TARGET_SPIRV_SPIRV_H
10#define LLVM_LIB_TARGET_SPIRV_SPIRV_H
11
12#include "MCTargetDesc/SPIRVMCTargetDesc.h"
13#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
14#include "llvm/IR/Analysis.h"
15#include "llvm/IR/PassManager.h"
16#include "llvm/Pass.h"
17#include "llvm/PassRegistry.h"
18#include "llvm/Target/TargetMachine.h"
19
20namespace llvm {
21class SPIRVTargetMachine;
22class SPIRVSubtarget;
23class InstructionSelector;
24class RegisterBankInfo;
25
26class SPIRVPrepareFunctionsPass
27 : public RequiredPassInfoMixin<SPIRVPrepareFunctionsPass> {
28 const SPIRVTargetMachine &TM;
29
30public:
31 explicit SPIRVPrepareFunctionsPass(const SPIRVTargetMachine &TM) : TM(TM) {}
32 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
33};
34
35ModulePass *createSPIRVPrepareFunctionsPass(const SPIRVTargetMachine &TM);
36
37class SPIRVStructurizerPass
38 : public RequiredPassInfoMixin<SPIRVStructurizerPass> {
39public:
40 PreservedAnalyses run(Function &M, FunctionAnalysisManager &AM);
41};
42
43FunctionPass *createSPIRVStructurizerPass();
44
45class SPIRVCBufferAccessPass
46 : public RequiredPassInfoMixin<SPIRVCBufferAccessPass> {
47public:
48 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
49};
50
51ModulePass *createSPIRVCBufferAccessLegacyPass();
52
53class SPIRVPushConstantAccessPass
54 : public RequiredPassInfoMixin<SPIRVPushConstantAccessPass> {
55 const SPIRVTargetMachine &TM;
56
57public:
58 SPIRVPushConstantAccessPass(const SPIRVTargetMachine &TM) : TM(TM) {}
59 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
60};
61
62ModulePass *createSPIRVPushConstantAccessLegacyPass(SPIRVTargetMachine *TM);
63
64class SPIRVMergeRegionExitTargetsPass
65 : public RequiredPassInfoMixin<SPIRVMergeRegionExitTargetsPass> {
66public:
67 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
68};
69
70FunctionPass *createSPIRVMergeRegionExitTargetsPass();
71
72class SPIRVLegalizeResourceBindingPass
73 : public RequiredPassInfoMixin<SPIRVLegalizeResourceBindingPass> {
74public:
75 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
76};
77
78ModulePass *createSPIRVLegalizeResourceBindingPass();
79
80class SPIRVLegalizeZeroSizeArraysPass
81 : public RequiredPassInfoMixin<SPIRVLegalizeZeroSizeArraysPass> {
82 const SPIRVTargetMachine &TM;
83
84public:
85 SPIRVLegalizeZeroSizeArraysPass(const SPIRVTargetMachine &TM) : TM(TM) {}
86 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
87};
88
89ModulePass *createSPIRVLegalizeZeroSizeArraysPass(const SPIRVTargetMachine &TM);
90
91class SPIRVFinalizeShaderLinkagePass
92 : public RequiredPassInfoMixin<SPIRVFinalizeShaderLinkagePass> {
93 const SPIRVTargetMachine &TM;
94
95public:
96 SPIRVFinalizeShaderLinkagePass(const SPIRVTargetMachine &TM) : TM(TM) {}
97 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
98};
99
100ModulePass *createSPIRVFinalizeShaderLinkagePass(const SPIRVTargetMachine &TM);
101
102class SPIRVLegalizePointerCastPass
103 : public RequiredPassInfoMixin<SPIRVLegalizePointerCastPass> {
104 const SPIRVTargetMachine &TM;
105
106public:
107 explicit SPIRVLegalizePointerCastPass(const SPIRVTargetMachine &TM)
108 : TM(TM) {}
109 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
110};
111
112FunctionPass *createSPIRVLegalizePointerCastPass(SPIRVTargetMachine *TM);
113
114class SPIRVRegularizerPass
115 : public RequiredPassInfoMixin<SPIRVRegularizerPass> {
116public:
117 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
118};
119
120FunctionPass *createSPIRVRegularizerPass();
121
122class SPIRVPreLegalizerPass
123 : public RequiredPassInfoMixin<SPIRVPreLegalizerPass> {
124public:
125 PreservedAnalyses run(MachineFunction &MF,
126 MachineFunctionAnalysisManager &MFAM);
127};
128
129FunctionPass *createSPIRVPreLegalizerLegacyPass();
130
131class SPIRVPreLegalizerCombinerPass
132 : public RequiredPassInfoMixin<SPIRVPreLegalizerCombinerPass> {
133public:
134 PreservedAnalyses run(MachineFunction &MF,
135 MachineFunctionAnalysisManager &MFAM);
136};
137
138FunctionPass *createSPIRVPreLegalizerCombinerLegacyPass();
139
140class SPIRVPostLegalizerPass
141 : public RequiredPassInfoMixin<SPIRVPostLegalizerPass> {
142public:
143 PreservedAnalyses run(MachineFunction &MF,
144 MachineFunctionAnalysisManager &MFAM);
145};
146
147FunctionPass *createSPIRVPostLegalizerLegacyPass();
148
149/// Rewrites MIR into the form SPIRVModuleAnalysis expects.
150class SPIRVPrepareModuleAnalysisPass
151 : public RequiredPassInfoMixin<SPIRVPrepareModuleAnalysisPass> {
152public:
153 PreservedAnalyses run(MachineFunction &MF,
154 MachineFunctionAnalysisManager &MFAM);
155};
156
157FunctionPass *createSPIRVPrepareModuleAnalysisLegacyPass();
158
159class SPIRVEmitIntrinsicsPass
160 : public RequiredPassInfoMixin<SPIRVEmitIntrinsicsPass> {
161 const SPIRVTargetMachine &TM;
162
163public:
164 SPIRVEmitIntrinsicsPass(const SPIRVTargetMachine &TM) : TM(TM) {}
165 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
166};
167
168ModulePass *createSPIRVEmitIntrinsicsPass(const SPIRVTargetMachine &TM);
169
170class SPIRVPrepareGlobalsPass
171 : public RequiredPassInfoMixin<SPIRVPrepareGlobalsPass> {
172public:
173 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
174};
175
176ModulePass *createSPIRVPrepareGlobalsPass();
177
178/// Lower llvm.global_ctors and llvm.global_dtors to special kernels.
179class SPIRVCtorDtorLoweringPass
180 : public RequiredPassInfoMixin<SPIRVCtorDtorLoweringPass> {
181public:
182 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
183};
184
185ModulePass *createSPIRVCtorDtorLoweringLegacyPass();
186InstructionSelector *
187createSPIRVInstructionSelector(const SPIRVTargetMachine &TM,
188 const SPIRVSubtarget &Subtarget,
189 const RegisterBankInfo &RBI);
190
191void initializeSPIRVModuleAnalysisWrapperPassPass(PassRegistry &);
192void initializeSPIRVAsmPrinterPass(PassRegistry &);
193void initializeSPIRVConvergenceRegionAnalysisWrapperPassPass(PassRegistry &);
194void initializeSPIRVPreLegalizerLegacyPass(PassRegistry &);
195void initializeSPIRVPreLegalizerCombinerLegacyPass(PassRegistry &);
196void initializeSPIRVPostLegalizerLegacyPass(PassRegistry &);
197void initializeSPIRVPrepareModuleAnalysisLegacyPass(PassRegistry &);
198void initializeSPIRVStructurizerPass(PassRegistry &);
199void initializeSPIRVCBufferAccessLegacyPass(PassRegistry &);
200void initializeSPIRVPushConstantAccessLegacyPass(PassRegistry &);
201void initializeSPIRVEmitIntrinsicsLegacyPass(PassRegistry &);
202void initializeSPIRVLegalizePointerCastLegacyPass(PassRegistry &);
203void initializeSPIRVRegularizerLegacyPass(PassRegistry &);
204void initializeSPIRVMergeRegionExitTargetsLegacyPass(PassRegistry &);
205void initializeSPIRVPrepareFunctionsLegacyPass(PassRegistry &);
206void initializeSPIRVPrepareGlobalsLegacyPass(PassRegistry &);
207void initializeSPIRVLegalizeResourceBindingLegacyPass(PassRegistry &);
208void initializeSPIRVLegalizeZeroSizeArraysLegacyPass(PassRegistry &);
209void initializeSPIRVFinalizeShaderLinkageLegacyPass(PassRegistry &);
210void initializeSPIRVCtorDtorLoweringLegacyPass(PassRegistry &);
211} // namespace llvm
212
213#endif // LLVM_LIB_TARGET_SPIRV_SPIRV_H
214