[WebAssembly] Remove unnecessary instructions after TRY marker placement

Summary:
This removes unnecessary instructions after TRY marker placement. There
are two cases:
- `end`/`end_block` can be removed if they overlap with `try`/`end_try`
  and they have the same return types.
- `br` right before `catch` that branches to after `end_try` can be
  deleted.

Reviewers: dschuff

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

Tags: #llvm

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

llvm-svn: 354939
diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
index 663fff3..8e99334 100644
--- a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
+++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll
@@ -18,26 +18,23 @@
 ; }
 
 ; CHECK-LABEL: test0
-; CHECK: block
-; CHECK:   try
-; CHECK:     call      foo
-; CHECK:     br        0                               # 0: down to label1
-; CHECK:   catch
-; CHECK:     block
-; CHECK:       br_if     0, {{.*}}                     # 0: down to label3
-; CHECK:       i32.call  $drop=, __cxa_begin_catch
-; CHECK:       call      __cxa_end_catch
-; CHECK:       br        1                             # 1: down to label1
-; CHECK:     end_block                                 # label3:
-; CHECK:     block
-; CHECK:       br_if     0, {{.*}}                     # 0: down to label4
-; CHECK:       i32.call  $drop=, __cxa_begin_catch
-; CHECK:       call      __cxa_end_catch
-; CHECK:       br        1                             # 1: down to label1
-; CHECK:     end_block                                 # label4:
-; CHECK:     call      __cxa_rethrow
-; CHECK:   end_try                                     # label1:
-; CHECK: end_block
+; CHECK: try
+; CHECK:   call      foo
+; CHECK: catch
+; CHECK:   block
+; CHECK:     br_if     0, {{.*}}                       # 0: down to label2
+; CHECK:     i32.call  $drop=, __cxa_begin_catch
+; CHECK:     call      __cxa_end_catch
+; CHECK:     br        1                               # 1: down to label0
+; CHECK:   end_block                                   # label2:
+; CHECK:   block
+; CHECK:     br_if     0, {{.*}}                       # 0: down to label3
+; CHECK:     i32.call  $drop=, __cxa_begin_catch
+; CHECK:     call      __cxa_end_catch
+; CHECK:     br        1                               # 1: down to label0
+; CHECK:   end_block                                   # label3:
+; CHECK:   call      __cxa_rethrow
+; CHECK: end_try                                       # label0:
 define void @test0() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
 entry:
   invoke void @foo()
@@ -177,39 +174,33 @@
 ; }
 
 ; CHECK-LABEL: test2
-; CHECK: block
-; CHECK:   try
-; CHECK:     call      foo
-; CHECK:     br        0                               # 0: down to label17
-; CHECK:   catch
-; CHECK:     i32.call  $drop=, __cxa_begin_catch
-; CHECK:     loop                                      # label19:
+; CHECK: try
+; CHECK:   call      foo
+; CHECK: catch
+; CHECK:   i32.call  $drop=, __cxa_begin_catch
+; CHECK:   loop                                        # label15:
+; CHECK:     block
 ; CHECK:       block
-; CHECK:         block
-; CHECK:           br_if     0, {{.*}}                 # 0: down to label21
+; CHECK:         br_if     0, {{.*}}                   # 0: down to label17
+; CHECK:         try
+; CHECK:           call      foo
+; CHECK:           br        2                         # 2: down to label16
+; CHECK:         catch
 ; CHECK:           try
-; CHECK:             call      foo
-; CHECK:             br        2                       # 2: down to label20
+; CHECK:             call      __cxa_end_catch
 ; CHECK:           catch
-; CHECK:             block
-; CHECK:               try
-; CHECK:                 call      __cxa_end_catch
-; CHECK:                 br        0                   # 0: down to label24
-; CHECK:               catch
-; CHECK:                 call      __clang_call_terminate
-; CHECK:                 unreachable
-; CHECK:               end_try                         # label24:
-; CHECK:             end_block
-; CHECK:             rethrow                           # to caller
+; CHECK:             call      __clang_call_terminate
+; CHECK:             unreachable
 ; CHECK:           end_try
-; CHECK:         end_block                             # label21:
-; CHECK:         call      __cxa_end_catch
-; CHECK:         br        2                           # 2: down to label17
-; CHECK:       end_block                               # label20:
-; CHECK:       br        0                             # 0: up to label19
-; CHECK:     end_loop
-; CHECK:   end_try                                     # label17:
-; CHECK: end_block
+; CHECK:           rethrow                             # to caller
+; CHECK:         end_try
+; CHECK:       end_block                               # label17:
+; CHECK:       call      __cxa_end_catch
+; CHECK:       br        2                             # 2: down to label13
+; CHECK:     end_block                                 # label16:
+; CHECK:     br        0                               # 0: up to label15
+; CHECK:   end_loop
+; CHECK: end_try                                       # label13:
 define void @test2() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
 entry:
   invoke void @foo()
