[WebAssembly] Don't analyze branches after CFGStackify
authorHeejin Ahn <aheejin@gmail.com>
Tue, 26 Mar 2019 18:21:20 +0000 (18:21 +0000)
committerHeejin Ahn <aheejin@gmail.com>
Tue, 26 Mar 2019 18:21:20 +0000 (18:21 +0000)
commit54551c1df73be83e7d30aa1843aae476cb63a065
tree1aeab598d70d50cf284158ff9ce2923837aceab4
parent5740a3ed01e9ff2babe43516578a1295e254be45
[WebAssembly] Don't analyze branches after CFGStackify

Summary:
`WebAssembly::analyzeBranch` now does not analyze anything if the
function is CFG stackified. We were previously doing similar things by
checking if a branch's operand is whether an integer or an MBB, but this
failed to bail out when a BB did not have any terminators.

Consider this case:
```
bb0:
  try $label0
  call @foo    // unwinds to %ehpad
bb1:
  ...
  br $label0   // jumps to %cont. can be deleted
ehpad:
  catch
  ...
cont:
  end_try
```
Here `br $label0` will be deleted in CFGStackify's
`removeUnnecessaryInstrs` function, because we jump to the %cont block
even without the branch. But in this case, MachineVerifier fails to
verify this, because `ehpad` is not a successor of `bb1` even if `bb1`
does not have any terminators. MachineVerifier incorrectly thinks `bb1`
falls through to the next block.

This pass now consistently rejects all analysis after CFGStackify
whether a BB has terminators or not, also making the MachineVerifier
work. (MachineVerifier does not try to verify relationships between BBs
if `analyzeBranch` fails, the behavior we want after CFGStackify.)

This also adds a new option `-wasm-disable-ehpad-sort` for testing. This
option helps create the sorted order we want to test, and without the
fix in this patch, the tests in cfg-stackify-eh.ll fail at
MachineVerifier with `-wasm-disable-ehpad-sort`.

Reviewers: dschuff

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

Tags: #llvm

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

llvm-svn: 357015
llvm/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp
llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp
llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll