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