44 using Base = CodeGenPassBuilder;
46 SPIRVTargetMachine &
getTM()
const {
47 return static_cast<SPIRVTargetMachine &
>(TM);
51 explicit SPIRVCodeGenPassBuilder(SPIRVTargetMachine &TM,
52 const CGPassBuilderOption &Opts,
53 PassInstrumentationCallbacks *
PIC)
54 : CodeGenPassBuilder(TM, Opts,
PIC) {
56 disablePass<MachineCopyPropagationPass, PostRAMachineSinkingPass,
57 PostRASchedulerPass, FuncletLayoutPass, StackMapLivenessPass,
58 PatchableFunctionPass, ShrinkWrapPass, LiveDebugValuesPass,
59 MachineLateInstrsCleanupPass, RemoveLoadsIntoFakeUsesPass,
60 BranchFolderPass, MachineBlockPlacementPass>();
63 void addIRPasses(PassManagerWrapper &PMW)
override;
64 void addISelPrepare(PassManagerWrapper &PMW)
override;
65 Error addIRTranslator(PassManagerWrapper &PMW)
override;
66 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
67 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
68 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
69 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
71 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
73 Error addOptimizedRegAlloc(PassManagerWrapper &PMW)
override;
75 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
76 void addAsmPrinter(PassManagerWrapper &PMW)
override;
77 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
81 addFunctionPass(AtomicExpandPass(TM), PMW);
83 Base::addIRPasses(PMW);
88 if (getOptLevel() != CodeGenOptLevel::None) {
89 addModulePass(SPIRVFinalizeShaderLinkagePass(
getTM()), PMW);
95 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
98 addFunctionPass(SPIRVRegularizerPass(), PMW);
100 addModulePass(SPIRVCtorDtorLoweringPass(), PMW);
101 addModulePass(SPIRVPrepareFunctionsPass(
getTM()), PMW);
102 addModulePass(SPIRVPrepareGlobalsPass(), PMW);
105void SPIRVCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
106 SPIRVTargetMachine &TM =
getTM();
112 addFunctionPass(InferAddressSpacesPass(), PMW);
119 addFunctionPass(LoopSimplifyPass(), PMW);
123 addFunctionPass(RegToMemPass(), PMW);
128 addFunctionPass(SPIRVMergeRegionExitTargetsPass(), PMW);
131 addFunctionPass(SPIRVStructurizerPass(), PMW);
135 addFunctionPass(PromotePass(), PMW);
139 addFunctionPass(LoopSimplifyPass(), PMW);
141 addFunctionPass(StripConvergenceIntrinsicsPass(), PMW);
143 addModulePass(SPIRVLegalizeImplicitBindingPass(), PMW);
144 addModulePass(SPIRVLegalizeZeroSizeArraysPass(
getTM()), PMW);
145 addModulePass(SPIRVCBufferAccessPass(), PMW);
146 addModulePass(SPIRVPushConstantAccessPass(
getTM()), PMW);
147 addModulePass(SPIRVEmitIntrinsicsPass(
getTM()), PMW);
149 addFunctionPass(SPIRVLegalizePointerCastPass(
getTM()), PMW);
150 Base::addISelPrepare(PMW);
153Error SPIRVCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
154 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
158void SPIRVCodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
159 addMachineFunctionPass(SPIRVPreLegalizerCombinerPass(), PMW);
160 addMachineFunctionPass(SPIRVPreLegalizerPass(), PMW);
163Error SPIRVCodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
164 addMachineFunctionPass(LegalizerPass(), PMW);
165 addMachineFunctionPass(SPIRVPostLegalizerPass(), PMW);
169Error SPIRVCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
174Error SPIRVCodeGenPassBuilder::addGlobalInstructionSelect(
175 PassManagerWrapper &PMW) {
176 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
181Error SPIRVCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
185Error SPIRVCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
189void SPIRVCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
190 addModulePass(SPIRVAsmPrinterBeginPass(), PMW);
193void SPIRVCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
194 addMachineFunctionPass(SPIRVAsmPrinterPass(), PMW);
197void SPIRVCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
198 addModulePass(SPIRVAsmPrinterEndPass(), PMW);
204#define GET_PASS_REGISTRY "SPIRVPassRegistry.def"
213 auto CGPB = SPIRVCodeGenPassBuilder(*
this, Opt,
PIC);
214 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
Interfaces for producing common pass manager configurations.
This file declares the IRTranslator pass.
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &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.