diff options
author | Heejin Ahn <aheejin@gmail.com> | 2021-08-16 23:30:02 -0700 |
---|---|---|
committer | Heejin Ahn <aheejin@gmail.com> | 2021-08-24 18:23:51 -0700 |
commit | d5244fb16070068fc1dfae5804ab8ff86d25deb9 (patch) | |
tree | abfa7cfe22371a5d42060a2ceeb9e8861c413d2d /llvm/lib/CodeGen/MachineCopyPropagation.cpp | |
parent | a7bf93807b403fdd1af1c7270a20c4849a739be4 (diff) | |
download | llvm-d5244fb16070068fc1dfae5804ab8ff86d25deb9.zip llvm-d5244fb16070068fc1dfae5804ab8ff86d25deb9.tar.gz llvm-d5244fb16070068fc1dfae5804ab8ff86d25deb9.tar.bz2 |
[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
Diffstat (limited to 'llvm/lib/CodeGen/MachineCopyPropagation.cpp')
0 files changed, 0 insertions, 0 deletions