62 explicit WebAssemblyCodeGenPassBuilder(WebAssemblyTargetMachine &TM,
63 const CGPassBuilderOption &Opts,
64 PassInstrumentationCallbacks *
PIC)
65 : CodeGenPassBuilder(TM, Opts,
PIC) {
66 disablePass<MachineLateInstrsCleanupPass, MachineCopyPropagationPass,
67 PostRAMachineSinkingPass, PostRASchedulerPass,
68 FuncletLayoutPass, StackMapLivenessPass, PatchableFunctionPass,
69 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass,
70 MachineBlockPlacementPass>();
79 if (getOptLevel() == CodeGenOptLevel::Less)
80 disablePass<RegisterCoalescerPass>();
83 void addIRPasses(PassManagerWrapper &PMW)
override;
84 void addISelPrepare(PassManagerWrapper &PMW)
override;
86 Error addInstSelector(PassManagerWrapper &PMW)
override;
88 Error addIRTranslator(PassManagerWrapper &PMW)
override;
89 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
90 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
91 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
92 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
93 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
95 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
97 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
98 void addPreEmitPass(PassManagerWrapper &PMW)
override;
99 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
100 void addAsmPrinter(PassManagerWrapper &PMW)
override;
101 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
107 addModulePass(WebAssemblyAddMissingPrototypesPass(), PMW);
110 addModulePass(LowerGlobalDtorsPass(), PMW);
114 addModulePass(WebAssemblyFixFunctionBitcastsPass(), PMW);
117 if (getOptLevel() != CodeGenOptLevel::None)
118 addFunctionPass(WebAssemblyOptimizeReturnedPass(), PMW);
128 if (!EnableEmEH && !EnableWasmEH) {
129 addFunctionPass(LowerInvokePass(), PMW);
132 addFunctionPass(UnreachableBlockElimPass(), PMW);
141 addModulePass(WebAssemblyLowerEmscriptenEHSjLjPass(EnableEmEH), PMW);
145 addFunctionPass(IndirectBrExpandPass(TM), PMW);
148 addFunctionPass(WebAssemblyReduceToAnyAllTruePass(
getTM()), PMW);
150 Base::addIRPasses(PMW);
153void WebAssemblyCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
156 addFunctionPass(WebAssemblyRefTypeMem2LocalPass(), PMW);
159 addModulePass(WebAssemblyCoalesceFeaturesAndStripAtomicsPass(
getTM()), PMW);
162 addFunctionPass(AtomicExpandPass(TM), PMW);
164 Base::addISelPrepare(PMW);
167Error WebAssemblyCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
168 addMachineFunctionPass(WebAssemblyISelDAGToDAGPass(
getTM(), getOptLevel()),
174 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
179 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
182 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
186 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
191Error WebAssemblyCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
192 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
196void WebAssemblyCodeGenPassBuilder::addPreLegalizeMachineIR(
197 PassManagerWrapper &PMW) {
198 if (getOptLevel() != CodeGenOptLevel::None)
199 addMachineFunctionPass(WebAssemblyPreLegalizerCombinerPass(), PMW);
202Error WebAssemblyCodeGenPassBuilder::addLegalizeMachineIR(
203 PassManagerWrapper &PMW) {
204 addMachineFunctionPass(LegalizerPass(), PMW);
208void WebAssemblyCodeGenPassBuilder::addPreRegBankSelect(
209 PassManagerWrapper &PMW) {
210 if (getOptLevel() != CodeGenOptLevel::None)
211 addMachineFunctionPass(WebAssemblyPostLegalizerCombinerPass(), PMW);
214Error WebAssemblyCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
215 addMachineFunctionPass(RegBankSelectPass(), PMW);
219Error WebAssemblyCodeGenPassBuilder::addGlobalInstructionSelect(
220 PassManagerWrapper &PMW) {
221 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
223 if (isGlobalISelAbortEnabled()) {
224 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
225 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
226 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
227 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
233Error WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteFast(
234 PassManagerWrapper &PMW) {
238Expected<bool> WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
239 PassManagerWrapper &PMW) {
243void WebAssemblyCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
244 Base::addPreEmitPass(PMW);
247 addMachineFunctionPass(WebAssemblyNullifyDebugValueListsPass(), PMW);
251 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
254 addMachineFunctionPass(WebAssemblyFixIrreducibleControlFlowPass(), PMW);
259 addMachineFunctionPass(WebAssemblyLateEHPreparePass(), PMW);
264 addMachineFunctionPass(WebAssemblyReplacePhysRegsPass(), PMW);
267 if (getOptLevel() != CodeGenOptLevel::None) {
269 addMachineFunctionPass(WebAssemblyOptimizeLiveIntervalsPass(), PMW);
272 addMachineFunctionPass(WebAssemblyMemIntrinsicResultsPass(), PMW);
280 addMachineFunctionPass(WebAssemblyRegStackifyPass(getOptLevel()), PMW);
282 if (getOptLevel() != CodeGenOptLevel::None) {
286 addMachineFunctionPass(WebAssemblyRegColoringPass(), PMW);
291 addMachineFunctionPass(WebAssemblyCFGSortPass(), PMW);
294 addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
298 addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
301 addMachineFunctionPass(WebAssemblyLowerBrUnlessPass(), PMW);
304 if (getOptLevel() != CodeGenOptLevel::None)
305 addMachineFunctionPass(WebAssemblyPeepholePass(), PMW);
308 addMachineFunctionPass(WebAssemblyRegNumberingPass(), PMW);
312 addMachineFunctionPass(WebAssemblyDebugFixupPass(), PMW);
316 addModulePass(WebAssemblyMCLowerPrePass(), PMW);
319void WebAssemblyCodeGenPassBuilder::addAsmPrinterBegin(
320 PassManagerWrapper &PMW) {
321 addModulePass(WebAssemblyAsmPrinterBeginPass(), PMW,
true);
324void WebAssemblyCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
325 addMachineFunctionPass(WebAssemblyAsmPrinterPass(), PMW);
328void WebAssemblyCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
329 addModulePass(WebAssemblyAsmPrinterEndPass(), PMW);
335#define GET_PASS_REGISTRY "WebAssemblyPassRegistry.def"
344 auto CGPB = WebAssemblyCodeGenPassBuilder(*
this, Opt,
PIC);
345 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.