]> granicus.if.org Git - llvm/commit
[WebAssembly] Fix bugs in BLOCK/TRY placement
authorHeejin Ahn <aheejin@gmail.com>
Tue, 26 Mar 2019 17:15:55 +0000 (17:15 +0000)
committerHeejin Ahn <aheejin@gmail.com>
Tue, 26 Mar 2019 17:15:55 +0000 (17:15 +0000)
commit76db59c4bede2283470f7dd08a67efa27ec796e5
tree77e545d7736451d0769a0996cdb693ce3b763676
parent2cdd5b4ce00108bc0d610813cf594fbf928cf9f5
[WebAssembly] Fix bugs in BLOCK/TRY placement

Summary:
Before we placed all TRY/END_TRY markers before placing BLOCK/END_BLOCK
markers. This couldn't handle this case:
```
bb0:
  br bb2
bb1:          // nearest common dominator of bb3 and bb4
  br_if ... bb3
  br bb4
bb2:
  ...
bb3:
  call @foo   // unwinds to ehpad
bb4:
  call @bar   // unwinds to ehpad
ehpad:
  catch
  ...
```

When we placed TRY markers, we placed it in bb1 because it is the
nearest common dominator of bb3 and bb4. But because bb0 jumps to bb2,
when we placed block markers, we ended up with interleaved scopes like
```
block
try
end_block
catch
end_try
```
which was not correct.

This patch fixes the bug by placing BLOCK and TRY markers in one pass
while iterating BBs in a function. This also adds some more routines to
`placeTryMarkers`, because we now have to assume that there can be
previously placed BLOCK and END_BLOCK.

Reviewers: dschuff

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

Tags: #llvm

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

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