Index: lib/Target/WebAssembly/WebAssembly.h =================================================================== --- lib/Target/WebAssembly/WebAssembly.h +++ lib/Target/WebAssembly/WebAssembly.h @@ -27,7 +27,6 @@ // LLVM IR passes. ModulePass *createWebAssemblyLowerEmscriptenEHSjLj(bool DoEH, bool DoSjLj); -void initializeWebAssemblyLowerEmscriptenEHSjLjPass(PassRegistry &); ModulePass *createWebAssemblyLowerGlobalDtors(); ModulePass *createWebAssemblyFixFunctionBitcasts(); FunctionPass *createWebAssemblyOptimizeReturned(); @@ -54,6 +53,28 @@ FunctionPass *createWebAssemblyPeephole(); FunctionPass *createWebAssemblyCallIndirectFixup(); +// PassRegistry initialization declarations. +void initializeWebAssemblyLowerEmscriptenEHSjLjPass(PassRegistry &); +void initializeLowerGlobalDtorsPass(PassRegistry &); +void initializeFixFunctionBitcastsPass(PassRegistry &); +void initializeOptimizeReturnedPass(PassRegistry &); +void initializeWebAssemblyArgumentMovePass(PassRegistry &); +void initializeWebAssemblySetP2AlignOperandsPass(PassRegistry &); +void initializeWebAssemblyReplacePhysRegsPass(PassRegistry &); +void initializeWebAssemblyPrepareForLiveIntervalsPass(PassRegistry &); +void initializeWebAssemblyOptimizeLiveIntervalsPass(PassRegistry &); +void initializeWebAssemblyStoreResultsPass(PassRegistry &); +void initializeWebAssemblyRegStackifyPass(PassRegistry &); +void initializeWebAssemblyRegColoringPass(PassRegistry &); +void initializeWebAssemblyExplicitLocalsPass(PassRegistry &); +void initializeWebAssemblyFixIrreducibleControlFlowPass(PassRegistry &); +void initializeWebAssemblyCFGSortPass(PassRegistry &); +void initializeWebAssemblyCFGStackifyPass(PassRegistry &); +void initializeWebAssemblyLowerBrUnlessPass(PassRegistry &); +void initializeWebAssemblyRegNumberingPass(PassRegistry &); +void initializeWebAssemblyPeepholePass(PassRegistry &); +void initializeWebAssemblyCallIndirectFixupPass(PassRegistry &); + } // end namespace llvm #endif Index: lib/Target/WebAssembly/WebAssemblyArgumentMove.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyArgumentMove.cpp +++ lib/Target/WebAssembly/WebAssemblyArgumentMove.cpp @@ -60,6 +60,9 @@ } // end anonymous namespace char WebAssemblyArgumentMove::ID = 0; +INITIALIZE_PASS(WebAssemblyArgumentMove, DEBUG_TYPE, + "Move ARGUMENT instructions for WebAssembly", false, false) + FunctionPass *llvm::createWebAssemblyArgumentMove() { return new WebAssemblyArgumentMove(); } Index: lib/Target/WebAssembly/WebAssemblyCFGSort.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyCFGSort.cpp +++ lib/Target/WebAssembly/WebAssemblyCFGSort.cpp @@ -56,6 +56,9 @@ } // end anonymous namespace char WebAssemblyCFGSort::ID = 0; +INITIALIZE_PASS(WebAssemblyCFGSort, DEBUG_TYPE, + "Reorders blocks in topological order", false, false) + FunctionPass *llvm::createWebAssemblyCFGSort() { return new WebAssemblyCFGSort(); } Index: lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp +++ lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp @@ -57,6 +57,10 @@ } // end anonymous namespace char WebAssemblyCFGStackify::ID = 0; +INITIALIZE_PASS(WebAssemblyCFGStackify, DEBUG_TYPE, + "Insert BLOCK and LOOP markers for WebAssembly scopes", + false, false) + FunctionPass *llvm::createWebAssemblyCFGStackify() { return new WebAssemblyCFGStackify(); } Index: lib/Target/WebAssembly/WebAssemblyCallIndirectFixup.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyCallIndirectFixup.cpp +++ lib/Target/WebAssembly/WebAssemblyCallIndirectFixup.cpp @@ -54,6 +54,9 @@ } // end anonymous namespace char WebAssemblyCallIndirectFixup::ID = 0; +INITIALIZE_PASS(WebAssemblyCallIndirectFixup, DEBUG_TYPE, + "Rewrite call_indirect argument orderings", false, false) + FunctionPass *llvm::createWebAssemblyCallIndirectFixup() { return new WebAssemblyCallIndirectFixup(); } Index: lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp +++ lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp @@ -60,6 +60,9 @@ } // end anonymous namespace char WebAssemblyExplicitLocals::ID = 0; +INITIALIZE_PASS(WebAssemblyExplicitLocals, DEBUG_TYPE, + "Convert registers to WebAssembly locals", false, false) + FunctionPass *llvm::createWebAssemblyExplicitLocals() { return new WebAssemblyExplicitLocals(); } Index: lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp +++ lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp @@ -61,6 +61,9 @@ } // End anonymous namespace char FixFunctionBitcasts::ID = 0; +INITIALIZE_PASS(FixFunctionBitcasts, DEBUG_TYPE, + "Fix mismatching bitcasts for WebAssembly", false, false) + ModulePass *llvm::createWebAssemblyFixFunctionBitcasts() { return new FixFunctionBitcasts(); } Index: lib/Target/WebAssembly/WebAssemblyFixIrreducibleControlFlow.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyFixIrreducibleControlFlow.cpp +++ lib/Target/WebAssembly/WebAssemblyFixIrreducibleControlFlow.cpp @@ -71,6 +71,9 @@ } // end anonymous namespace char WebAssemblyFixIrreducibleControlFlow::ID = 0; +INITIALIZE_PASS(WebAssemblyFixIrreducibleControlFlow, DEBUG_TYPE, + "Removes irreducible control flow", false, false) + FunctionPass *llvm::createWebAssemblyFixIrreducibleControlFlow() { return new WebAssemblyFixIrreducibleControlFlow(); } Index: lib/Target/WebAssembly/WebAssemblyLowerBrUnless.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyLowerBrUnless.cpp +++ lib/Target/WebAssembly/WebAssemblyLowerBrUnless.cpp @@ -47,6 +47,9 @@ } // end anonymous namespace char WebAssemblyLowerBrUnless::ID = 0; +INITIALIZE_PASS(WebAssemblyLowerBrUnless, DEBUG_TYPE, + "Lowers br_unless into inverted br_if", false, false) + FunctionPass *llvm::createWebAssemblyLowerBrUnless() { return new WebAssemblyLowerBrUnless(); } Index: lib/Target/WebAssembly/WebAssemblyLowerGlobalDtors.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyLowerGlobalDtors.cpp +++ lib/Target/WebAssembly/WebAssemblyLowerGlobalDtors.cpp @@ -51,6 +51,9 @@ } // End anonymous namespace char LowerGlobalDtors::ID = 0; +INITIALIZE_PASS(LowerGlobalDtors, DEBUG_TYPE, + "Lower @llvm.global_dtors for WebAssembly", false, false) + ModulePass *llvm::createWebAssemblyLowerGlobalDtors() { return new LowerGlobalDtors(); } Index: lib/Target/WebAssembly/WebAssemblyOptimizeLiveIntervals.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyOptimizeLiveIntervals.cpp +++ lib/Target/WebAssembly/WebAssemblyOptimizeLiveIntervals.cpp @@ -58,6 +58,9 @@ } // end anonymous namespace char WebAssemblyOptimizeLiveIntervals::ID = 0; +INITIALIZE_PASS(WebAssemblyOptimizeLiveIntervals, DEBUG_TYPE, + "Optimize LiveIntervals for WebAssembly", false, false) + FunctionPass *llvm::createWebAssemblyOptimizeLiveIntervals() { return new WebAssemblyOptimizeLiveIntervals(); } Index: lib/Target/WebAssembly/WebAssemblyOptimizeReturned.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyOptimizeReturned.cpp +++ lib/Target/WebAssembly/WebAssemblyOptimizeReturned.cpp @@ -48,6 +48,10 @@ } // End anonymous namespace char OptimizeReturned::ID = 0; +INITIALIZE_PASS(OptimizeReturned, DEBUG_TYPE, + "Optimize calls with \"returned\" attributes for WebAssembly", + false, false) + FunctionPass *llvm::createWebAssemblyOptimizeReturned() { return new OptimizeReturned(); } Index: lib/Target/WebAssembly/WebAssemblyPeephole.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyPeephole.cpp +++ lib/Target/WebAssembly/WebAssemblyPeephole.cpp @@ -50,6 +50,9 @@ } // end anonymous namespace char WebAssemblyPeephole::ID = 0; +INITIALIZE_PASS(WebAssemblyPeephole, DEBUG_TYPE, + "WebAssembly peephole optimizations", false, false) + FunctionPass *llvm::createWebAssemblyPeephole() { return new WebAssemblyPeephole(); } Index: lib/Target/WebAssembly/WebAssemblyPrepareForLiveIntervals.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyPrepareForLiveIntervals.cpp +++ lib/Target/WebAssembly/WebAssemblyPrepareForLiveIntervals.cpp @@ -55,6 +55,9 @@ } // end anonymous namespace char WebAssemblyPrepareForLiveIntervals::ID = 0; +INITIALIZE_PASS(WebAssemblyPrepareForLiveIntervals, DEBUG_TYPE, + "Fix up code for LiveIntervals", false, false) + FunctionPass *llvm::createWebAssemblyPrepareForLiveIntervals() { return new WebAssemblyPrepareForLiveIntervals(); } Index: lib/Target/WebAssembly/WebAssemblyRegColoring.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyRegColoring.cpp +++ lib/Target/WebAssembly/WebAssemblyRegColoring.cpp @@ -55,6 +55,9 @@ } // end anonymous namespace char WebAssemblyRegColoring::ID = 0; +INITIALIZE_PASS(WebAssemblyRegColoring, DEBUG_TYPE, + "Minimize number of registers used", false, false) + FunctionPass *llvm::createWebAssemblyRegColoring() { return new WebAssemblyRegColoring(); } Index: lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp +++ lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp @@ -51,6 +51,10 @@ } // end anonymous namespace char WebAssemblyRegNumbering::ID = 0; +INITIALIZE_PASS(WebAssemblyRegNumbering, DEBUG_TYPE, + "Assigns WebAssembly register numbers for virtual registers", + false, false) + FunctionPass *llvm::createWebAssemblyRegNumbering() { return new WebAssemblyRegNumbering(); } Index: lib/Target/WebAssembly/WebAssemblyRegStackify.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyRegStackify.cpp +++ lib/Target/WebAssembly/WebAssemblyRegStackify.cpp @@ -67,6 +67,10 @@ } // end anonymous namespace char WebAssemblyRegStackify::ID = 0; +INITIALIZE_PASS(WebAssemblyRegStackify, DEBUG_TYPE, + "Reorder instructions to use the WebAssembly value stack", + false, false) + FunctionPass *llvm::createWebAssemblyRegStackify() { return new WebAssemblyRegStackify(); } Index: lib/Target/WebAssembly/WebAssemblyReplacePhysRegs.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyReplacePhysRegs.cpp +++ lib/Target/WebAssembly/WebAssemblyReplacePhysRegs.cpp @@ -53,6 +53,10 @@ } // end anonymous namespace char WebAssemblyReplacePhysRegs::ID = 0; +INITIALIZE_PASS(WebAssemblyReplacePhysRegs, DEBUG_TYPE, + "Replace physical registers with virtual registers", + false, false) + FunctionPass *llvm::createWebAssemblyReplacePhysRegs() { return new WebAssemblyReplacePhysRegs(); } Index: lib/Target/WebAssembly/WebAssemblySetP2AlignOperands.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblySetP2AlignOperands.cpp +++ lib/Target/WebAssembly/WebAssemblySetP2AlignOperands.cpp @@ -46,6 +46,10 @@ } // end anonymous namespace char WebAssemblySetP2AlignOperands::ID = 0; +INITIALIZE_PASS(WebAssemblySetP2AlignOperands, DEBUG_TYPE, + "Set the p2align operands for WebAssembly loads and stores", + false, false) + FunctionPass *llvm::createWebAssemblySetP2AlignOperands() { return new WebAssemblySetP2AlignOperands(); } Index: lib/Target/WebAssembly/WebAssemblyStoreResults.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyStoreResults.cpp +++ lib/Target/WebAssembly/WebAssemblyStoreResults.cpp @@ -68,6 +68,9 @@ } // end anonymous namespace char WebAssemblyStoreResults::ID = 0; +INITIALIZE_PASS(WebAssemblyStoreResults, DEBUG_TYPE, + "Optimize store result values for WebAssembly", false, false) + FunctionPass *llvm::createWebAssemblyStoreResults() { return new WebAssemblyStoreResults(); } Index: lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -49,9 +49,28 @@ RegisterTargetMachine Y( getTheWebAssemblyTarget64()); - // Register exception handling pass to opt - initializeWebAssemblyLowerEmscriptenEHSjLjPass( - *PassRegistry::getPassRegistry()); + // Register backend passes + auto &PR = *PassRegistry::getPassRegistry(); + initializeWebAssemblyLowerEmscriptenEHSjLjPass(PR); + initializeLowerGlobalDtorsPass(PR); + initializeFixFunctionBitcastsPass(PR); + initializeOptimizeReturnedPass(PR); + initializeWebAssemblyArgumentMovePass(PR); + initializeWebAssemblySetP2AlignOperandsPass(PR); + initializeWebAssemblyReplacePhysRegsPass(PR); + initializeWebAssemblyPrepareForLiveIntervalsPass(PR); + initializeWebAssemblyOptimizeLiveIntervalsPass(PR); + initializeWebAssemblyStoreResultsPass(PR); + initializeWebAssemblyRegStackifyPass(PR); + initializeWebAssemblyRegColoringPass(PR); + initializeWebAssemblyExplicitLocalsPass(PR); + initializeWebAssemblyFixIrreducibleControlFlowPass(PR); + initializeWebAssemblyCFGSortPass(PR); + initializeWebAssemblyCFGStackifyPass(PR); + initializeWebAssemblyLowerBrUnlessPass(PR); + initializeWebAssemblyRegNumberingPass(PR); + initializeWebAssemblyPeepholePass(PR); + initializeWebAssemblyCallIndirectFixupPass(PR); } //===----------------------------------------------------------------------===//