66 explicit WebAssemblyCodeGenPassBuilder(WebAssemblyTargetMachine &TM,
67 const CGPassBuilderOption &Opts,
68 PassInstrumentationCallbacks *
PIC)
69 : CodeGenPassBuilder(TM, Opts,
PIC) {
70 disablePass<MachineLateInstrsCleanupPass, MachineCopyPropagationPass,
71 PostRAMachineSinkingPass, PostRASchedulerPass,
72 FuncletLayoutPass, StackMapLivenessPass, PatchableFunctionPass,
73 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass,
74 MachineBlockPlacementPass>();
83 if (getOptLevel() == CodeGenOptLevel::Less)
84 disablePass<RegisterCoalescerPass>();
87 void addIRPasses(PassManagerWrapper &PMW)
override;
88 void addISelPrepare(PassManagerWrapper &PMW)
override;
90 Error addInstSelector(PassManagerWrapper &PMW)
override;
92 Error addIRTranslator(PassManagerWrapper &PMW)
override;
93 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
94 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
95 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
96 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
97 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
99 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
101 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
102 void addPreEmitPass(PassManagerWrapper &PMW)
override;
103 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
104 void addAsmPrinter(PassManagerWrapper &PMW)
override;
105 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
111 addModulePass(WebAssemblyAddMissingPrototypesPass(), PMW);
114 addModulePass(LowerGlobalDtorsPass(), PMW);
118 addModulePass(WebAssemblyFixFunctionBitcastsPass(), PMW);
121 if (getOptLevel() != CodeGenOptLevel::None)
122 addFunctionPass(WebAssemblyOptimizeReturnedPass(), PMW);
134 addFunctionPass(LowerInvokePass(), PMW);
137 addFunctionPass(UnreachableBlockElimPass(), PMW);
146 addModulePass(WebAssemblyLowerEmscriptenEHSjLjPass(EnableEmEH), PMW);
150 addFunctionPass(IndirectBrExpandPass(TM), PMW);
153 addFunctionPass(WebAssemblyReduceToAnyAllTruePass(
getTM()), PMW);
155 Base::addIRPasses(PMW);
158void WebAssemblyCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
161 addFunctionPass(WebAssemblyRefTypeMem2LocalPass(), PMW);
164 addModulePass(WebAssemblyCoalesceFeaturesAndStripAtomicsPass(
getTM()), PMW);
167 addFunctionPass(AtomicExpandPass(TM), PMW);
169 Base::addISelPrepare(PMW);
172Error WebAssemblyCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
173 addMachineFunctionPass(WebAssemblyISelDAGToDAGPass(
getTM(), getOptLevel()),
179 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
184 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
187 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
191 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
196Error WebAssemblyCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
197 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
201void WebAssemblyCodeGenPassBuilder::addPreLegalizeMachineIR(
202 PassManagerWrapper &PMW) {
203 if (getOptLevel() != CodeGenOptLevel::None)
204 addMachineFunctionPass(WebAssemblyPreLegalizerCombinerPass(), PMW);
207Error WebAssemblyCodeGenPassBuilder::addLegalizeMachineIR(
208 PassManagerWrapper &PMW) {
209 addMachineFunctionPass(LegalizerPass(), PMW);
213void WebAssemblyCodeGenPassBuilder::addPreRegBankSelect(
214 PassManagerWrapper &PMW) {
215 if (getOptLevel() != CodeGenOptLevel::None)
216 addMachineFunctionPass(WebAssemblyPostLegalizerCombinerPass(), PMW);
219Error WebAssemblyCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
220 addMachineFunctionPass(RegBankSelectPass(), PMW);
224Error WebAssemblyCodeGenPassBuilder::addGlobalInstructionSelect(
225 PassManagerWrapper &PMW) {
226 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
228 if (isGlobalISelAbortEnabled()) {
229 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
230 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
231 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
232 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
238Error WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteFast(
239 PassManagerWrapper &PMW) {
243Expected<bool> WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
244 PassManagerWrapper &PMW) {
248void WebAssemblyCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
249 Base::addPreEmitPass(PMW);
252 addMachineFunctionPass(WebAssemblyNullifyDebugValueListsPass(), PMW);
256 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
259 addMachineFunctionPass(WebAssemblyFixIrreducibleControlFlowPass(), PMW);
264 addMachineFunctionPass(WebAssemblyLateEHPreparePass(), PMW);
269 addMachineFunctionPass(WebAssemblyReplacePhysRegsPass(), PMW);
272 if (getOptLevel() != CodeGenOptLevel::None) {
274 addMachineFunctionPass(WebAssemblyOptimizeLiveIntervalsPass(), PMW);
277 addMachineFunctionPass(WebAssemblyMemIntrinsicResultsPass(), PMW);
285 addMachineFunctionPass(WebAssemblyRegStackifyPass(getOptLevel()), PMW);
287 if (getOptLevel() != CodeGenOptLevel::None) {
291 addMachineFunctionPass(WebAssemblyRegColoringPass(), PMW);
296 addMachineFunctionPass(WebAssemblyCFGSortPass(), PMW);
299 addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
303 addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
306 addMachineFunctionPass(WebAssemblyLowerBrUnlessPass(), PMW);
309 if (getOptLevel() != CodeGenOptLevel::None)
310 addMachineFunctionPass(WebAssemblyPeepholePass(), PMW);
313 addMachineFunctionPass(WebAssemblyRegNumberingPass(), PMW);
317 addMachineFunctionPass(WebAssemblyDebugFixupPass(), PMW);
321 addModulePass(WebAssemblyMCLowerPrePass(), PMW);
324void WebAssemblyCodeGenPassBuilder::addAsmPrinterBegin(
325 PassManagerWrapper &PMW) {
326 addModulePass(WebAssemblyAsmPrinterBeginPass(), PMW,
true);
329void WebAssemblyCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
330 addMachineFunctionPass(WebAssemblyAsmPrinterPass(), PMW);
333void WebAssemblyCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
334 addModulePass(WebAssemblyAsmPrinterEndPass(), PMW);
340#define GET_PASS_REGISTRY "WebAssemblyPassRegistry.def"
349 auto CGPB = WebAssemblyCodeGenPassBuilder(*
this, Opt,
PIC);
350 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 > WasmEnableEH
cl::opt< bool > WasmEnableSjLj
cl::opt< bool > WasmEnableEmEH
cl::opt< bool > WasmEnableEmSjLj
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 ...
ExceptionHandling ExceptionModel
What exception model to use.
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 > WasmEnableEmEH
cl::opt< bool > WasmEnableEH
cl::opt< bool > WasmEnableSjLj
cl::opt< bool > WasmEnableEmSjLj
cl::opt< bool > WasmDisableExplicitLocals
cl::opt< bool > WasmEnableEH
cl::opt< bool > WasmEnableSjLj
cl::opt< bool > WasmEnableEmEH
cl::opt< bool > WasmEnableEmSjLj
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.