]> granicus.if.org Git - llvm/commit
[WebAssembly] Fix a bug in 'try' placement
authorHeejin Ahn <aheejin@gmail.com>
Tue, 8 Oct 2019 16:15:39 +0000 (16:15 +0000)
committerHeejin Ahn <aheejin@gmail.com>
Tue, 8 Oct 2019 16:15:39 +0000 (16:15 +0000)
commit66296916e5427154ca2752940b06d7245ed72bf0
tree603613f9163bade6a1e5745ce7ff778d8066d5d8
parent68af26d127bc6a0b7e396d3bf7ecb2852ac5edc4
[WebAssembly] Fix a bug in 'try' placement

Summary:
When searching for local expression tree created by stackified
registers, for 'block' placement, we start the search from the previous
instruction of a BB's terminator. But in 'try''s case, we should start
from the previous instruction of a call that can throw, or a EH_LABEL
that precedes the call, because the return values of the call's previous
instructions can be stackified and consumed by the throwing call.

For example,
```
  i32.call @foo
  call @bar         ; may throw
  br $label0
```
In this case, if we start the search from the previous instruction of
the terminator (`br` here), we end up stopping at `call @bar` and place
a 'try' between `i32.call @foo` and `call @bar`, because `call @bar`
does not have a return value so it is not a local expression tree of
`br`.

But in this case, unlike when placing 'block's, we should start the
search from `call @bar`, because the return value of `i32.call @foo` is
stackified and used by `call @bar`.

Reviewers: dschuff

Subscribers: sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D68619

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374073 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
test/CodeGen/WebAssembly/cfg-stackify-eh.ll