[PATCH] D68229: [WebAssembly] Make sure EH pads are preferred in sorting

Heejin Ahn via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 30 23:52:20 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL373302: [WebAssembly] Make sure EH pads are preferred in sorting (authored by aheejin, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D68229?vs=222447&id=222549#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D68229/new/

https://reviews.llvm.org/D68229

Files:
  llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp
  llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify-eh.ll


Index: llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
===================================================================
--- llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
+++ llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
@@ -621,6 +621,49 @@
   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()
Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp
===================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGSort.cpp
@@ -317,6 +317,7 @@
       // 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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68229.222549.patch
Type: text/x-patch
Size: 2667 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191001/baa315d0/attachment.bin>


More information about the llvm-commits mailing list