diff options
author | Heejin Ahn <aheejin@gmail.com> | 2019-02-27 01:35:14 +0000 |
---|---|---|
committer | Heejin Ahn <aheejin@gmail.com> | 2019-02-27 01:35:14 +0000 |
commit | 82da1ffc16c18fa440ac98bb4ed28953c77f796f (patch) | |
tree | ef78d2569aa45d3b7cceb1141eaf588a9fbf6939 /llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp | |
parent | ded9f0efade11b4d3d95d0f93c92fde0e8ac3a4c (diff) | |
download | llvm-82da1ffc16c18fa440ac98bb4ed28953c77f796f.zip llvm-82da1ffc16c18fa440ac98bb4ed28953c77f796f.tar.gz llvm-82da1ffc16c18fa440ac98bb4ed28953c77f796f.tar.bz2 |
[WebAssembly] Fix ScopeTops info in CFGStackify for EH pads
Summary:
When creating `ScopeTops` info for `try` ~ `catch` ~ `end_try`, we
should create not only `end_try` -> `try` mapping but also `catch` ->
`try` mapping as well. If this is not created, `block` and `end_block`
markers later added may span across an existing `catch`, resulting in
the incorrect code like:
```
try
block --| (X)
catch |
end_block --|
end_try
```
Reviewers: dschuff
Subscribers: sunfish, sbc100, jgravelle-google, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58605
llvm-svn: 354945
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp index 9001787..35ca7b9 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp @@ -594,11 +594,22 @@ void WebAssemblyCFGStackify::placeTryMarker(MachineBasicBlock &MBB) { TII.get(WebAssembly::END_TRY)); registerTryScope(Begin, End, &MBB); - // Track the farthest-spanning scope that ends at this point. - int Number = Cont->getNumber(); - if (!ScopeTops[Number] || - ScopeTops[Number]->getNumber() > Header->getNumber()) - ScopeTops[Number] = Header; + // Track the farthest-spanning scope that ends at this point. We create two + // mappings: (BB with 'end_try' -> BB with 'try') and (BB with 'catch' -> BB + // with 'try'). We need to create 'catch' -> 'try' mapping here too because + // markers should not span across 'catch'. For example, this should not + // happen: + // + // try + // block --| (X) + // catch | + // end_block --| + // end_try + for (int Number : {Cont->getNumber(), MBB.getNumber()}) { + if (!ScopeTops[Number] || + ScopeTops[Number]->getNumber() > Header->getNumber()) + ScopeTops[Number] = Header; + } } void WebAssemblyCFGStackify::removeUnnecessaryInstrs(MachineFunction &MF) { |