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) {
206Error WebAssemblyCodeGenPassBuilder::addLegalizeMachineIR(
207 PassManagerWrapper &PMW) {
208 addMachineFunctionPass(LegalizerPass(), PMW);
212void WebAssemblyCodeGenPassBuilder::addPreRegBankSelect(
213 PassManagerWrapper &PMW) {
214 if (getOptLevel() != CodeGenOptLevel::None) {
220Error WebAssemblyCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
221 addMachineFunctionPass(RegBankSelectPass(), PMW);
225Error WebAssemblyCodeGenPassBuilder::addGlobalInstructionSelect(
226 PassManagerWrapper &PMW) {
227 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
229 if (isGlobalISelAbortEnabled()) {
230 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
231 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
232 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
233 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
239Error WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteFast(
240 PassManagerWrapper &PMW) {
244Expected<bool> WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
245 PassManagerWrapper &PMW) {
249void WebAssemblyCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
250 Base::addPreEmitPass(PMW);
253 addMachineFunctionPass(WebAssemblyNullifyDebugValueListsPass(), PMW);
257 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
260 addMachineFunctionPass(WebAssemblyFixIrreducibleControlFlowPass(), PMW);
265 addMachineFunctionPass(WebAssemblyLateEHPreparePass(), PMW);
270 addMachineFunctionPass(WebAssemblyReplacePhysRegsPass(), PMW);
273 if (getOptLevel() != CodeGenOptLevel::None) {
275 addMachineFunctionPass(WebAssemblyOptimizeLiveIntervalsPass(), PMW);
278 addMachineFunctionPass(WebAssemblyMemIntrinsicResultsPass(), PMW);
286 addMachineFunctionPass(WebAssemblyRegStackifyPass(getOptLevel()), PMW);
288 if (getOptLevel() != CodeGenOptLevel::None) {
292 addMachineFunctionPass(WebAssemblyRegColoringPass(), PMW);
297 addMachineFunctionPass(WebAssemblyCFGSortPass(), PMW);
300 addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
304 addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
307 addMachineFunctionPass(WebAssemblyLowerBrUnlessPass(), PMW);
310 if (getOptLevel() != CodeGenOptLevel::None)
311 addMachineFunctionPass(WebAssemblyPeepholePass(), PMW);
314 addMachineFunctionPass(WebAssemblyRegNumberingPass(), PMW);
318 addMachineFunctionPass(WebAssemblyDebugFixupPass(), PMW);
322 addModulePass(WebAssemblyMCLowerPrePass(), PMW);
325void WebAssemblyCodeGenPassBuilder::addAsmPrinterBegin(
326 PassManagerWrapper &PMW) {
327 addModulePass(WebAssemblyAsmPrinterBeginPass(), PMW,
true);
330void WebAssemblyCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
331 addMachineFunctionPass(WebAssemblyAsmPrinterPass(), PMW);
334void WebAssemblyCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
335 addModulePass(WebAssemblyAsmPrinterEndPass(), PMW);
341#define GET_PASS_REGISTRY "WebAssemblyPassRegistry.def"
350 auto CGPB = WebAssemblyCodeGenPassBuilder(*
this, Opt,
PIC);
351 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.