[WebAssembly] Use SSAUpdaterBulk in LowerEmscriptenSjLj
We update SSA in two steps in Emscripten SjLj: 1. Rewrite uses of `setjmpTable` and `setjmpTableSize` variables and place `phi`s where necessary, which are updated where we call `saveSetjmp`. 2. Do a whole function level SSA update for all variables, because we split BBs where `setjmp` is called and there are possibly variable uses that are not dominated by a def. (See https://github.com/llvm/llvm-project/blob/955b91c19c00ed4c917559a5d66d14c669dde2e3/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp#L1314-L1324) We have been using `SSAUpdater` to do this, but `SSAUpdaterBulk` class was added after this pass was first created, and for the step 2 it looks like a better alternative with a possible performance benefit. Not sure the author is aware of it, but `SSAUpdaterBulk` seems to have a limitation: it cannot handle a use within the same BB as a def but before it. For example: ``` ... = %a + 1 %a = foo(); ``` or ``` %a = %a + 1 ``` The uses `%a` in RHS should be rewritten with another SSA variable of `%a`, most likely one generated from a `phi`. But `SSAUpdaterBulk` thinks all uses of `%a` are below the def of `%a` within the same BB. (`SSAUpdater` has two different functions of rewriting because of this: `RewriteUse` and `RewriteUseAfterInsertions`.) This doesn't affect our usage in the step 2 because that deals with possibly non-dominated uses by defs after block splitting. But it does in the step 1, which still uses `SSAUpdater`. But this CL also simplifies the step 1 by using `make_early_inc_range`, removing the need to advance the iterator before rewriting a use. This is NFC; the test changes are just the order of PHI nodes. Reviewed By: dschuff Differential Revision: https://reviews.llvm.org/D108583
Loading
Please sign in to comment