diff --git a/llvm/test/CodeGen/WebAssembly/exception.ll b/llvm/test/CodeGen/WebAssembly/exception.ll
index 13f9c18..f41588fa 100644
--- a/llvm/test/CodeGen/WebAssembly/exception.ll
+++ b/llvm/test/CodeGen/WebAssembly/exception.ll
@@ -37,29 +37,26 @@
 
 ; CHECK-LABEL: test_catch:
 ; CHECK:     global.get  ${{.+}}=, __stack_pointer
-; CHECK:     block
-; CHECK:       try
-; CHECK:         call      foo
-; CHECK:         br        0
-; CHECK:       catch     $[[EXCEPT_REF:[0-9]+]]=
-; CHECK:         global.set  __stack_pointer
-; CHECK:         block i32
-; CHECK:           br_on_exn 0, __cpp_exception, $[[EXCEPT_REF]]
-; CHECK:           rethrow
-; CHECK:         end_block
-; CHECK:         extract_exception $[[EXN:[0-9]+]]=
-; CHECK-DAG:     i32.store  __wasm_lpad_context
-; CHECK-DAG:     i32.store  __wasm_lpad_context+4
-; CHECK:         i32.call  $drop=, _Unwind_CallPersonality, $[[EXN]]
-; CHECK:         block
-; CHECK:           br_if     0
-; CHECK:           i32.call  $drop=, __cxa_begin_catch
-; CHECK:           call      __cxa_end_catch
-; CHECK:           br        1
-; CHECK:         end_block
-; CHECK:         call      __cxa_rethrow
-; CHECK:       end_try
-; CHECK:     end_block
+; CHECK:     try
+; CHECK:       call      foo
+; CHECK:     catch     $[[EXCEPT_REF:[0-9]+]]=
+; CHECK:       global.set  __stack_pointer
+; CHECK:       block i32
+; CHECK:         br_on_exn 0, __cpp_exception, $[[EXCEPT_REF]]
+; CHECK:         rethrow
+; CHECK:       end_block
+; CHECK:       extract_exception $[[EXN:[0-9]+]]=
+; CHECK-DAG:   i32.store  __wasm_lpad_context
+; CHECK-DAG:   i32.store  __wasm_lpad_context+4
+; CHECK:       i32.call  $drop=, _Unwind_CallPersonality, $[[EXN]]
+; CHECK:       block
+; CHECK:         br_if     0
+; CHECK:         i32.call  $drop=, __cxa_begin_catch
+; CHECK:         call      __cxa_end_catch
+; CHECK:         br        1
+; CHECK:       end_block
+; CHECK:       call      __cxa_rethrow
+; CHECK:     end_try
 define void @test_catch() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
 entry:
   invoke void @foo()
@@ -101,16 +98,13 @@
 ; }
 
 ; CHECK-LABEL: test_cleanup:
-; CHECK: block
-; CHECK:   try
-; CHECK:     call      foo
-; CHECK:     br        0
-; CHECK:   catch
-; CHECK:     global.set  __stack_pointer
-; CHECK:     i32.call  $drop=, _ZN4TempD2Ev
-; CHECK:     rethrow
-; CHECK:   end_try
-; CHECK: end_block
+; CHECK: try
+; CHECK:   call      foo
+; CHECK: catch
+; CHECK:   global.set  __stack_pointer
+; CHECK:   i32.call  $drop=, _ZN4TempD2Ev
+; CHECK:   rethrow
+; CHECK: end_try
 define void @test_cleanup() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
 entry:
   %t = alloca %struct.Temp, align 1
@@ -140,37 +134,28 @@
 ; }
 
 ; CHECK-LABEL: test_terminatepad
-; CHECK: block
+; CHECK: try
+; CHECK:   call      foo
+; CHECK: catch
+; CHECK:   i32.call  $drop=, __cxa_begin_catch
 ; CHECK:   try
 ; CHECK:     call      foo
-; CHECK:     br        0
 ; CHECK:   catch
