From: Heejin Ahn Date: Tue, 8 Jan 2019 01:25:12 +0000 (+0000) Subject: [WebAssembly] Move CFG-changing passes before RegStackify X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6a8d6b310bbf439d5d7aac2f49c48d417a09e1a3;p=llvm [WebAssembly] Move CFG-changing passes before RegStackify Summary: FixIrreducibleControlFlow and LateEHPrepare both possibly modify CFG and create new registers. There seems to be no reason these passes go after register-related optimization passes (PrepareForLiveIntervals, OptimizeLiveIntervals, StoreResults, RegStackify, and RegColoring), and this also possibly create new optimization opportunities. I think we should put all current and future optimization passes before RegStackify (and related passes) unless there's a reason not to. Reviewers: kripken Subscribers: dschuff, sbc100, sunfish, jgravelle-google, llvm-commits Differential Revision: https://reviews.llvm.org/D56356 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350596 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp index a6fb78280da..05bd5926ef9 100644 --- a/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -298,6 +298,12 @@ void WebAssemblyPassConfig::addPreEmitPass() { // order of the arguments. addPass(createWebAssemblyCallIndirectFixup()); + // Eliminate multiple-entry loops. + addPass(createWebAssemblyFixIrreducibleControlFlow()); + + // Do various transformations for exception handling. + addPass(createWebAssemblyLateEHPrepare()); + if (getOptLevel() != CodeGenOpt::None) { // LiveIntervals isn't commonly run this late. Re-establish preconditions. addPass(createWebAssemblyPrepareForLiveIntervals()); @@ -320,17 +326,9 @@ void WebAssemblyPassConfig::addPreEmitPass() { addPass(createWebAssemblyRegColoring()); } - // Eliminate multiple-entry loops. Do this before inserting explicit get_local - // and set_local operators because we create a new variable that we want - // converted into a local. - addPass(createWebAssemblyFixIrreducibleControlFlow()); - // Insert explicit get_local and set_local operators. addPass(createWebAssemblyExplicitLocals()); - // Do various transformations for exception handling - addPass(createWebAssemblyLateEHPrepare()); - // Sort the blocks of the CFG into topological order, a prerequisite for // BLOCK and LOOP markers. addPass(createWebAssemblyCFGSort());