summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2019-10-01 06:53:28 +0000
committerHeejin Ahn <aheejin@gmail.com>2019-10-01 06:53:28 +0000
commite2bcab61009ab0ef0836385052d1a6027070c2b3 (patch)
tree8bf2bc7376a3505b63bf889f217f992ea167a2b0
parent61d5c76a181360ca8f039b2f6c914a18540684b5 (diff)
downloadbcm5719-llvm-e2bcab61009ab0ef0836385052d1a6027070c2b3.tar.gz
bcm5719-llvm-e2bcab61009ab0ef0836385052d1a6027070c2b3.zip
[WebAssembly] Make sure EH pads are preferred in sorting
Summary: In CFGSort, we try to make EH pads have higher priorities as soon as they are ready to be sorted, to prevent creation of unwind destination mismatches in CFGStackify. We did that by making priority queues' comparison function prefer EH pads, but it was possible for an EH pad to be popped from `Preferred` queue and then not sorted immediately and enter `Ready` queue instead in a certain condition. This patch makes sure that special condition does not consider EH pads as its candidates. Reviewers: dschuff Subscribers: sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68229 llvm-svn: 373302
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp1
-rw-r--r--llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll43
2 files changed, 44 insertions, 0 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp
index 9f94866c089..c069af9eed6 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp
@@ -317,6 +317,7 @@ static void sortBlocks(MachineFunction &MF, const MachineLoopInfo &MLI,
// If Next was originally ordered before MBB, and it isn't because it was
// loop-rotated above the header, it's not preferred.
if (Next->getNumber() < MBB->getNumber() &&
+ (WasmDisableEHPadSort || !Next->isEHPad()) &&
(!R || !R->contains(Next) ||
R->getHeader()->getNumber() < Next->getNumber())) {
Ready.push(Next);
diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
index 104e324faae..191c3d78552 100644
--- a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
+++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
@@ -621,6 +621,49 @@ try.cont: ; preds = %catch.start1, %catc
ret void
}
+; In CFGSort, EH pads should be sorted as soon as it is available and
+; 'Preferred' queue and should NOT be entered into 'Ready' queue unless we are
+; in the middle of sorting another region that does not contain the EH pad. In
+; this example, 'catch.start' should be sorted right after 'if.then' is sorted
+; (before 'cont' is sorted) and there should not be any unwind destination
+; mismatches in CFGStackify.
+
+; NOOPT: block
+; NOOPT: try
+; NOOPT: call foo
+; NOOPT: catch
+; NOOPT: end_try
+; NOOPT: call foo
+; NOOPT: end_block
+; NOOPT: return
+define void @test9(i32 %arg) personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
+entry:
+ %tobool = icmp ne i32 %arg, 0
+ br i1 %tobool, label %if.then, label %if.end
+
+catch.dispatch: ; preds = %if.then
+ %0 = catchswitch within none [label %catch.start] unwind to caller
+
+catch.start: ; preds = %catch.dispatch
+ %1 = catchpad within %0 [i8* null]
+ %2 = call i8* @llvm.wasm.get.exception(token %1)
+ %3 = call i32 @llvm.wasm.get.ehselector(token %1)
+ %4 = call i8* @__cxa_begin_catch(i8* %2) [ "funclet"(token %1) ]
+ call void @__cxa_end_catch() [ "funclet"(token %1) ]
+ catchret from %1 to label %if.end
+
+if.then: ; preds = %entry
+ invoke void @foo()
+ to label %cont unwind label %catch.dispatch
+
+cont: ; preds = %if.then
+ call void @foo()
+ br label %if.end
+
+if.end: ; preds = %cont, %catch.start, %entry
+ ret void
+}
+
declare void @foo()
declare void @bar()
declare i32 @baz()
OpenPOWER on IntegriCloud