-; CHECK:     i32.call  $drop=, __cxa_begin_catch
-; CHECK:     block
-; CHECK:       try
-; CHECK:         call      foo
-; CHECK:         br        0
-; CHECK:       catch
-; CHECK:         block
-; CHECK:           try
-; CHECK:             call      __cxa_end_catch
-; CHECK:             br        0
-; CHECK:           catch
-; CHECK:             block     i32
-; CHECK:               br_on_exn   0, __cpp_exception
-; CHECK:               call      __clang_call_terminate, 0
-; CHECK:               unreachable
-; CHECK:             end_block
-; CHECK:             call      __clang_call_terminate
-; CHECK:             unreachable
-; CHECK:           end_try
-; CHECK:         end_block
-; CHECK:         rethrow
-; CHECK:       end_try
-; CHECK:     end_block
-; CHECK:     call      __cxa_end_catch
+; CHECK:     try
+; CHECK:       call      __cxa_end_catch
+; CHECK:     catch
+; CHECK:       block     i32
+; CHECK:         br_on_exn   0, __cpp_exception
+; CHECK:         call      __clang_call_terminate, 0
+; CHECK:         unreachable
+; CHECK:       end_block
+; CHECK:       call      __clang_call_terminate
+; CHECK:       unreachable
+; CHECK:     end_try
+; CHECK:     rethrow
 ; CHECK:   end_try
-; CHECK: end_block
+; CHECK:   call      __cxa_end_catch
+; CHECK: end_try
 define void @test_terminatepad() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
 entry:
   invoke void @foo()
@@ -227,34 +212,30 @@
 ; }
 
 ; CHECK-LABEL: test_no_prolog_epilog_in_ehpad
-; CHECK:     block
-; CHECK:       try
-; CHECK:         call      foo
-; CHECK:         br        0
-; CHECK:       catch
-; CHECK-NOT:     global.get  $push{{.+}}=, __stack_pointer
-; CHECK:         global.set  __stack_pointer
+; CHECK:     try
+; CHECK:       call      foo
+; CHECK:     catch
+; CHECK-NOT:   global.get  $push{{.+}}=, __stack_pointer
+; CHECK:       global.set  __stack_pointer
+; CHECK:       block
 ; CHECK:         block
-; CHECK:           block
-; CHECK:             br_if     0
-; CHECK:             i32.call  $drop=, __cxa_begin_catch
-; CHECK:             try
-; CHECK:               call      foo
-; CHECK:               br        2
-; CHECK:             catch
-; CHECK-NOT:           global.get  $push{{.+}}=, __stack_pointer
-; CHECK:               global.set  __stack_pointer
-; CHECK:               call      __cxa_end_catch
-; CHECK:               rethrow
-; CHECK-NOT:           global.set  __stack_pointer, $pop{{.+}}
-; CHECK:             end_try
-; CHECK:           end_block
-; CHECK:           call      __cxa_rethrow
+; CHECK:           br_if     0
+; CHECK:           i32.call  $drop=, __cxa_begin_catch
+; CHECK:           try
+; CHECK:             call      foo
+; CHECK:           catch
+; CHECK-NOT:         global.get  $push{{.+}}=, __stack_pointer
+; CHECK:             global.set  __stack_pointer
+; CHECK:             call      __cxa_end_catch
+; CHECK:             rethrow
+; CHECK-NOT:         global.set  __stack_pointer, $pop{{.+}}
+; CHECK:           end_try
 ; CHECK:         end_block
-; CHECK-NOT:     global.set  __stack_pointer, $pop{{.+}}
-; CHECK:         call      __cxa_end_catch
-; CHECK:       end_try
-; CHECK:     end_block
+; CHECK:         call      __cxa_rethrow
+; CHECK:       end_block
+; CHECK-NOT:   global.set  __stack_pointer, $pop{{.+}}
+; CHECK:       call      __cxa_end_catch
+; CHECK:     end_try
 define void @test_no_prolog_epilog_in_ehpad() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
 entry:
   %stack_var = alloca i32, align 4
@@ -309,15 +290,12 @@
 ; }
 
 ; CHECK-LABEL: test_no_sp_writeback
-; CHECK:     block
-; CHECK:       try
-; CHECK:         call      foo
-; CHECK:         br        0
-; CHECK:       catch
-; CHECK:         i32.call  $drop=, __cxa_begin_catch
-; CHECK:         call      __cxa_end_catch
-; CHECK:       end_try
-; CHECK:     end_block
+; CHECK:     try
+; CHECK:       call      foo
+; CHECK:     catch
+; CHECK:       i32.call  $drop=, __cxa_begin_catch
+; CHECK:       call      __cxa_end_catch
+; CHECK:     end_try
 ; CHECK-NOT: global.set  __stack_pointer
 ; CHECK:     return
 define void @test_no_sp_writeback() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {