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);
98 addModulePass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering), PMW);
101 addFunctionPass(SPIRVRegularizerPass(), PMW);
103 addModulePass(SPIRVCtorDtorLoweringPass(), PMW);
104 addModulePass(SPIRVPrepareFunctionsPass(
getTM()), PMW);
105 addModulePass(SPIRVPrepareGlobalsPass(), PMW);
108void SPIRVCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
109 SPIRVTargetMachine &TM =
getTM();
115 addFunctionPass(InferAddressSpacesPass(), PMW);
122 addFunctionPass(LoopSimplifyPass(), PMW);
126 addFunctionPass(RegToMemPass(), PMW);
131 addFunctionPass(SPIRVMergeRegionExitTargetsPass(), PMW);
134 addFunctionPass(SPIRVStructurizerPass(), PMW);
138 addFunctionPass(PromotePass(), PMW);
142 addFunctionPass(LoopSimplifyPass(), PMW);
144 addFunctionPass(StripConvergenceIntrinsicsPass(), PMW);
146 addModulePass(SPIRVLegalizeResourceBindingPass(), PMW);
147 addModulePass(SPIRVLegalizeZeroSizeArraysPass(
getTM()), PMW);
148 addModulePass(SPIRVCBufferAccessPass(), PMW);
149 addModulePass(SPIRVPushConstantAccessPass(
getTM()), PMW);
150 addModulePass(SPIRVEmitIntrinsicsPass(
getTM()), PMW);
152 addFunctionPass(SPIRVLegalizePointerCastPass(
getTM()), PMW);
153 Base::addISelPrepare(PMW);
156Error SPIRVCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
157 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
161void SPIRVCodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
162 addMachineFunctionPass(SPIRVPreLegalizerCombinerPass(), PMW);
163 addMachineFunctionPass(SPIRVPreLegalizerPass(), PMW);
166Error SPIRVCodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
167 addMachineFunctionPass(LegalizerPass(), PMW);
168 addMachineFunctionPass(SPIRVPostLegalizerPass(), PMW);
172Error SPIRVCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
177Error SPIRVCodeGenPassBuilder::addGlobalInstructionSelect(
178 PassManagerWrapper &PMW) {
179 addMachineFunctionPass(
180 InstructionSelectPass(getOptLevel(),
false),
186Error SPIRVCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
190Error SPIRVCodeGenPassBuilder::addOptimizedRegAlloc(PassManagerWrapper &PMW) {
194void SPIRVCodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
195 addMachineFunctionPass(SPIRVPrepareModuleAnalysisPass(), PMW);
198void SPIRVCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
199 addModulePass(SPIRVAsmPrinterBeginPass(), PMW);
202void SPIRVCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
206 addModulePass(RequireAnalysisPass<SPIRVModuleAnalysis, Module>(), PMW,
209 addMachineFunctionPass(SPIRVAsmPrinterPass(), PMW);
212void SPIRVCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
213 addModulePass(SPIRVAsmPrinterEndPass(), PMW);
219#define GET_PASS_REGISTRY "SPIRVPassRegistry.def"
228 auto CGPB = SPIRVCodeGenPassBuilder(*
this, Opt,
PIC);
229 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
static bool willCompleteCodeGenPipeline()
Returns true if none of the -stop-before and -stop-after options is set.
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.