63 explicit WebAssemblyCodeGenPassBuilder(WebAssemblyTargetMachine &TM,
64 const CGPassBuilderOption &Opts,
65 PassInstrumentationCallbacks *
PIC)
66 : CodeGenPassBuilder(TM, Opts,
PIC) {
67 disablePass<MachineLateInstrsCleanupPass, MachineCopyPropagationPass,
68 PostRAMachineSinkingPass, PostRASchedulerPass,
69 FuncletLayoutPass, StackMapLivenessPass, PatchableFunctionPass,
70 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass,
71 MachineBlockPlacementPass>();
80 if (getOptLevel() == CodeGenOptLevel::Less)
81 disablePass<RegisterCoalescerPass>();
84 void addIRPasses(PassManagerWrapper &PMW)
override;
85 void addISelPrepare(PassManagerWrapper &PMW)
override;
87 Error addInstSelector(PassManagerWrapper &PMW)
override;
89 Error addIRTranslator(PassManagerWrapper &PMW)
override;
90 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
91 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
92 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
93 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
94 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
96 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
98 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
99 void addPreEmitPass(PassManagerWrapper &PMW)
override;
100 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
101 void addAsmPrinter(PassManagerWrapper &PMW)
override;
102 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
108 addModulePass(WebAssemblyAddMissingPrototypesPass(), PMW);
111 addModulePass(LowerGlobalDtorsPass(), PMW);
115 addModulePass(WebAssemblyFixFunctionBitcastsPass(), PMW);
118 if (getOptLevel() != CodeGenOptLevel::None)
119 addFunctionPass(WebAssemblyOptimizeReturnedPass(), PMW);
129 if (!EnableEmEH && !EnableWasmEH) {
130 addFunctionPass(LowerInvokePass(), PMW);
133 addFunctionPass(UnreachableBlockElimPass(), PMW);
142 addModulePass(WebAssemblyLowerEmscriptenEHSjLjPass(EnableEmEH), PMW);
146 addFunctionPass(IndirectBrExpandPass(TM), PMW);
149 addFunctionPass(WebAssemblyReduceToAnyAllTruePass(
getTM()), PMW);
151 Base::addIRPasses(PMW);
154void WebAssemblyCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
156 addFunctionPass(WasmEHPreparePass(), PMW);
160 addFunctionPass(WebAssemblyRefTypeMem2LocalPass(), PMW);
163 addModulePass(WebAssemblyCoalesceFeaturesAndStripAtomicsPass(
getTM()), PMW);
166 addFunctionPass(AtomicExpandPass(TM), PMW);
168 Base::addISelPrepare(PMW);
171Error WebAssemblyCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
172 addMachineFunctionPass(WebAssemblyISelDAGToDAGPass(
getTM(), getOptLevel()),
178 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
183 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
186 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
190 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
195Error WebAssemblyCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
196 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
200void WebAssemblyCodeGenPassBuilder::addPreLegalizeMachineIR(
201 PassManagerWrapper &PMW) {
202 if (getOptLevel() != CodeGenOptLevel::None)
203 addMachineFunctionPass(WebAssemblyPreLegalizerCombinerPass(), PMW);
206Error WebAssemblyCodeGenPassBuilder::addLegalizeMachineIR(
207 PassManagerWrapper &PMW) {
208 addMachineFunctionPass(LegalizerPass(), PMW);
212void WebAssemblyCodeGenPassBuilder::addPreRegBankSelect(
213 PassManagerWrapper &PMW) {
214 if (getOptLevel() != CodeGenOptLevel::None)
215 addMachineFunctionPass(WebAssemblyPostLegalizerCombinerPass(), PMW);
218Error WebAssemblyCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
219 addMachineFunctionPass(RegBankSelectPass(), PMW);
223Error WebAssemblyCodeGenPassBuilder::addGlobalInstructionSelect(
224 PassManagerWrapper &PMW) {
225 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
227 if (isGlobalISelAbortEnabled()) {
228 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
229 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
230 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
231 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
237Error WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteFast(
238 PassManagerWrapper &PMW) {
242Expected<bool> WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
243 PassManagerWrapper &PMW) {
247void WebAssemblyCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
248 Base::addPreEmitPass(PMW);
251 addMachineFunctionPass(WebAssemblyNullifyDebugValueListsPass(), PMW);
255 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
258 addMachineFunctionPass(WebAssemblyFixIrreducibleControlFlowPass(), PMW);
263 addMachineFunctionPass(WebAssemblyLateEHPreparePass(), PMW);
268 addMachineFunctionPass(WebAssemblyReplacePhysRegsPass(), PMW);
271 if (getOptLevel() != CodeGenOptLevel::None) {
273 addMachineFunctionPass(WebAssemblyOptimizeLiveIntervalsPass(), PMW);
276 addMachineFunctionPass(WebAssemblyMemIntrinsicResultsPass(), PMW);
284 addMachineFunctionPass(WebAssemblyRegStackifyPass(getOptLevel()), PMW);
286 if (getOptLevel() != CodeGenOptLevel::None) {
290 addMachineFunctionPass(WebAssemblyRegColoringPass(), PMW);
295 addMachineFunctionPass(WebAssemblyCFGSortPass(), PMW);
298 addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
302 addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
305 addMachineFunctionPass(WebAssemblyLowerBrUnlessPass(), PMW);
308 if (getOptLevel() != CodeGenOptLevel::None)
309 addMachineFunctionPass(WebAssemblyPeepholePass(), PMW);
312 addMachineFunctionPass(WebAssemblyRegNumberingPass(), PMW);
316 addMachineFunctionPass(WebAssemblyDebugFixupPass(), PMW);
320 addModulePass(WebAssemblyMCLowerPrePass(), PMW);
323void WebAssemblyCodeGenPassBuilder::addAsmPrinterBegin(
324 PassManagerWrapper &PMW) {
325 addModulePass(WebAssemblyAsmPrinterBeginPass(), PMW,
true);
328void WebAssemblyCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
329 addMachineFunctionPass(WebAssemblyAsmPrinterPass(), PMW);
332void WebAssemblyCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
333 addModulePass(WebAssemblyAsmPrinterEndPass(), PMW);
339#define GET_PASS_REGISTRY "WebAssemblyPassRegistry.def"
348 auto CGPB = WebAssemblyCodeGenPassBuilder(*
this, Opt,
PIC);
349 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 > WasmEnableSjLj
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 > WasmEnableSjLj
cl::opt< bool > WasmEnableEmSjLj
cl::opt< bool > WasmDisableExplicitLocals
cl::opt< bool > WasmEnableSjLj
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.