45 using Base = CodeGenPassBuilder;
47 SPIRVTargetMachine &
getTM()
const {
48 return static_cast<SPIRVTargetMachine &
>(TM);
52 explicit SPIRVCodeGenPassBuilder(SPIRVTargetMachine &TM,
53 const CGPassBuilderOption &Opts,
54 PassInstrumentationCallbacks *
PIC)
55 : CodeGenPassBuilder(TM, Opts,
PIC) {
57 disablePass<MachineCopyPropagationPass, PostRAMachineSinkingPass,
58 PostRASchedulerPass, FuncletLayoutPass, StackMapLivenessPass,
59 PatchableFunctionPass, ShrinkWrapPass, LiveDebugValuesPass,
60 MachineLateInstrsCleanupPass, RemoveLoadsIntoFakeUsesPass,
61 BranchFolderPass, MachineBlockPlacementPass>();
65 Opt.DisableLSR =
true;
68 void addIRPasses(PassManagerWrapper &PMW)
override;
69 void addISelPrepare(PassManagerWrapper &PMW)
override;
70 Error addIRTranslator(PassManagerWrapper &PMW)
override;
71 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
72 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
73 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
74 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
76 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
78 Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
override;
80 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
82 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
83 void addAsmPrinter(PassManagerWrapper &PMW)
override;
84 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
88 addFunctionPass(AtomicExpandPass(TM), PMW);
90 Base::addIRPasses(PMW);
95 if (getOptLevel() != CodeGenOptLevel::None) {
96 addModulePass(SPIRVFinalizeShaderLinkagePass(
getTM()), PMW);
98 addModulePass(SPIRVRemoveUnusedResourcesPass(), PMW);
103 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
106 addFunctionPass(SPIRVRegularizerPass(), PMW);
108 addModulePass(SPIRVCtorDtorLoweringPass(), PMW);
109 addModulePass(SPIRVPrepareFunctionsPass(
getTM()), PMW);
110 addModulePass(SPIRVPrepareGlobalsPass(), PMW);
113void SPIRVCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
114 SPIRVTargetMachine &TM =
getTM();
120 addFunctionPass(InferAddressSpacesPass(), PMW);
127 addFunctionPass(LoopSimplifyPass(), PMW);
131 addFunctionPass(RegToMemPass(), PMW);
136 addFunctionPass(SPIRVMergeRegionExitTargetsPass(), PMW);
139 addFunctionPass(SPIRVStructurizerPass(), PMW);
143 addFunctionPass(PromotePass(), PMW);
147 addFunctionPass(LoopSimplifyPass(), PMW);
149 addFunctionPass(StripConvergenceIntrinsicsPass(), PMW);
151 addModulePass(SPIRVLegalizeResourceBindingPass(), PMW);
152 addModulePass(SPIRVLegalizeZeroSizeArraysPass(
getTM()), PMW);
153 addModulePass(SPIRVCBufferAccessPass(), PMW);
154 addModulePass(SPIRVPushConstantAccessPass(
getTM()), PMW);
155 addModulePass(SPIRVEmitIntrinsicsPass(
getTM()), PMW);
157 addFunctionPass(SPIRVLegalizePointerCastPass(
getTM()), PMW);
158 Base::addISelPrepare(PMW);
161Error SPIRVCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
162 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
166void SPIRVCodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
167 addMachineFunctionPass(SPIRVPreLegalizerCombinerPass(), PMW);
168 addMachineFunctionPass(SPIRVPreLegalizerPass(), PMW);
171Error SPIRVCodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
172 addMachineFunctionPass(LegalizerPass(), PMW);
173 addMachineFunctionPass(SPIRVPostLegalizerPass(), PMW);
177Error SPIRVCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
182Error SPIRVCodeGenPassBuilder::addGlobalInstructionSelect(
183 PassManagerWrapper &PMW) {
184 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
189Error SPIRVCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
193Error SPIRVCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
197void SPIRVCodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
198 addMachineFunctionPass(SPIRVPrepareModuleAnalysisPass(), PMW);
201void SPIRVCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
202 addModulePass(SPIRVAsmPrinterBeginPass(), PMW,
true);
205void SPIRVCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
207 if (CompletesPipeline) {
209 addModulePass(RequireAnalysisPass<SPIRVModuleAnalysis, Module>(), PMW,
212 addMachineFunctionPass(SPIRVAsmPrinterPass(), PMW);
215void SPIRVCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
216 addModulePass(SPIRVAsmPrinterEndPass(), PMW,
true);
222#define GET_PASS_REGISTRY "SPIRVPassRegistry.def"
231 auto CGPB = SPIRVCodeGenPassBuilder(*
this, Opt,
PIC);
232 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
Interfaces for producing common pass manager configurations.
This file declares the IRTranslator pass.
ModuleAnalysisManager MAM
PassBuilder PB(Mod->getContext(), Machine, PassOpts->PTO, std::nullopt, &PIC)
PassInstrumentationCallbacks PIC
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This pass strips convergence intrinsics and operand bundles as those are only useful when modifying t...
This class provides access to building LLVM's passes.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Context object for machine code objects.
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
bool isLogicalSPIRV() const
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
const SPIRVSubtarget * getSubtargetImpl() const
Error buildCodeGenPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, const CGPassBuilderOption &Opt, MCContext &Ctx, PassInstrumentationCallbacks *PIC) override
An abstract base class for streams implementations that also support a pwrite operation.
Interfaces for registering analysis passes, producing common pass manager configurations,...
LLVM_READNONE constexpr bool isShader(CallingConv::ID CC)
This is an optimization pass for GlobalISel generic memory operations.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.