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 SPIRVLegalizeImplicitBindingPass
73 : public RequiredPassInfoMixin<SPIRVLegalizeImplicitBindingPass> {
74public:
75 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
76};
77
78ModulePass *createSPIRVLegalizeImplicitBindingPass();
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
149class SPIRVEmitIntrinsicsPass
150 : public RequiredPassInfoMixin<SPIRVEmitIntrinsicsPass> {
151 const SPIRVTargetMachine &TM;
152
153public:
154 SPIRVEmitIntrinsicsPass(const SPIRVTargetMachine &TM) : TM(TM) {}
155 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
156};
157
158ModulePass *createSPIRVEmitIntrinsicsPass(const SPIRVTargetMachine &TM);
159
160class SPIRVPrepareGlobalsPass
161 : public RequiredPassInfoMixin<SPIRVPrepareGlobalsPass> {
162public:
163 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
164};
165
166ModulePass *createSPIRVPrepareGlobalsPass();
167
168/// Lower llvm.global_ctors and llvm.global_dtors to special kernels.
169class SPIRVCtorDtorLoweringPass
170 : public RequiredPassInfoMixin<SPIRVCtorDtorLoweringPass> {
171public:
172 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
173};
174
175ModulePass *createSPIRVCtorDtorLoweringLegacyPass();
176InstructionSelector *
177createSPIRVInstructionSelector(const SPIRVTargetMachine &TM,
178 const SPIRVSubtarget &Subtarget,
179 const RegisterBankInfo &RBI);
180
181void initializeSPIRVModuleAnalysisPass(PassRegistry &);
182void initializeSPIRVAsmPrinterPass(PassRegistry &);
183void initializeSPIRVConvergenceRegionAnalysisWrapperPassPass(PassRegistry &);
184void initializeSPIRVPreLegalizerLegacyPass(PassRegistry &);
185void initializeSPIRVPreLegalizerCombinerLegacyPass(PassRegistry &);
186void initializeSPIRVPostLegalizerLegacyPass(PassRegistry &);
187void initializeSPIRVStructurizerPass(PassRegistry &);
188void initializeSPIRVCBufferAccessLegacyPass(PassRegistry &);
189void initializeSPIRVPushConstantAccessLegacyPass(PassRegistry &);
190void initializeSPIRVEmitIntrinsicsLegacyPass(PassRegistry &);
191void initializeSPIRVLegalizePointerCastLegacyPass(PassRegistry &);
192void initializeSPIRVRegularizerLegacyPass(PassRegistry &);
193void initializeSPIRVMergeRegionExitTargetsLegacyPass(PassRegistry &);
194void initializeSPIRVPrepareFunctionsLegacyPass(PassRegistry &);
195void initializeSPIRVPrepareGlobalsLegacyPass(PassRegistry &);
196void initializeSPIRVLegalizeImplicitBindingLegacyPass(PassRegistry &);
197void initializeSPIRVLegalizeZeroSizeArraysLegacyPass(PassRegistry &);
198void initializeSPIRVFinalizeShaderLinkageLegacyPass(PassRegistry &);
199void initializeSPIRVCtorDtorLoweringLegacyPass(PassRegistry &);
200} // namespace llvm
201
202#endif // LLVM_LIB_TARGET_SPIRV_SPIRV_H
203