diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.mir b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.mir @@ -0,0 +1,55 @@ +# RUN: llc -mtriple=wasm32-unknown-unknown -exception-model=wasm -mattr=+exception-handling -run-pass wasm-cfg-stackify %s -o - | FileCheck %s + +--- | + target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" + target triple = "wasm32-unknown-unknown" + + declare i32 @__gxx_wasm_personality_v0(...) + declare void @foo() + define void @rethrow_arg_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { + ret void + } +... + +--- +# CHECK-LABEL: name: rethrow_arg_test +name: rethrow_arg_test +liveins: + - { reg: '$arguments' } +body: | + bb.0: + successors: %bb.1, %bb.3 + ; CHECK: bb.0: + ; CHECK: TRY + EH_LABEL + CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 + EH_LABEL + BR %bb.3, implicit-def dead $arguments + + bb.1 (landing-pad): + successors: %bb.2 + ; CHECK: bb.1 (landing-pad): + ; CHECK: CATCH + ; CHECK: TRY + ; This RETHROW rethrows the exception caught by this BB's CATCH, but after + ; CFGStackify a TRY is placed between the CATCH and this RETHROW, so after + ; CFGStackify its immediate argument should become not 0, but 1. + ; CHECK: RETHROW 1 + EH_LABEL + %0:i32 = CATCH &__cpp_exception, implicit-def dead $arguments + RETHROW 0, implicit-def dead $arguments + + bb.2 (landing-pad): + ; CHECK: bb.2 (landing-pad): + ; CHECK: CATCH + ; CHECK: RETHROW 0 + EH_LABEL + %1:i32 = CATCH &__cpp_exception, implicit-def dead $arguments + RETHROW 0, implicit-def dead $arguments + + bb.3: + ; CHECK: bb.3: + ; CHECK: END_TRY + ; CHECK: END_TRY + RETURN implicit-def dead $arguments +... diff --git a/llvm/test/CodeGen/WebAssembly/exception.mir b/llvm/test/CodeGen/WebAssembly/exception.mir --- a/llvm/test/CodeGen/WebAssembly/exception.mir +++ b/llvm/test/CodeGen/WebAssembly/exception.mir @@ -12,9 +12,6 @@ define void @unreachable_ehpad_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { ret void } - define void @rethrow_arg_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) { - ret void - } ... --- @@ -84,56 +81,3 @@ ; predecessors: %bb.0, %bb.1 RETURN implicit-def dead $arguments ... - ---- -# CHECK-LABEL: name: rethrow_arg_test -name: rethrow_arg_test -liveins: - - { reg: '$arguments' } -body: | - bb.0: - successors: %bb.1, %bb.4 - ; CHECK: bb.0 - ; CHECK: TRY - EH_LABEL - CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64 - EH_LABEL - BR %bb.4, implicit-def dead $arguments - - bb.1 (landing-pad): - ; predecessors: %bb.0 - successors: %bb.2 - ; CHECK: bb.1 - ; CHECK: CATCH - ; CHECK: TRY - ; This RETHROW rethrows the exception caught by this BB's CATCH, but after - ; CFGStackify a TRY is placed between the CATCH and this RETHROW, so after - ; CFGStackify its immediate argument should become not 0, but 1. - ; CHECK: RETHROW 1 - EH_LABEL - %0:i32 = CATCH &__cpp_exception, implicit-def dead $arguments - RETHROW 0, implicit-def dead $arguments - - bb.2 (landing-pad): - ; predecessors: %bb.1 - successors: %bb.3 - ; CHECK: bb.2 - ; CHECK: CATCH - ; CHECK: RETHROW 0 - EH_LABEL - %1:i32 = CATCH &__cpp_exception, implicit-def dead $arguments - RETHROW 0, implicit-def dead $arguments - CATCHRET %bb.3, %bb.2, implicit-def dead $arguments - - bb.3: - ; predecessors: %bb.2 - successors: %bb.4 - CATCHRET %bb.4, %bb.1, implicit-def dead $arguments - - bb.4: - ; predecessors: %bb.0, %bb.3 - ; CHECK: bb.4 - ; CHECK: END_TRY - ; CHECK: END_TRY - RETURN implicit-def dead $arguments -