[PATCH] D58605: [WebAssembly] Fix ScopeTops info in CFGStackify for EH pads

Heejin Ahn via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 26 17:35:22 PST 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL354945: [WebAssembly] Fix ScopeTops info in CFGStackify for EH pads (authored by aheejin, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D58605?vs=188129&id=188486#toc

Repository:
  rL LLVM

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

https://reviews.llvm.org/D58605

Files:
  llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.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
@@ -88,7 +88,44 @@
 ; }
 
 ; CHECK-LABEL: test1
-; TODO Fill in CHECK lines once we fix ScopeTops info bug in D58605
+; CHECK: try
+; CHECK:   call      foo
+; CHECK: catch
+; CHECK:   block
+; CHECK:     block
+; CHECK:       br_if     0, {{.*}}                     # 0: down to label7
+; CHECK:       i32.call  $drop=, __cxa_begin_catch
+; CHECK:       try
+; CHECK:         call      foo
+; CHECK:         br        2                           # 2: down to label6
+; CHECK:       catch
+; CHECK:         try
+; CHECK:           block
+; CHECK:             br_if     0, {{.*}}               # 0: down to label11
+; CHECK:             i32.call  $drop=, __cxa_begin_catch
+; CHECK:             try
+; CHECK:               call      foo
+; CHECK:               br        2                     # 2: down to label10
+; CHECK:             catch
+; CHECK:               call      __cxa_end_catch
+; CHECK:               rethrow                         # down to catch3
+; CHECK:             end_try
+; CHECK:           end_block                           # label11:
+; CHECK:           call      __cxa_rethrow
+; CHECK:           unreachable
+; CHECK:         catch     {{.*}}                      # catch3:
+; CHECK:           call      __cxa_end_catch
+; CHECK:           rethrow                             # to caller
+; CHECK:         end_try                               # label10:
+; CHECK:         call      __cxa_end_catch
+; CHECK:         br        2                           # 2: down to label6
+; CHECK:       end_try
+; CHECK:     end_block                                 # label7:
+; CHECK:     call      __cxa_rethrow
+; CHECK:     unreachable
+; CHECK:   end_block                                   # label6:
+; CHECK:   call      __cxa_end_catch
+; CHECK: end_try
 define void @test1() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
 entry:
   invoke void @foo()
Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
===================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
@@ -594,11 +594,22 @@
               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) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58605.188486.patch
Type: text/x-patch
Size: 3457 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190227/c85b905d/attachment.bin>


More information about the llvm-commits mailing list