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);
131 addFunctionPass(LowerInvokePass(), PMW);
134 addFunctionPass(UnreachableBlockElimPass(), PMW);
143 addModulePass(WebAssemblyLowerEmscriptenEHSjLjPass(), PMW);
147 addFunctionPass(IndirectBrExpandPass(TM), PMW);
150 addFunctionPass(WebAssemblyReduceToAnyAllTruePass(
getTM()), PMW);
152 Base::addIRPasses(PMW);
155void WebAssemblyCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
158 addFunctionPass(WebAssemblyRefTypeMem2LocalPass(), PMW);
161 addModulePass(WebAssemblyCoalesceFeaturesAndStripAtomicsPass(
getTM()), PMW);
164 addFunctionPass(AtomicExpandPass(TM), PMW);
166 Base::addISelPrepare(PMW);
169Error WebAssemblyCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
170 addMachineFunctionPass(WebAssemblyISelDAGToDAGPass(
getTM(), getOptLevel()),
176 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
181 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
184 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
188 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
193Error WebAssemblyCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
194 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
198void WebAssemblyCodeGenPassBuilder::addPreLegalizeMachineIR(
199 PassManagerWrapper &PMW) {
200 if (getOptLevel() != CodeGenOptLevel::None)
201 addMachineFunctionPass(WebAssemblyPreLegalizerCombinerPass(), PMW);
204Error WebAssemblyCodeGenPassBuilder::addLegalizeMachineIR(
205 PassManagerWrapper &PMW) {
206 addMachineFunctionPass(LegalizerPass(), PMW);
210void WebAssemblyCodeGenPassBuilder::addPreRegBankSelect(
211 PassManagerWrapper &PMW) {
212 if (getOptLevel() != CodeGenOptLevel::None)
213 addMachineFunctionPass(WebAssemblyPostLegalizerCombinerPass(), PMW);
216Error WebAssemblyCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
217 addMachineFunctionPass(RegBankSelectPass(), PMW);
221Error WebAssemblyCodeGenPassBuilder::addGlobalInstructionSelect(
222 PassManagerWrapper &PMW) {
223 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
225 if (isGlobalISelAbortEnabled()) {
226 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
227 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
228 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
229 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
235Error WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteFast(
236 PassManagerWrapper &PMW) {
240Expected<bool> WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
241 PassManagerWrapper &PMW) {
245void WebAssemblyCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
246 Base::addPreEmitPass(PMW);
249 addMachineFunctionPass(WebAssemblyNullifyDebugValueListsPass(), PMW);
253 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
256 addMachineFunctionPass(WebAssemblyFixIrreducibleControlFlowPass(), PMW);
261 addMachineFunctionPass(WebAssemblyLateEHPreparePass(), PMW);
266 addMachineFunctionPass(WebAssemblyReplacePhysRegsPass(), PMW);
269 if (getOptLevel() != CodeGenOptLevel::None) {
271 addMachineFunctionPass(WebAssemblyOptimizeLiveIntervalsPass(), PMW);
274 addMachineFunctionPass(WebAssemblyMemIntrinsicResultsPass(), PMW);
282 addMachineFunctionPass(WebAssemblyRegStackifyPass(getOptLevel()), PMW);
284 if (getOptLevel() != CodeGenOptLevel::None) {
288 addMachineFunctionPass(WebAssemblyRegColoringPass(), PMW);
293 addMachineFunctionPass(WebAssemblyCFGSortPass(), PMW);
296 addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
300 addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
303 addMachineFunctionPass(WebAssemblyLowerBrUnlessPass(), PMW);
306 if (getOptLevel() != CodeGenOptLevel::None)
307 addMachineFunctionPass(WebAssemblyPeepholePass(), PMW);
310 addMachineFunctionPass(WebAssemblyRegNumberingPass(), PMW);
314 addMachineFunctionPass(WebAssemblyDebugFixupPass(), PMW);
318 addModulePass(WebAssemblyMCLowerPrePass(), PMW);
321void WebAssemblyCodeGenPassBuilder::addAsmPrinterBegin(
322 PassManagerWrapper &PMW) {
323 addModulePass(WebAssemblyAsmPrinterBeginPass(), PMW,
true);
326void WebAssemblyCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
327 addMachineFunctionPass(WebAssemblyAsmPrinterPass(), PMW);
330void WebAssemblyCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
331 addModulePass(WebAssemblyAsmPrinterEndPass(), PMW);
337#define GET_PASS_REGISTRY "WebAssemblyPassRegistry.def"
346 auto CGPB = WebAssemblyCodeGenPassBuilder(*
this, Opt,
PIC);
347 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.