diff options
author | Thomas Lively <tlively@google.com> | 2024-11-22 14:21:54 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-22 14:21:54 -0800 |
commit | 013a8d346807da751fec283eddf86aee9ea28382 (patch) | |
tree | f867ba4f2e992bd663f1d13b3d2c8c5d814167a8 | |
parent | ad3735ae7def0923c0f04738c6cba3f86634e865 (diff) | |
download | binaryen-013a8d346807da751fec283eddf86aee9ea28382.tar.gz binaryen-013a8d346807da751fec283eddf86aee9ea28382.tar.bz2 binaryen-013a8d346807da751fec283eddf86aee9ea28382.zip |
Print castType for unreachable br_on_cast{_fail} (#7107)
I forgot that there is a validation rule that the output type for
br_on_cast and br_on_cast_fail must be a subtype of the input type. We
were previously printing bottom input types in cases where the cast
operand was unreachable, but that's only valid if the cast type is the
same bottom type. Instead print the most precise valid input type, which
is the cast type itself.
-rw-r--r-- | src/passes/Print.cpp | 10 | ||||
-rw-r--r-- | test/lit/wat-kitchen-sink.wast | 4 |
2 files changed, 6 insertions, 8 deletions
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 0b15477ee..bbf5f2a6b 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -2229,10 +2229,9 @@ struct PrintExpressionContents o << ' '; if (curr->ref->type == Type::unreachable) { // Need to print some reference type in the correct hierarchy rather - // than unreachable, and the bottom type is valid in the most - // contexts. - printType( - Type(curr->castType.getHeapType().getBottom(), NonNullable)); + // than unreachable, and the cast type itself is the best possible + // option. + printType(curr->castType); } else { printType(curr->ref->type); } @@ -2244,8 +2243,7 @@ struct PrintExpressionContents curr->name.print(o); o << ' '; if (curr->ref->type == Type::unreachable) { - printType( - Type(curr->castType.getHeapType().getBottom(), NonNullable)); + printType(curr->castType); } else { printType(curr->ref->type); } diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast index 52cb2ca1d..33d2e1d62 100644 --- a/test/lit/wat-kitchen-sink.wast +++ b/test/lit/wat-kitchen-sink.wast @@ -4086,7 +4086,7 @@ ;; CHECK-NEXT: (block $block (result i31ref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref any)) - ;; CHECK-NEXT: (br_on_cast $block (ref none) i31ref + ;; CHECK-NEXT: (br_on_cast $block i31ref i31ref ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4136,7 +4136,7 @@ ;; CHECK-NEXT: (block $block (result (ref any)) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i31ref) - ;; CHECK-NEXT: (br_on_cast_fail $block (ref none) i31ref + ;; CHECK-NEXT: (br_on_cast_fail $block i31ref i31ref ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) |