59 explicit WebAssemblyCodeGenPassBuilder(WebAssemblyTargetMachine &TM,
60 const CGPassBuilderOption &Opts,
61 PassInstrumentationCallbacks *
PIC)
62 : CodeGenPassBuilder(TM, Opts,
PIC) {
63 disablePass<MachineLateInstrsCleanupPass, MachineCopyPropagationPass,
64 PostRAMachineSinkingPass, PostRASchedulerPass,
65 FuncletLayoutPass, StackMapLivenessPass, PatchableFunctionPass,
66 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass,
67 MachineBlockPlacementPass>();
76 if (getOptLevel() == CodeGenOptLevel::Less)
77 disablePass<RegisterCoalescerPass>();
80 void addIRPasses(PassManagerWrapper &PMW)
override;
81 void addPassesToHandleExceptions(PassManagerWrapper &PMW)
override;
82 void addISelPrepare(PassManagerWrapper &PMW)
override;
84 Error addInstSelector(PassManagerWrapper &PMW)
override;
86 Error addIRTranslator(PassManagerWrapper &PMW)
override;
87 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
88 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
89 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
90 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
91 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
93 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
95 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
96 void addPreEmitPass(PassManagerWrapper &PMW)
override;
97 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
98 void addAsmPrinter(PassManagerWrapper &PMW)
override;
99 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
105 addModulePass(WebAssemblyAddMissingPrototypesPass(), PMW);
108 addModulePass(LowerGlobalDtorsPass(), PMW);
112 addModulePass(WebAssemblyFixFunctionBitcastsPass(), PMW);
115 if (getOptLevel() != CodeGenOptLevel::None)
116 addFunctionPass(WebAssemblyOptimizeReturnedPass(), PMW);
121 addModulePass(WebAssemblyLowerEmscriptenEHSjLjPass(), PMW);
124 addFunctionPass(IndirectBrExpandPass(TM), PMW);
127 addFunctionPass(WebAssemblyReduceToAnyAllTruePass(
getTM()), PMW);
129 Base::addIRPasses(PMW);
132void WebAssemblyCodeGenPassBuilder::addPassesToHandleExceptions(
133 PassManagerWrapper &PMW) {
136 addFunctionPass(WinEHPreparePass(), PMW);
137 addFunctionPass(WasmEHPreparePass(), PMW);
140void WebAssemblyCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
143 addFunctionPass(WebAssemblyRefTypeMem2LocalPass(), PMW);
146 addModulePass(WebAssemblyCoalesceFeaturesAndStripAtomicsPass(
getTM()), PMW);
149 addFunctionPass(AtomicExpandPass(TM), PMW);
151 Base::addISelPrepare(PMW);
154Error WebAssemblyCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
155 addMachineFunctionPass(WebAssemblyISelDAGToDAGPass(
getTM(), getOptLevel()),
161 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
166 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
169 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
173 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
178Error WebAssemblyCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
179 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
183void WebAssemblyCodeGenPassBuilder::addPreLegalizeMachineIR(
184 PassManagerWrapper &PMW) {
185 if (getOptLevel() != CodeGenOptLevel::None)
186 addMachineFunctionPass(WebAssemblyPreLegalizerCombinerPass(), PMW);
189Error WebAssemblyCodeGenPassBuilder::addLegalizeMachineIR(
190 PassManagerWrapper &PMW) {
191 addMachineFunctionPass(LegalizerPass(), PMW);
195void WebAssemblyCodeGenPassBuilder::addPreRegBankSelect(
196 PassManagerWrapper &PMW) {
197 if (getOptLevel() != CodeGenOptLevel::None)
198 addMachineFunctionPass(WebAssemblyPostLegalizerCombinerPass(), PMW);
201Error WebAssemblyCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
202 addMachineFunctionPass(RegBankSelectPass(), PMW);
206Error WebAssemblyCodeGenPassBuilder::addGlobalInstructionSelect(
207 PassManagerWrapper &PMW) {
208 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
210 if (isGlobalISelAbortEnabled()) {
211 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
212 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
213 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
214 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
220Error WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteFast(
221 PassManagerWrapper &PMW) {
225Expected<bool> WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
226 PassManagerWrapper &PMW) {
230void WebAssemblyCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
231 Base::addPreEmitPass(PMW);
234 addMachineFunctionPass(WebAssemblyNullifyDebugValueListsPass(), PMW);
238 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
241 addMachineFunctionPass(WebAssemblyFixIrreducibleControlFlowPass(), PMW);
245 addMachineFunctionPass(WebAssemblyLateEHPreparePass(), PMW);
250 addMachineFunctionPass(WebAssemblyReplacePhysRegsPass(), PMW);
253 if (getOptLevel() != CodeGenOptLevel::None) {
255 addMachineFunctionPass(WebAssemblyOptimizeLiveIntervalsPass(), PMW);
258 addMachineFunctionPass(WebAssemblyMemIntrinsicResultsPass(), PMW);
266 addMachineFunctionPass(WebAssemblyRegStackifyPass(getOptLevel()), PMW);
268 if (getOptLevel() != CodeGenOptLevel::None) {
272 addMachineFunctionPass(WebAssemblyRegColoringPass(), PMW);
277 addMachineFunctionPass(WebAssemblyCFGSortPass(), PMW);
280 addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
284 addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
287 addMachineFunctionPass(WebAssemblyLowerBrUnlessPass(), PMW);
290 if (getOptLevel() != CodeGenOptLevel::None)
291 addMachineFunctionPass(WebAssemblyPeepholePass(), PMW);
294 addMachineFunctionPass(WebAssemblyRegNumberingPass(), PMW);
298 addMachineFunctionPass(WebAssemblyDebugFixupPass(), PMW);
302 addModulePass(WebAssemblyMCLowerPrePass(), PMW);
305void WebAssemblyCodeGenPassBuilder::addAsmPrinterBegin(
306 PassManagerWrapper &PMW) {
307 addModulePass(WebAssemblyAsmPrinterBeginPass(), PMW,
true);
310void WebAssemblyCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
311 addMachineFunctionPass(WebAssemblyAsmPrinterPass(), PMW);
314void WebAssemblyCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
315 addModulePass(WebAssemblyAsmPrinterEndPass(), PMW);
321#define GET_PASS_REGISTRY "WebAssemblyPassRegistry.def"
330 auto CGPB = WebAssemblyCodeGenPassBuilder(*
this, Opt,
PIC);
331 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 ...
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
cl::opt< bool > WasmDisableExplicitLocals
This file implements WebAssemblyException information analysis.
This file declares the WebAssembly-specific subclass of TargetMachine.
This file contains the entry points for global functions defined in the LLVM WebAssembly back-end.
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 ...
void registerPassBuilderCallbacks(PassBuilder &PbB) override
Allow the target to modify the pass pipeline.
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,...
cl::opt< bool > WasmDisableExplicitLocals
cl::opt< bool > WasmDisableExplicitLocals
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.