[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/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*) {