57 explicit WebAssemblyCodeGenPassBuilder(WebAssemblyTargetMachine &TM,
58 const CGPassBuilderOption &Opts,
59 PassInstrumentationCallbacks *
PIC)
60 : CodeGenPassBuilder(TM, Opts,
PIC) {
61 disablePass<MachineLateInstrsCleanupPass, MachineCopyPropagationPass,
62 PostRAMachineSinkingPass, PostRASchedulerPass,
63 FuncletLayoutPass, StackMapLivenessPass, PatchableFunctionPass,
64 ShrinkWrapPass, RemoveLoadsIntoFakeUsesPass,
65 MachineBlockPlacementPass>();
74 if (getOptLevel() == CodeGenOptLevel::Less)
75 disablePass<RegisterCoalescerPass>();
78 void addIRPasses(PassManagerWrapper &PMW)
override;
79 void addISelPrepare(PassManagerWrapper &PMW)
override;
81 Error addInstSelector(PassManagerWrapper &PMW)
override;
83 Error addIRTranslator(PassManagerWrapper &PMW)
override;
84 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
85 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
86 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
87 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
88 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
90 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
92 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
93 void addPreEmitPass(PassManagerWrapper &PMW)
override;
94 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
95 void addAsmPrinter(PassManagerWrapper &PMW)
override;
96 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
102 addModulePass(WebAssemblyAddMissingPrototypesPass(), PMW);
105 addModulePass(LowerGlobalDtorsPass(), PMW);
109 addModulePass(WebAssemblyFixFunctionBitcastsPass(), PMW);
112 if (getOptLevel() != CodeGenOptLevel::None)
113 addFunctionPass(WebAssemblyOptimizeReturnedPass(), PMW);
118 addModulePass(WebAssemblyLowerEmscriptenEHSjLjPass(), PMW);
121 addFunctionPass(IndirectBrExpandPass(TM), PMW);
124 addFunctionPass(WebAssemblyReduceToAnyAllTruePass(
getTM()), PMW);
126 Base::addIRPasses(PMW);
129void WebAssemblyCodeGenPassBuilder::addISelPrepare(PassManagerWrapper &PMW) {
132 addFunctionPass(WebAssemblyRefTypeMem2LocalPass(), PMW);
135 addModulePass(WebAssemblyCoalesceFeaturesAndStripAtomicsPass(
getTM()), PMW);
138 addFunctionPass(AtomicExpandPass(TM), PMW);
140 Base::addISelPrepare(PMW);
143Error WebAssemblyCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
144 addMachineFunctionPass(WebAssemblyISelDAGToDAGPass(
getTM(), getOptLevel()),
150 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
155 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
158 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
162 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
167Error WebAssemblyCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
168 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
172void WebAssemblyCodeGenPassBuilder::addPreLegalizeMachineIR(
173 PassManagerWrapper &PMW) {
174 if (getOptLevel() != CodeGenOptLevel::None)
175 addMachineFunctionPass(WebAssemblyPreLegalizerCombinerPass(), PMW);
178Error WebAssemblyCodeGenPassBuilder::addLegalizeMachineIR(
179 PassManagerWrapper &PMW) {
180 addMachineFunctionPass(LegalizerPass(), PMW);
184void WebAssemblyCodeGenPassBuilder::addPreRegBankSelect(
185 PassManagerWrapper &PMW) {
186 if (getOptLevel() != CodeGenOptLevel::None)
187 addMachineFunctionPass(WebAssemblyPostLegalizerCombinerPass(), PMW);
190Error WebAssemblyCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
191 addMachineFunctionPass(RegBankSelectPass(), PMW);
195Error WebAssemblyCodeGenPassBuilder::addGlobalInstructionSelect(
196 PassManagerWrapper &PMW) {
197 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
199 if (isGlobalISelAbortEnabled()) {
200 addMachineFunctionPass(WebAssemblyArgumentMovePass(), PMW);
201 addMachineFunctionPass(WebAssemblySetP2AlignOperandsPass(), PMW);
202 addMachineFunctionPass(WebAssemblyFixBrTableDefaultsPass(), PMW);
203 addMachineFunctionPass(WebAssemblyCleanCodeAfterTrapPass(), PMW);
209Error WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteFast(
210 PassManagerWrapper &PMW) {
214Expected<bool> WebAssemblyCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
215 PassManagerWrapper &PMW) {
219void WebAssemblyCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
220 Base::addPreEmitPass(PMW);
223 addMachineFunctionPass(WebAssemblyNullifyDebugValueListsPass(), PMW);
227 addMachineFunctionPass(UnreachableMachineBlockElimPass(), PMW);
230 addMachineFunctionPass(WebAssemblyFixIrreducibleControlFlowPass(), PMW);
234 addMachineFunctionPass(WebAssemblyLateEHPreparePass(), PMW);
239 addMachineFunctionPass(WebAssemblyReplacePhysRegsPass(), PMW);
242 if (getOptLevel() != CodeGenOptLevel::None) {
244 addMachineFunctionPass(WebAssemblyOptimizeLiveIntervalsPass(), PMW);
247 addMachineFunctionPass(WebAssemblyMemIntrinsicResultsPass(), PMW);
255 addMachineFunctionPass(WebAssemblyRegStackifyPass(getOptLevel()), PMW);
257 if (getOptLevel() != CodeGenOptLevel::None) {
261 addMachineFunctionPass(WebAssemblyRegColoringPass(), PMW);
266 addMachineFunctionPass(WebAssemblyCFGSortPass(), PMW);
269 addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
273 addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
276 addMachineFunctionPass(WebAssemblyLowerBrUnlessPass(), PMW);
279 if (getOptLevel() != CodeGenOptLevel::None)
280 addMachineFunctionPass(WebAssemblyPeepholePass(), PMW);
283 addMachineFunctionPass(WebAssemblyRegNumberingPass(), PMW);
287 addMachineFunctionPass(WebAssemblyDebugFixupPass(), PMW);
291 addModulePass(WebAssemblyMCLowerPrePass(), PMW);
294void WebAssemblyCodeGenPassBuilder::addAsmPrinterBegin(
295 PassManagerWrapper &PMW) {
296 addModulePass(WebAssemblyAsmPrinterBeginPass(), PMW,
true);
299void WebAssemblyCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
300 addMachineFunctionPass(WebAssemblyAsmPrinterPass(), PMW);
303void WebAssemblyCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
304 addModulePass(WebAssemblyAsmPrinterEndPass(), PMW);
310#define GET_PASS_REGISTRY "WebAssemblyPassRegistry.def"
319 auto CGPB = WebAssemblyCodeGenPassBuilder(*
this, Opt,
PIC);
320 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
Interfaces for producing common pass manager configurations.
This file declares the IRTranslator pass.
ModuleAnalysisManager MAM
PassBuilder PB(Mod->getContext(), Machine, PassOpts->PTO, std::nullopt, &PIC)
PassInstrumentationCallbacks 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 > 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 ...
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 > WasmDisableExplicitLocals
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.