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>();
64 void addIRPasses(PassManagerWrapper &PMW)
override;
65 void addISelPrepare(PassManagerWrapper &PMW)
override;
66 Error addIRTranslator(PassManagerWrapper &PMW)
override;
67 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
68 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
69 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
70 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
72 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
74 Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
override;
76 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
78 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
79 void addAsmPrinter(PassManagerWrapper &PMW)
override;
80 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
84 addFunctionPass(AtomicExpandPass(TM), PMW);
86 Base::addIRPasses(PMW);
91 if (getOptLevel() != CodeGenOptLevel::None) {
92 addModulePass(SPIRVFinalizeShaderLinkagePass(
getTM()), PMW);
94 addModulePass(SPIRVRemoveUnusedResourcesPass(), PMW);
99 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
102 addFunctionPass(SPIRVRegularizerPass(), PMW);
104 addModulePass(SPIRVCtorDtorLoweringPass(), PMW);
105 addModulePass(SPIRVPrepareFunctionsPass(
getTM()), PMW);
106 addModulePass(SPIRVPrepareGlobalsPass(), PMW);
109void SPIRVCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
110 SPIRVTargetMachine &TM =
getTM();
116 addFunctionPass(InferAddressSpacesPass(), PMW);
123 addFunctionPass(LoopSimplifyPass(), PMW);
127 addFunctionPass(RegToMemPass(), PMW);
132 addFunctionPass(SPIRVMergeRegionExitTargetsPass(), PMW);
135 addFunctionPass(SPIRVStructurizerPass(), PMW);
139 addFunctionPass(PromotePass(), PMW);
143 addFunctionPass(LoopSimplifyPass(), PMW);
145 addFunctionPass(StripConvergenceIntrinsicsPass(), PMW);
147 addModulePass(SPIRVLegalizeResourceBindingPass(), PMW);
148 addModulePass(SPIRVLegalizeZeroSizeArraysPass(
getTM()), PMW);
149 addModulePass(SPIRVCBufferAccessPass(), PMW);
150 addModulePass(SPIRVPushConstantAccessPass(
getTM()), PMW);
151 addModulePass(SPIRVEmitIntrinsicsPass(
getTM()), PMW);
153 addFunctionPass(SPIRVLegalizePointerCastPass(
getTM()), PMW);
154 Base::addISelPrepare(PMW);
157Error SPIRVCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
158 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
162void SPIRVCodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
163 addMachineFunctionPass(SPIRVPreLegalizerCombinerPass(), PMW);
164 addMachineFunctionPass(SPIRVPreLegalizerPass(), PMW);
167Error SPIRVCodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
168 addMachineFunctionPass(LegalizerPass(), PMW);
169 addMachineFunctionPass(SPIRVPostLegalizerPass(), PMW);
173Error SPIRVCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
178Error SPIRVCodeGenPassBuilder::addGlobalInstructionSelect(
179 PassManagerWrapper &PMW) {
180 addMachineFunctionPass(
181 InstructionSelectPass(getOptLevel(),
false),
187Error SPIRVCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
191Error SPIRVCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
195void SPIRVCodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
196 addMachineFunctionPass(SPIRVPrepareModuleAnalysisPass(), PMW);
199void SPIRVCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
200 addModulePass(SPIRVAsmPrinterBeginPass(), PMW,
true);
203void SPIRVCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
205 if (CompletesPipeline) {
207 addModulePass(RequireAnalysisPass<SPIRVModuleAnalysis, Module>(), PMW,
210 addMachineFunctionPass(SPIRVAsmPrinterPass(), PMW);
213void SPIRVCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
214 addModulePass(SPIRVAsmPrinterEndPass(), PMW,
true);
220#define GET_PASS_REGISTRY "SPIRVPassRegistry.def"
229 auto CGPB = SPIRVCodeGenPassBuilder(*
this, Opt,
PIC);
230 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.