diff options
-rw-r--r-- | src/wasm-interpreter.h | 2 | ||||
-rw-r--r-- | test/lit/passes/precompute-gc.wast | 45 |
2 files changed, 46 insertions, 1 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index c67ac6768..8bb250993 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -1449,7 +1449,7 @@ public: // This is a dynamic check with an RTT. Flow rtt = this->visit(curr->rtt); if (rtt.breaking()) { - return typename Cast::Breaking{ref}; + return typename Cast::Breaking{rtt}; } intendedRtt = rtt.getSingleValue(); } else { diff --git a/test/lit/passes/precompute-gc.wast b/test/lit/passes/precompute-gc.wast index 276d83289..9b12202b1 100644 --- a/test/lit/passes/precompute-gc.wast +++ b/test/lit/passes/precompute-gc.wast @@ -1271,6 +1271,51 @@ ) ) + ;; Regression test checking that breaking RTTs are interpreted correctly. + ;; CHECK: (func $cast-breaking-rtt + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (ref.cast + ;; CHECK-NEXT: (ref.cast + ;; CHECK-NEXT: (struct.new_default $struct) + ;; CHECK-NEXT: (call $unreachable-rtt) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $unreachable-rtt) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; NOMNL: (func $cast-breaking-rtt + ;; NOMNL-NEXT: (drop + ;; NOMNL-NEXT: (ref.cast + ;; NOMNL-NEXT: (ref.cast + ;; NOMNL-NEXT: (struct.new_default $struct) + ;; NOMNL-NEXT: (call $unreachable-rtt) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (call $unreachable-rtt) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: ) + (func $cast-breaking-rtt + (drop + (ref.cast + (ref.cast + (struct.new_default $struct) + (call $unreachable-rtt) + ) + (call $unreachable-rtt) + ) + ) + ) + + ;; CHECK: (func $unreachable-rtt (result (rtt $struct)) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; NOMNL: (func $unreachable-rtt (result (rtt $struct)) + ;; NOMNL-NEXT: (unreachable) + ;; NOMNL-NEXT: ) + (func $unreachable-rtt (result (rtt $struct)) + (unreachable) + ) + ;; CHECK: (func $new_block_unreachable (result anyref) ;; CHECK-NEXT: (block ;; (replaces something unreachable we can't emit) ;; CHECK-NEXT: (drop |