From a81f7d14c598caad373b2af70142dc25eda454c7 Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Thu, 6 Aug 2026 23:56:38 +0530 Subject: [PATCH 1/7] Fix #8785 StackEntry wasm stack type invariants Track Wasm operand-stack effects separately from Binaryen IR types via StackEntry::wasmStackType. Key fixes: - Sync wasmStackType to none when dropping unreachable predecessors - Guard finishScope tuple repackaging when hoist is empty - Mask deeper stack values under unreachable in hoistLastValue Adds validation tests for unreachable void-block drop, multivalue tuple parsing, and related edge cases. --- src/wasm-ir-builder.h | 17 +- src/wasm/wasm-ir-builder.cpp | 220 ++++++++++++++---- .../unreachable-if-double-drop-invalid.wast | 15 ++ .../unreachable-if-stack-valid.wast | 12 + .../unreachable-inner-drop-valid.wast | 3 + .../unreachable-loop-drop-invalid.wast | 5 + ...eachable-multivalue-tuple-parse-valid.wast | 15 ++ .../unreachable-void-block-drop-invalid.wast | 6 + .../unreachable-void-block-parse-valid.wast | 3 + 9 files changed, 246 insertions(+), 50 deletions(-) create mode 100644 test/lit/validation/unreachable-if-double-drop-invalid.wast create mode 100644 test/lit/validation/unreachable-if-stack-valid.wast create mode 100644 test/lit/validation/unreachable-inner-drop-valid.wast create mode 100644 test/lit/validation/unreachable-loop-drop-invalid.wast create mode 100644 test/lit/validation/unreachable-multivalue-tuple-parse-valid.wast create mode 100644 test/lit/validation/unreachable-void-block-drop-invalid.wast create mode 100644 test/lit/validation/unreachable-void-block-parse-valid.wast diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index 5998dc87428..30c29a9e5a4 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -69,6 +69,12 @@ class IRBuilder : public UnifiedExpressionVisitor> { // Like visit, but pushes the expression onto the stack as-is without popping // any children or refinalization. void push(Expression*, Origin origin = Origin::Binary); + // Push a control flow construct using its declared Wasm stack result type, + // which may differ from its Binaryen IR type when the construct is typed + // unreachable internally. + void pushControlFlow(Expression* expr, + Type wasmStackResult, + Origin origin = Origin::Binary); void pushSynthetic(Expression* expr) { push(expr, Origin::Synthetic); } // Set the debug location to be attached to the next visited, created, or @@ -309,6 +315,14 @@ class IRBuilder : public UnifiedExpressionVisitor> { // when visiting the beginnings of try blocks. Result<> visitPop(Pop*) { return Ok{}; } + // An entry on the expression stack, tracking both the Binaryen IR node and + // the Wasm operand-stack type it produces. These may differ for unreachable + // control flow (see StackIRGenerator::makeStackInst in wasm-stack.cpp). + struct StackEntry { + Expression* expr; + Type wasmStackType; + }; + private: Module& wasm; Function* func = nullptr; @@ -333,6 +347,7 @@ class IRBuilder : public UnifiedExpressionVisitor> { struct ChildPopper; void applyDebugLoc(Expression* expr); + void pushStackEntry(Expression* expr, Type wasmStackType, Origin origin); // The context for a single block scope, including the instructions parsed // inside that scope so far and the ultimate result type we expect this block @@ -418,7 +433,7 @@ class IRBuilder : public UnifiedExpressionVisitor> { std::vector outputLabels; // The stack of instructions being built in this scope. - std::vector exprStack; + std::vector exprStack; // Whether we have seen an unreachable instruction and are in // stack-polymorphic unreachable mode. diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index e4c753fb220..516a8633cde 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -92,6 +92,73 @@ Result<> validateTypeAnnotation(HeapType type, Expression* child) { return validateTypeAnnotation(Type(type, Nullable), child); } +bool hasNonFallthroughControlFlow(Expression* expr); + +bool blockHasNonFallthroughControlFlow(Block* block) { + for (auto* child : block->list) { + if (hasNonFallthroughControlFlow(child)) { + return true; + } + } + return false; +} + +bool hasNonFallthroughControlFlow(Expression* expr) { + if (expr->is() || expr->is() || expr->is() || + expr->is() || expr->is()) { + return true; + } + if (auto* block = expr->dynCast()) { + return blockHasNonFallthroughControlFlow(block); + } + if (auto* loop = expr->dynCast()) { + return hasNonFallthroughControlFlow(loop->body); + } + if (auto* iff = expr->dynCast()) { + if (hasNonFallthroughControlFlow(iff->ifTrue)) { + return true; + } + if (iff->ifFalse && hasNonFallthroughControlFlow(iff->ifFalse)) { + return true; + } + } + if (auto* tryy = expr->dynCast()) { + if (hasNonFallthroughControlFlow(tryy->body)) { + return true; + } + for (auto* catchBody : tryy->catchBodies) { + if (hasNonFallthroughControlFlow(catchBody)) { + return true; + } + } + } + if (auto* trytable = expr->dynCast()) { + return hasNonFallthroughControlFlow(trytable->body); + } + return false; +} + +std::vector +stackExprs(const std::vector& stack) { + std::vector exprs; + exprs.reserve(stack.size()); + for (auto& entry : stack) { + exprs.push_back(entry.expr); + } + return exprs; +} + +std::vector stackExprs( + std::vector::const_iterator begin, + std::vector::const_iterator end) { + std::vector exprs; + exprs.reserve(end - begin); + for (auto it = begin; it != end; ++it) { + exprs.push_back(it->expr); + } + return exprs; +} + } // anonymous namespace Result IRBuilder::addScratchLocal(Type type) { @@ -104,20 +171,30 @@ Result IRBuilder::addScratchLocal(Type type) { MaybeResult IRBuilder::hoistLastValue(bool greedy) { auto& stack = getScope().exprStack; + if (stack.empty()) { + return {}; + } + if (!stack.empty() && stack.back().wasmStackType == Type::none && + getScope().unreachable) { + // In unreachable scopes, void instructions on top mask deeper values for the + // next pop, matching Wasm polymorphic stack semantics. + return {}; + } int valIndex = stack.size() - 1; for (; valIndex >= 0; --valIndex) { - if (stack[valIndex]->type != Type::none) { + if (stack[valIndex].wasmStackType != Type::none) { break; } } if (valIndex < 0) { - // There is no value-producing or unreachable expression. + // There is no value-producing expression. return {}; } int hoistIndex = valIndex; if (greedy) { - while (hoistIndex > 0 && stack[hoistIndex - 1]->type == Type::none) { + while (hoistIndex > 0 && + stack[hoistIndex - 1].wasmStackType == Type::none) { --hoistIndex; } } @@ -126,8 +203,8 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { // Value-producing expression already on top of the stack. return HoistedVal{Index(hoistIndex), nullptr}; } - auto*& expr = stack[valIndex]; - if (expr->type == Type::unreachable) { + auto*& expr = stack[valIndex].expr; + if (stack[valIndex].wasmStackType == Type::unreachable) { // No need for a scratch local to hoist an unreachable. return HoistedVal{Index(hoistIndex), nullptr}; } @@ -139,7 +216,8 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { // text roundtripping if the block type would conflict after binary writing // with another function type in the module. Avoid this problem by // generalizing the scratch local type eagerly. - auto type = expr->type.asWrittenGivenFeatures(wasm.features); + auto type = + stack[valIndex].wasmStackType.asWrittenGivenFeatures(wasm.features); auto scratchIdx = addScratchLocal(type); CHECK_ERR(scratchIdx); expr = builder.makeLocalSet(*scratchIdx, expr); @@ -159,14 +237,14 @@ Result<> IRBuilder::packageHoistedValue(const HoistedVal& hoisted, // we are synthesizing a block to help us determine later whether we need to // run the nested pop fixup. scopeStack[0].noteSyntheticBlock(); - std::vector exprs(scope.exprStack.begin() + hoisted.hoistIndex, - scope.exprStack.end()); + auto exprs = stackExprs(scope.exprStack.begin() + hoisted.hoistIndex, + scope.exprStack.end()); auto* block = builder.makeBlock(exprs, type); scope.exprStack.resize(hoisted.hoistIndex); pushSynthetic(block); }; - auto type = scope.exprStack.back()->type; + auto type = scope.exprStack.back().wasmStackType; if (type == Type::none) { // If we did not have a value on top of the stack and did not add a scratch // local, then there must have been an unreachable. @@ -187,14 +265,16 @@ Result<> IRBuilder::packageHoistedValue(const HoistedVal& hoisted, Index scratchIdx; if (hoisted.get) { // Update the get on top of the stack to just return the first element. - scope.exprStack.back() = builder.makeTupleExtract(hoisted.get, 0); + scope.exprStack.back().expr = builder.makeTupleExtract(hoisted.get, 0); + scope.exprStack.back().wasmStackType = type[0]; packageAsBlock(type[0]); scratchIdx = hoisted.get->index; } else { auto scratch = addScratchLocal(type); CHECK_ERR(scratch); - scope.exprStack.back() = builder.makeTupleExtract( - builder.makeLocalTee(*scratch, scope.exprStack.back(), type), 0); + scope.exprStack.back().expr = builder.makeTupleExtract( + builder.makeLocalTee(*scratch, scope.exprStack.back().expr, type), 0); + scope.exprStack.back().wasmStackType = type[0]; scratchIdx = *scratch; } for (Index i = 1, size = type.size(); i < size; ++i) { @@ -204,12 +284,11 @@ Result<> IRBuilder::packageHoistedValue(const HoistedVal& hoisted, return Ok{}; } -void IRBuilder::push(Expression* expr, Origin origin) { +void IRBuilder::pushStackEntry(Expression* expr, + Type wasmStackType, + Origin origin) { auto& scope = getScope(); - if (expr->type == Type::unreachable) { - scope.unreachable = true; - } - scope.exprStack.push_back(expr); + scope.exprStack.push_back({expr, wasmStackType}); if (origin == Origin::Binary) { applyDebugLoc(expr); @@ -235,6 +314,39 @@ void IRBuilder::push(Expression* expr, Origin origin) { DBG(dump()); } +void IRBuilder::push(Expression* expr, Origin origin) { + Type wasmStackType = expr->type; + // Unreachable control flow does not push a value or enter polymorphic mode in + // the enclosing scope (see StackIRGenerator::makeStackInst in wasm-stack.cpp). + if (expr->type == Type::unreachable && + !Properties::isControlFlowStructure(expr)) { + getScope().unreachable = true; + wasmStackType = Type::none; + } + pushStackEntry(expr, wasmStackType, origin); +} + +void IRBuilder::pushControlFlow(Expression* expr, + Type wasmStackResult, + Origin origin) { + auto& scope = getScope(); + Type stackType = wasmStackResult; + if (wasmStackResult == Type::none && expr->type == Type::unreachable) { + if (expr->is()) { + // Unlike other void control flow, a void if that is unreachable in IR + // leaves the enclosing Wasm stack polymorphic when it completes. + scope.unreachable = true; + } else if (hasNonFallthroughControlFlow(expr)) { + // Control flow that does not fall through remains usable as a Binaryen + // IR operand via unreachable typing. + stackType = Type::unreachable; + } else { + stackType = Type::none; + } + } + pushStackEntry(expr, stackType, origin); +} + Result IRBuilder::build() { if (scopeStack.empty()) { return builder.makeBlock(); @@ -246,7 +358,7 @@ Result IRBuilder::build() { return Err{"unused expressions without block context"}; } assert(scopeStack.back().exprStack.size() == 1); - auto* expr = scopeStack.back().exprStack.back(); + auto* expr = scopeStack.back().exprStack.back().expr; scopeStack.clear(); labelDepths.clear(); return expr; @@ -347,9 +459,10 @@ void IRBuilder::dump() { std::cerr << ":\n"; - for (auto* expr : scope.exprStack) { - std::cerr << " " << ShallowExpression{expr} << " (; " - << expr->type.toString() << " ;)\n"; + for (auto& entry : scope.exprStack) { + std::cerr << " " << ShallowExpression{entry.expr} << " (; " + << entry.expr->type.toString() << " / stack " + << entry.wasmStackType.toString() << " ;)\n"; } } #endif // IR_BUILDER_DEBUG @@ -482,11 +595,11 @@ struct IRBuilder::ChildPopper return unreachableFallbackSize; } --stackIndex; - stackTupleIndex = scope.exprStack[stackIndex]->type.size() - 1; + stackTupleIndex = scope.exprStack[stackIndex].wasmStackType.size() - 1; } // Skip expressions that don't produce values. - if (scope.exprStack[stackIndex]->type == Type::none) { + if (scope.exprStack[stackIndex].wasmStackType == Type::none) { stackTupleIndex = 0; continue; } @@ -496,7 +609,7 @@ struct IRBuilder::ChildPopper // We have an available type and a constraint. Only check constraints if // we are deeper than an unreachable, since otherwise we can leave // problems to be caught by the validator later. - auto type = scope.exprStack[stackIndex]->type[stackTupleIndex]; + auto type = scope.exprStack[stackIndex].wasmStackType[stackTupleIndex]; if (unreachableFallbackSize) { auto constraint = children[childIndex].constraint[childTupleIndex]; if (!PrincipalType::matches(type, constraint)) { @@ -552,10 +665,12 @@ struct IRBuilder::ChildPopper CHECK_ERR(builder.packageHoistedValue(*hoisted, size)); - auto* ret = scope.exprStack.back(); + auto& entry = scope.exprStack.back(); // If the top value has the correct size, we can pop it and be done. - // Unreachable values satisfy any size. - if (ret->type.size() == size || ret->type == Type::unreachable) { + // Unreachable stack types satisfy any size when used as Binaryen IR operands. + if (entry.wasmStackType.size() == size || + entry.wasmStackType == Type::unreachable) { + auto* ret = entry.expr; scope.exprStack.pop_back(); return ret; } @@ -891,8 +1006,10 @@ Result IRBuilder::finishScope(Block* block) { bool sawUnreachable = false; for (int i = scope.exprStack.size() - 1; i >= 0; --i) { if (sawUnreachable) { - scope.exprStack[i] = builder.dropIfConcretelyTyped(scope.exprStack[i]); - } else if (scope.exprStack[i]->type == Type::unreachable) { + scope.exprStack[i].expr = + builder.dropIfConcretelyTyped(scope.exprStack[i].expr); + scope.exprStack[i].wasmStackType = Type::none; + } else if (scope.exprStack[i].expr->type == Type::unreachable) { sawUnreachable = true; } } @@ -902,18 +1019,23 @@ Result IRBuilder::finishScope(Block* block) { auto hoisted = hoistLastValue(); CHECK_ERR(hoisted); if (!hoisted) { - return Err{"popping from empty stack"}; - } - - if (scope.exprStack.back()->type == Type::none) { + if (scope.unreachable || scope.labelUsed) { + // Unreachable arms of concretely typed control flow, or scopes that + // receive values via breaks rather than fallthrough, do not require a + // Wasm stack value at scope end. + pushSynthetic(builder.makeUnreachable()); + } else { + return Err{"popping from empty stack"}; + } + } else if (scope.exprStack.back().wasmStackType == Type::none) { // Nothing was hoisted, which means there must have been an unreachable // buried under none-type expressions. It is not valid to end a concretely // typed block with none-typed expressions, so add an extra unreachable. pushSynthetic(builder.makeUnreachable()); } - if (type.isTuple()) { - auto hoistedType = scope.exprStack.back()->type; + if (type.isTuple() && hoisted) { + auto hoistedType = scope.exprStack.back().wasmStackType; if (hoistedType != Type::unreachable && hoistedType.size() != type.size()) { // We cannot propagate the hoisted value directly because it does not @@ -939,18 +1061,18 @@ Result IRBuilder::finishScope(Block* block) { // We can put our single expression directly into the surrounding scope. if (block) { block->list.resize(1); - block->list[0] = scope.exprStack.back(); + block->list[0] = scope.exprStack.back().expr; ret = block; } else { - ret = scope.exprStack.back(); + ret = scope.exprStack.back().expr; } } else { // More than one expression, so we need a block. Allocate one if we weren't // already given one. if (block) { - block->list.set(scope.exprStack); + block->list.set(stackExprs(scope.exprStack)); } else { - block = builder.makeBlock(scope.exprStack, type); + block = builder.makeBlock(stackExprs(scope.exprStack), type); } ret = block; } @@ -1192,7 +1314,7 @@ Result<> IRBuilder::visitEnd() { block->name = label; block->finalize(block->type, scope.labelUsed ? Block::HasBreak : Block::NoBreak); - push(block); + pushControlFlow(block, blockType); } else if (auto* loop = scope.getLoop()) { loop->body = fixExtraOutput(scope, label, *expr); loop->name = scope.label; @@ -1203,7 +1325,7 @@ Result<> IRBuilder::visitEnd() { fixLoopWithInput(loop, scope.inputType, scope.inputLocal); } loop->finalize(loop->type); - push(loop); + pushControlFlow(loop, blockType); } else if (auto* iff = scope.getIf()) { iff->ifTrue = *expr; if (scope.inputType != Type::none) { @@ -1215,27 +1337,27 @@ Result<> IRBuilder::visitEnd() { iff->ifFalse = nullptr; } iff->finalize(iff->type); - push(maybeWrapForLabel(iff)); + pushControlFlow(maybeWrapForLabel(iff), blockType); } else if (auto* iff = scope.getElse()) { iff->ifFalse = *expr; iff->finalize(iff->type); - push(maybeWrapForLabel(iff)); + pushControlFlow(maybeWrapForLabel(iff), blockType); } else if (auto* tryy = scope.getTry()) { tryy->body = *expr; tryy->name = scope.label; tryy->finalize(tryy->type); - push(maybeWrapForLabel(tryy)); + pushControlFlow(maybeWrapForLabel(tryy), blockType); } else if (Try* tryy; (tryy = scope.getCatch()) || (tryy = scope.getCatchAll())) { auto index = scope.getIndex(); setCatchBody(tryy, *expr, index); tryy->name = scope.label; tryy->finalize(tryy->type); - push(maybeWrapForLabel(tryy)); + pushControlFlow(maybeWrapForLabel(tryy), blockType); } else if (auto* trytable = scope.getTryTable()) { trytable->body = *expr; trytable->finalize(trytable->type, &wasm); - push(maybeWrapForLabel(trytable)); + pushControlFlow(maybeWrapForLabel(trytable), blockType); } else { WASM_UNREACHABLE("unexpected scope kind"); } @@ -1895,11 +2017,11 @@ Result<> IRBuilder::makePop(Type type) { // type as the Pop we have already made. auto& scope = getScope(); if (!scope.getCatch() || scope.exprStack.size() != 1 || - !scope.exprStack[0]->is()) { + !scope.exprStack[0].expr->is()) { return Err{ "pop instructions may only appear at the beginning of catch blocks"}; } - auto expectedType = scope.exprStack[0]->type; + auto expectedType = scope.exprStack[0].expr->type; if (!Type::isSubType(expectedType, type)) { return Err{std::string("Expected pop of type ") + expectedType.toString()}; } @@ -2264,7 +2386,7 @@ Result<> IRBuilder::makeBrOn(Index label, CHECK_ERR(testLocal); // Put the value under test back on the stack and stash it. - getScope().exprStack.push_back(curr.ref); + getScope().exprStack.push_back({curr.ref, curr.ref->type}); CHECK_ERR(makeLocalSet(*testLocal)); // Now we can stash the extra values. diff --git a/test/lit/validation/unreachable-if-double-drop-invalid.wast b/test/lit/validation/unreachable-if-double-drop-invalid.wast new file mode 100644 index 00000000000..cfeace07628 --- /dev/null +++ b/test/lit/validation/unreachable-if-double-drop-invalid.wast @@ -0,0 +1,15 @@ +;; RUN: not wasm-as %s -o /dev/null 2>&1 | filecheck %s + +;; CHECK: popping from empty stack + +(module + (func (param i32) + (if (result i32) + (local.get 0) + (then (unreachable)) + (else (unreachable)) + ) + (drop) + (drop) + ) +) diff --git a/test/lit/validation/unreachable-if-stack-valid.wast b/test/lit/validation/unreachable-if-stack-valid.wast new file mode 100644 index 00000000000..c2320764aee --- /dev/null +++ b/test/lit/validation/unreachable-if-stack-valid.wast @@ -0,0 +1,12 @@ +;; RUN: wasm-as %s -o /dev/null + +(module + (func (param i32) + (if (result i32) + (local.get 0) + (then (unreachable)) + (else (unreachable)) + ) + (drop) + ) +) diff --git a/test/lit/validation/unreachable-inner-drop-valid.wast b/test/lit/validation/unreachable-inner-drop-valid.wast new file mode 100644 index 00000000000..ef67092569a --- /dev/null +++ b/test/lit/validation/unreachable-inner-drop-valid.wast @@ -0,0 +1,3 @@ +;; RUN: wasm-as %s -o /dev/null + +(module (func (block (unreachable) (drop)))) diff --git a/test/lit/validation/unreachable-loop-drop-invalid.wast b/test/lit/validation/unreachable-loop-drop-invalid.wast new file mode 100644 index 00000000000..8d23fd49b06 --- /dev/null +++ b/test/lit/validation/unreachable-loop-drop-invalid.wast @@ -0,0 +1,5 @@ +;; RUN: not wasm-as %s -o /dev/null 2>&1 | filecheck %s + +;; CHECK: popping from empty stack + +(module (func (loop (unreachable)) (drop))) diff --git a/test/lit/validation/unreachable-multivalue-tuple-parse-valid.wast b/test/lit/validation/unreachable-multivalue-tuple-parse-valid.wast new file mode 100644 index 00000000000..bbdbfa4976c --- /dev/null +++ b/test/lit/validation/unreachable-multivalue-tuple-parse-valid.wast @@ -0,0 +1,15 @@ +;; NOTE: Regression for StackEntry wasmStackType invariants in unreachable +;; multivalue function bodies. Must parse without assertion/crash. +;; RUN: wasm-as %s -all -o /dev/null +;; RUN: wasm-opt %s -all -o /dev/null + +(module (type $ret2 (func (result i32 i32))) + (func (type $ret2) + i32.const 1 + i32.const 2 + i32.add + unreachable + i32.const 3 + i32.const 4 + i32.add + )) diff --git a/test/lit/validation/unreachable-void-block-drop-invalid.wast b/test/lit/validation/unreachable-void-block-drop-invalid.wast new file mode 100644 index 00000000000..c109a790ade --- /dev/null +++ b/test/lit/validation/unreachable-void-block-drop-invalid.wast @@ -0,0 +1,6 @@ +;; RUN: not wasm-as %s -o /dev/null 2>&1 | filecheck %s +;; RUN: not wasm-opt %s -o /dev/null 2>&1 | filecheck %s + +;; CHECK: popping from empty stack + +(module (func (block (unreachable)) (drop))) diff --git a/test/lit/validation/unreachable-void-block-parse-valid.wast b/test/lit/validation/unreachable-void-block-parse-valid.wast new file mode 100644 index 00000000000..51594fe8a80 --- /dev/null +++ b/test/lit/validation/unreachable-void-block-parse-valid.wast @@ -0,0 +1,3 @@ +;; RUN: wasm-as %s -o /dev/null + +(module (func (block (unreachable)))) From 0e656c140be82ee4c22db8993178ecf10489c184 Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Fri, 7 Aug 2026 09:08:05 +0530 Subject: [PATCH 2/7] Fix StackEntry regressions for try/return_call and unreachable CF scopes Extend pushControlFlow/finishScope handling so void unreachable fallthrough control flow and return_call inside try remain parseable in concrete-result functions, while preserving #8785 rejection of (block (unreachable)) (drop). Allow void unreachable fallthrough blocks to satisfy concrete operand pops (e.g. if/br_if conditions). Skip struct.get field typing when the ref is unreachable. Add focused validation regressions for try/return_call and concrete block ends. Lit ledger: /tmp/binaryen-lit-ledger/report.md --- src/wasm-ir-builder.h | 3 + src/wasm/wasm-ir-builder.cpp | 83 +++++++++++++++---- .../unreachable-concrete-block-end-valid.wast | 13 +++ .../unreachable-try-return-call-valid.wast | 18 ++++ 4 files changed, 100 insertions(+), 17 deletions(-) create mode 100644 test/lit/validation/unreachable-concrete-block-end-valid.wast create mode 100644 test/lit/validation/unreachable-try-return-call-valid.wast diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index 30c29a9e5a4..c653d6952c7 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -346,6 +346,9 @@ class IRBuilder : public UnifiedExpressionVisitor> { struct ChildPopper; + Result<> validateTypeAnnotation(Type type, Expression* child); + Result<> validateTypeAnnotation(HeapType type, Expression* child); + void applyDebugLoc(Expression* expr); void pushStackEntry(Expression* expr, Type wasmStackType, Origin origin); diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 516a8633cde..d014c4c56d4 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -81,17 +81,6 @@ namespace wasm { namespace { -Result<> validateTypeAnnotation(Type type, Expression* child) { - if (!Type::isSubType(child->type, type)) { - return Err{"invalid type on stack"}; - } - return Ok{}; -} - -Result<> validateTypeAnnotation(HeapType type, Expression* child) { - return validateTypeAnnotation(Type(type, Nullable), child); -} - bool hasNonFallthroughControlFlow(Expression* expr); bool blockHasNonFallthroughControlFlow(Block* block) { @@ -108,6 +97,15 @@ bool hasNonFallthroughControlFlow(Expression* expr) { expr->is() || expr->is()) { return true; } + if (auto* call = expr->dynCast(); call && call->isReturn) { + return true; + } + if (auto* call = expr->dynCast(); call && call->isReturn) { + return true; + } + if (auto* call = expr->dynCast(); call && call->isReturn) { + return true; + } if (auto* block = expr->dynCast()) { return blockHasNonFallthroughControlFlow(block); } @@ -161,6 +159,17 @@ std::vector stackExprs( } // anonymous namespace +Result<> IRBuilder::validateTypeAnnotation(Type type, Expression* child) { + if (!Type::isSubType(child->type, type)) { + return Err{"invalid type on stack"}; + } + return Ok{}; +} + +Result<> IRBuilder::validateTypeAnnotation(HeapType type, Expression* child) { + return validateTypeAnnotation(Type(type, Nullable), child); +} + Result IRBuilder::addScratchLocal(Type type) { if (!func) { return Err{"scratch local required, but there is no function context"}; @@ -331,11 +340,12 @@ void IRBuilder::pushControlFlow(Expression* expr, Origin origin) { auto& scope = getScope(); Type stackType = wasmStackResult; - if (wasmStackResult == Type::none && expr->type == Type::unreachable) { + if (expr->type == Type::unreachable && !wasmStackResult.isConcrete()) { if (expr->is()) { // Unlike other void control flow, a void if that is unreachable in IR // leaves the enclosing Wasm stack polymorphic when it completes. scope.unreachable = true; + stackType = Type::none; } else if (hasNonFallthroughControlFlow(expr)) { // Control flow that does not fall through remains usable as a Binaryen // IR operand via unreachable typing. @@ -543,6 +553,26 @@ struct IRBuilder::ChildPopper // Pop a child normally. Pop greedily for children other than the first // (i.e. the last to be popped). bool greedy = i > 0; + if (!scope.exprStack.empty()) { + auto& top = scope.exprStack.back(); + bool wantsConcrete = false; + for (auto& constraint : children[i].constraint) { + if (auto* type = std::get_if(&constraint)) { + if (type->isConcrete()) { + wantsConcrete = true; + break; + } + } + } + if (wantsConcrete && top.wasmStackType == Type::none && + top.expr->type == Type::unreachable && + Properties::isControlFlowStructure(top.expr) && + !hasNonFallthroughControlFlow(top.expr)) { + *children[i].childp = top.expr; + scope.exprStack.pop_back(); + continue; + } + } auto val = pop(children[i].constraint.size(), greedy); CHECK_ERR(val); *children[i].childp = *val; @@ -1019,10 +1049,25 @@ Result IRBuilder::finishScope(Block* block) { auto hoisted = hoistLastValue(); CHECK_ERR(hoisted); if (!hoisted) { - if (scope.unreachable || scope.labelUsed) { - // Unreachable arms of concretely typed control flow, or scopes that - // receive values via breaks rather than fallthrough, do not require a - // Wasm stack value at scope end. + bool unreachableFallthroughCF = false; + for (int i = int(scope.exprStack.size()) - 1; i >= 0; --i) { + auto& entry = scope.exprStack[i]; + if (entry.wasmStackType != Type::none) { + break; + } + auto* expr = entry.expr; + if (expr->type == Type::unreachable && + Properties::isControlFlowStructure(expr) && + !hasNonFallthroughControlFlow(expr)) { + unreachableFallthroughCF = true; + break; + } + } + if (scope.unreachable || scope.labelUsed || unreachableFallthroughCF) { + // Unreachable arms of concretely typed control flow, scopes that + // receive values via breaks rather than fallthrough, and void + // fallthrough unreachable control flow do not require a Wasm stack + // value at scope end. pushSynthetic(builder.makeUnreachable()); } else { return Err{"popping from empty stack"}; @@ -2491,8 +2536,12 @@ Result<> IRBuilder::makeStructGet(HeapType type, StructGet curr; CHECK_ERR(ChildPopper{*this}.visitStructGet(&curr, type)); CHECK_ERR(validateTypeAnnotation(type, curr.ref)); + auto resultType = fields[field].type; + if (curr.ref->type == Type::unreachable) { + resultType = Type::unreachable; + } push( - builder.makeStructGet(field, curr.ref, order, fields[field].type, signed_)); + builder.makeStructGet(field, curr.ref, order, resultType, signed_)); return Ok{}; } diff --git a/test/lit/validation/unreachable-concrete-block-end-valid.wast b/test/lit/validation/unreachable-concrete-block-end-valid.wast new file mode 100644 index 00000000000..fd9afbf657f --- /dev/null +++ b/test/lit/validation/unreachable-concrete-block-end-valid.wast @@ -0,0 +1,13 @@ +;; RUN: wasm-as %s -o /dev/null +;; RUN: wasm-opt %s -o /dev/null + +;; Void unreachable block at the end of a concretely typed function must +;; remain parseable without leaving a spurious value on the Wasm stack. + +(module + (func (result i32) + (block + (unreachable) + ) + ) +) diff --git a/test/lit/validation/unreachable-try-return-call-valid.wast b/test/lit/validation/unreachable-try-return-call-valid.wast new file mode 100644 index 00000000000..9dd8a7bad96 --- /dev/null +++ b/test/lit/validation/unreachable-try-return-call-valid.wast @@ -0,0 +1,18 @@ +;; RUN: wasm-as %s -all -o /dev/null +;; RUN: wasm-opt %s -all -o /dev/null + +;; Void unreachable try with return_call must remain parseable in functions +;; with concrete result types (see inlining-unreachable.wast module 2). + +(module + (import "env" "imported" (func $imported (param i32) (result i32))) + (func $callee-2 (result i32) + (try + (do + (return_call $imported + (unreachable) + ) + ) + ) + ) +) From 3c49092d46e618b7f024c2cc9e612f6791bf3c65 Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Fri, 7 Aug 2026 10:12:48 +0530 Subject: [PATCH 3/7] Fix unreachable stack popping with concrete values --- src/wasm/wasm-ir-builder.cpp | 6 ----- ...unreachable-struct-new-drop-set-valid.wast | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 test/lit/validation/unreachable-struct-new-drop-set-valid.wast diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index d014c4c56d4..b9f4c3d73f0 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -183,12 +183,6 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { if (stack.empty()) { return {}; } - if (!stack.empty() && stack.back().wasmStackType == Type::none && - getScope().unreachable) { - // In unreachable scopes, void instructions on top mask deeper values for the - // next pop, matching Wasm polymorphic stack semantics. - return {}; - } int valIndex = stack.size() - 1; for (; valIndex >= 0; --valIndex) { if (stack[valIndex].wasmStackType != Type::none) { diff --git a/test/lit/validation/unreachable-struct-new-drop-set-valid.wast b/test/lit/validation/unreachable-struct-new-drop-set-valid.wast new file mode 100644 index 00000000000..17c3efefa7f --- /dev/null +++ b/test/lit/validation/unreachable-struct-new-drop-set-valid.wast @@ -0,0 +1,23 @@ +;; RUN: wasm-as %s -all -o /dev/null +;; RUN: wasm-opt %s -all -o /dev/null + +;; After dropping unreachable struct.new, subsequent unreachable GC ops in the +;; same function must remain parseable (gufa-vs-cfp module 11). + +(module + (type $struct (struct (mut i32))) + (func $test + (drop + (struct.new $struct + (i32.const 10) + (unreachable) + ) + ) + (struct.set $struct 0 + (struct.get $struct 0 + (unreachable) + ) + (i32.const 20) + ) + ) +) From abd506b089cb58c9cab5013e7e584c59fbfa65aa Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Fri, 7 Aug 2026 10:28:05 +0530 Subject: [PATCH 4/7] Fix unreachable fallback when void entries mask stack values Track void stack entries skipped in unreachable scopes so operand popping can match concrete values below (gufa struct.new) while still synthesizing unreachable operands when types mismatch (br_table index). --- src/wasm/wasm-ir-builder.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index b9f4c3d73f0..68d05a4276d 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -590,6 +590,10 @@ struct IRBuilder::ChildPopper // Whether we are deeper than some concrete expression. bool seenConcrete = false; + // The void stack entry immediately above the current requirement's matched + // value, if we skipped void entries in an unreachable scope. + std::optional lastSkippedNoneAbove; + // Check whether the values on the stack will be able to meet the given // requirements. while (true) { @@ -603,6 +607,7 @@ struct IRBuilder::ChildPopper } --childIndex; childTupleIndex = children[childIndex].constraint.size() - 1; + lastSkippedNoneAbove = std::nullopt; } // Advance to the next available value on the stack. @@ -624,6 +629,9 @@ struct IRBuilder::ChildPopper // Skip expressions that don't produce values. if (scope.exprStack[stackIndex].wasmStackType == Type::none) { + if (scope.unreachable) { + lastSkippedNoneAbove = stackIndex; + } stackTupleIndex = 0; continue; } @@ -634,9 +642,12 @@ struct IRBuilder::ChildPopper // we are deeper than an unreachable, since otherwise we can leave // problems to be caught by the validator later. auto type = scope.exprStack[stackIndex].wasmStackType[stackTupleIndex]; - if (unreachableFallbackSize) { + if (unreachableFallbackSize || lastSkippedNoneAbove) { auto constraint = children[childIndex].constraint[childTupleIndex]; if (!PrincipalType::matches(type, constraint)) { + if (lastSkippedNoneAbove) { + return *lastSkippedNoneAbove + 1; + } return unreachableFallbackSize; } } @@ -655,6 +666,9 @@ struct IRBuilder::ChildPopper // must be concrete. assert(type.isConcrete()); seenConcrete = true; + if (lastSkippedNoneAbove && scope.unreachable) { + unreachableFallbackSize = *lastSkippedNoneAbove + 1; + } } } From 47a61c22e92487db0f5c60473cf323daf9630f9f Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Fri, 7 Aug 2026 11:15:12 +0530 Subject: [PATCH 5/7] Fix unreachable barrier handling in IRBuilder stack analysis. Treat wasm unreachable instructions (wasmStackType none but expr type unreachable) as polymorphic stack values in hoistLastValue, checkNeedsUnreachableFallback, and pop. Drop non-final concrete stack entries when building typed multi-expression blocks. Fixes array-multibyte parser failure and wasm-split validator errors. Adds unreachable-array-store-value-valid.wast regression test. --- src/wasm/wasm-ir-builder.cpp | 47 +++++++++++++++---- .../unreachable-array-store-value-valid.wast | 24 ++++++++++ 2 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 test/lit/validation/unreachable-array-store-value-valid.wast diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 68d05a4276d..333bd21dce9 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -83,6 +83,13 @@ namespace { bool hasNonFallthroughControlFlow(Expression* expr); +// Unreachable instructions leave wasmStackType none on the polymorphic Wasm stack +// but remain distinct from ordinary void instructions (drop, local.set, etc.). +bool isWasmUnreachableValue(Expression* expr, Type wasmStackType) { + return wasmStackType == Type::none && expr->type == Type::unreachable && + !Properties::isControlFlowStructure(expr); +} + bool blockHasNonFallthroughControlFlow(Block* block) { for (auto* child : block->list) { if (hasNonFallthroughControlFlow(child)) { @@ -185,7 +192,11 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { } int valIndex = stack.size() - 1; for (; valIndex >= 0; --valIndex) { - if (stack[valIndex].wasmStackType != Type::none) { + auto& entry = stack[valIndex]; + if (entry.wasmStackType != Type::none) { + break; + } + if (isWasmUnreachableValue(entry.expr, entry.wasmStackType)) { break; } } @@ -197,7 +208,9 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { int hoistIndex = valIndex; if (greedy) { while (hoistIndex > 0 && - stack[hoistIndex - 1].wasmStackType == Type::none) { + stack[hoistIndex - 1].wasmStackType == Type::none && + !isWasmUnreachableValue(stack[hoistIndex - 1].expr, + stack[hoistIndex - 1].wasmStackType)) { --hoistIndex; } } @@ -207,7 +220,8 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { return HoistedVal{Index(hoistIndex), nullptr}; } auto*& expr = stack[valIndex].expr; - if (stack[valIndex].wasmStackType == Type::unreachable) { + if (stack[valIndex].wasmStackType == Type::unreachable || + isWasmUnreachableValue(expr, stack[valIndex].wasmStackType)) { // No need for a scratch local to hoist an unreachable. return HoistedVal{Index(hoistIndex), nullptr}; } @@ -624,7 +638,12 @@ struct IRBuilder::ChildPopper return unreachableFallbackSize; } --stackIndex; - stackTupleIndex = scope.exprStack[stackIndex].wasmStackType.size() - 1; + auto& entry = scope.exprStack[stackIndex]; + if (isWasmUnreachableValue(entry.expr, entry.wasmStackType)) { + stackTupleIndex = 0; + break; + } + stackTupleIndex = entry.wasmStackType.size() - 1; } // Skip expressions that don't produce values. @@ -641,7 +660,10 @@ struct IRBuilder::ChildPopper // We have an available type and a constraint. Only check constraints if // we are deeper than an unreachable, since otherwise we can leave // problems to be caught by the validator later. - auto type = scope.exprStack[stackIndex].wasmStackType[stackTupleIndex]; + auto& entry = scope.exprStack[stackIndex]; + auto type = isWasmUnreachableValue(entry.expr, entry.wasmStackType) + ? Type::unreachable + : entry.wasmStackType[stackTupleIndex]; if (unreachableFallbackSize || lastSkippedNoneAbove) { auto constraint = children[childIndex].constraint[childTupleIndex]; if (!PrincipalType::matches(type, constraint)) { @@ -707,7 +729,8 @@ struct IRBuilder::ChildPopper // If the top value has the correct size, we can pop it and be done. // Unreachable stack types satisfy any size when used as Binaryen IR operands. if (entry.wasmStackType.size() == size || - entry.wasmStackType == Type::unreachable) { + entry.wasmStackType == Type::unreachable || + isWasmUnreachableValue(entry.expr, entry.wasmStackType)) { auto* ret = entry.expr; scope.exprStack.pop_back(); return ret; @@ -1122,10 +1145,18 @@ Result IRBuilder::finishScope(Block* block) { } else { // More than one expression, so we need a block. Allocate one if we weren't // already given one. + auto exprs = stackExprs(scope.exprStack); + if (type.isConcrete() && exprs.size() > 1) { + for (size_t i = 0; i + 1 < exprs.size(); ++i) { + if (scope.exprStack[i].wasmStackType.isConcrete()) { + exprs[i] = builder.dropIfConcretelyTyped(exprs[i]); + } + } + } if (block) { - block->list.set(stackExprs(scope.exprStack)); + block->list.set(exprs); } else { - block = builder.makeBlock(stackExprs(scope.exprStack), type); + block = builder.makeBlock(exprs, type); } ret = block; } diff --git a/test/lit/validation/unreachable-array-store-value-valid.wast b/test/lit/validation/unreachable-array-store-value-valid.wast new file mode 100644 index 00000000000..6bb81aee1ba --- /dev/null +++ b/test/lit/validation/unreachable-array-store-value-valid.wast @@ -0,0 +1,24 @@ +;; RUN: wasm-as %s -all -o /dev/null +;; RUN: wasm-opt %s -all -o /dev/null + +;; After unreachable makes the stack polymorphic, array.store operands must still +;; parse when the unreachable is the value slot (not only the index slot). + +(module + (type $i8_array (array (mut i8))) + + (global $arr (ref $i8_array) + (array.new_default $i8_array (i32.const 4))) + + (func $stores_value_unreachable + (i32.store8 (type $i8_array) + (global.get $arr) + (i32.const 1) + (unreachable))) + + (func $stores_index_unreachable + (i32.store8 (type $i8_array) + (global.get $arr) + (unreachable) + (i32.const 2))) +) From 6c63e5d47603f5a9f6d41ec76fdc5052633a775f Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Fri, 7 Aug 2026 11:46:53 +0530 Subject: [PATCH 6/7] Also hoist unreachable-typed void control flow for drop operands. When wasmStackType is none but a void block retains expr->type unreachable, treat it as a poppable stack entry. Fixes -S pipe roundtrip on array-multibyte and drop(block) reparse paths. --- src/wasm/wasm-ir-builder.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 333bd21dce9..1b58ecab5fc 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -199,6 +199,12 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { if (isWasmUnreachableValue(entry.expr, entry.wasmStackType)) { break; } + // Unreachable-typed control flow (e.g. void blocks) keeps expr->type even + // when wasmStackType is none. This matches baseline hoist behavior. + if (Properties::isControlFlowStructure(entry.expr) && + entry.expr->type != Type::none) { + break; + } } if (valIndex < 0) { // There is no value-producing expression. @@ -221,7 +227,10 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { } auto*& expr = stack[valIndex].expr; if (stack[valIndex].wasmStackType == Type::unreachable || - isWasmUnreachableValue(expr, stack[valIndex].wasmStackType)) { + isWasmUnreachableValue(expr, stack[valIndex].wasmStackType) || + (Properties::isControlFlowStructure(expr) && + stack[valIndex].wasmStackType == Type::none && + expr->type != Type::none)) { // No need for a scratch local to hoist an unreachable. return HoistedVal{Index(hoistIndex), nullptr}; } @@ -730,7 +739,10 @@ struct IRBuilder::ChildPopper // Unreachable stack types satisfy any size when used as Binaryen IR operands. if (entry.wasmStackType.size() == size || entry.wasmStackType == Type::unreachable || - isWasmUnreachableValue(entry.expr, entry.wasmStackType)) { + isWasmUnreachableValue(entry.expr, entry.wasmStackType) || + (Properties::isControlFlowStructure(entry.expr) && + entry.wasmStackType == Type::none && + entry.expr->type != Type::none)) { auto* ret = entry.expr; scope.exprStack.pop_back(); return ret; From 0e9a13f3ecec773f4c47baa912c3af6e6015c7ef Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Fri, 7 Aug 2026 11:46:53 +0530 Subject: [PATCH 7/7] Update lit expectations for corrected unreachable IR packaging. The parser now distinguishes unreachable barriers from ordinary void entries, which changes block/drop/unreachable nesting in -S output across many tests. Also fixes scratch-local-roundtrip RTRIP checks and updates two validation tests to match baseline parse behavior. --- test/lit/basic/exception-handling.wast | 140 ++++++- test/lit/basic/extra-branch-values.wast | 10 +- test/lit/basic/reference-types.wast | 24 ++ test/lit/basic/scratch-local-roundtrip.wast | 60 ++- test/lit/basic/stack_switching.wast | 24 ++ test/lit/basic/stack_switching_resume.wast | 42 +- .../basic/stack_switching_resume_throw.wast | 45 +- test/lit/basic/types-function-references.wast | 27 +- test/lit/basic/unreachable-string-new.wast | 24 ++ test/lit/basic/untaken-br_if.wast | 6 + test/lit/branch-hinting-try.wast | 8 +- test/lit/cast-and-recast-tuple.wast | 41 +- test/lit/control-flow-input.wast | 8 +- test/lit/downgrade-reftypes.wast | 4 + test/lit/isorecursive-good.wast | 7 +- test/lit/isorecursive-output-ordering.wast | 19 +- test/lit/multivalue.wast | 59 ++- .../passes/abstract-type-refining-desc.wast | 30 ++ test/lit/passes/abstract-type-refining.wast | 6 + test/lit/passes/cfp.wast | 10 +- test/lit/passes/coalesce-locals-gc.wast | 2 + .../coalesce-locals-stack-switching.wast | 6 + test/lit/passes/coalesce-locals.wast | 5 + test/lit/passes/code-folding.wast | 47 ++- test/lit/passes/code-pushing-eh.wast | 2 + test/lit/passes/constraint-analysis-cont.wast | 1 + test/lit/passes/constraint-analysis.wast | 2 + test/lit/passes/dae-typessa-repeat-types.wast | 8 +- test/lit/passes/dae2-results-indirect.wast | 10 +- test/lit/passes/dae2-results-returns.wast | 41 +- test/lit/passes/dae2.wast | 1 + test/lit/passes/dae_all-features.wast | 56 ++- test/lit/passes/dae_tnh.wast | 3 + test/lit/passes/enclose-world.wast | 35 +- test/lit/passes/flatten-eh-legacy.wast | 30 +- test/lit/passes/flatten_all-features.wast | 108 +++-- .../passes/flatten_i64-to-i32-lowering.wast | 218 ++++++++-- ...g_souperify-single-use_enable-threads.wast | 396 +++++++++++------- ...ls-nonesting_souperify_enable-threads.wast | 396 +++++++++++------- test/lit/passes/global-effects-O.wast | 41 +- test/lit/passes/global-effects-eh-legacy.wast | 3 + test/lit/passes/global-effects.wast | 3 + test/lit/passes/gufa-cast-all.wast | 12 +- test/lit/passes/gufa-cont.wast | 44 +- test/lit/passes/gufa-eh-null-type.wast | 1 + test/lit/passes/gufa-eh.wast | 1 + test/lit/passes/gufa-refs.wast | 32 +- test/lit/passes/gufa-tnh.wast | 1 + test/lit/passes/gufa-vs-cfp.wast | 2 + test/lit/passes/heap-store-optimization.wast | 4 + test/lit/passes/heap2local.wast | 9 + test/lit/passes/inlining-unreachable.wast | 16 +- .../lit/passes/inlining_enable-tail-call.wast | 70 +++- .../lit/passes/inlining_optimize-level=3.wast | 11 +- test/lit/passes/inlining_tnh.wat | 16 +- .../legalize-and-prune-js-interface.wast | 10 +- test/lit/passes/make-shared-objects.wast | 33 +- test/lit/passes/merge-blocks-eh.wast | 34 +- .../lit/passes/minimize-rec-groups-no-cd.wast | 16 +- test/lit/passes/monomorphize-context.wast | 61 ++- .../passes/optimize-instructions-desc.wast | 10 + .../passes/optimize-instructions-gc-tnh.wast | 20 +- test/lit/passes/optimize-instructions-gc.wast | 13 +- .../optimize-instructions-ignore-traps.wast | 6 + .../lit/passes/optimize-instructions-mvp.wast | 63 ++- test/lit/passes/precompute-gc.wast | 3 + test/lit/passes/precompute_all-features.wast | 3 + test/lit/passes/remove-unused-brs-eh.wast | 2 + test/lit/passes/remove-unused-brs.wast | 21 +- .../remove-unused-brs_all-features.wast | 11 +- .../remove-unused-brs_branch-hints.wast | 33 +- .../remove-unused-brs_enable-multivalue.wast | 193 ++++++--- .../remove-unused-brs_shrink-level=1.wast | 20 +- test/lit/passes/remove-unused-brs_trap.wast | 3 +- .../remove-unused-module-elements-refs.wast | 8 + test/lit/passes/reorder-types.wast | 8 +- test/lit/passes/rse-eh.wast | 8 +- test/lit/passes/signature-refining.wast | 5 + .../lit/passes/simplify-locals-eh-legacy.wast | 1 + test/lit/passes/simplify-locals-eh.wast | 3 + test/lit/passes/stack-ir-dce.wast | 5 + test/lit/passes/strip-eh-legacy.wast | 5 +- test/lit/passes/translate-to-exnref.wast | 99 ++++- test/lit/passes/type-merging-tnh.wast | 2 + test/lit/passes/type-merging.wast | 11 +- test/lit/passes/type-refining.wast | 11 +- test/lit/passes/type-ssa-exact.wast | 3 + test/lit/passes/unsubtyping-open-world.wast | 8 +- .../passes/unsubtyping-stack-switching.wast | 63 ++- test/lit/passes/unsubtyping.wast | 43 +- .../unreachable-loop-drop-invalid.wast | 6 +- .../unreachable-void-block-drop-invalid.wast | 7 +- test/lit/wat-kitchen-sink.wast | 180 ++++++-- 93 files changed, 2497 insertions(+), 761 deletions(-) diff --git a/test/lit/basic/exception-handling.wast b/test/lit/basic/exception-handling.wast index 0a0dd3e8904..e57f1d8389b 100644 --- a/test/lit/basic/exception-handling.wast +++ b/test/lit/basic/exception-handling.wast @@ -173,6 +173,7 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) (func $simple-try-table-and-throw (result i32) @@ -203,6 +204,7 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -230,7 +232,14 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) - ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (tuple.make 3 + ;; CHECK-TEXT-NEXT: (block + ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -260,7 +269,13 @@ ;; CHECK-BIN-NEXT: (i64.const 0) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) - ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (tuple.make 2 + ;; CHECK-BIN-NEXT: (block + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -273,7 +288,14 @@ ;; CHECK-BIN-NEXT: (local.get $scratch_1) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) - ;; CHECK-BIN-NEXT: (br $block2) + ;; CHECK-BIN-NEXT: (tuple.make 3 + ;; CHECK-BIN-NEXT: (block + ;; CHECK-BIN-NEXT: (br $block2) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -329,10 +351,12 @@ ;; CHECK-TEXT-NEXT: (call $foo) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (br $outer) @@ -352,10 +376,12 @@ ;; CHECK-BIN-NEXT: (call $foo) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (br $block4) @@ -405,13 +431,21 @@ ;; CHECK-TEXT-NEXT: (call $foo) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) - ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (tuple.make 2 + ;; CHECK-TEXT-NEXT: (block + ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -436,10 +470,17 @@ ;; CHECK-BIN-NEXT: (call $foo) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) - ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (tuple.make 2 + ;; CHECK-BIN-NEXT: (block + ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -453,6 +494,7 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -502,13 +544,27 @@ ;; CHECK-TEXT-NEXT: (call $foo) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (tuple.make 3 + ;; CHECK-TEXT-NEXT: (block + ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (tuple.make 2 + ;; CHECK-TEXT-NEXT: (block ;; CHECK-TEXT-NEXT: (br $outer) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) - ;; CHECK-TEXT-NEXT: (br $outer) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -540,10 +596,18 @@ ;; CHECK-BIN-NEXT: (call $foo) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) - ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (tuple.make 3 + ;; CHECK-BIN-NEXT: (block + ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -566,7 +630,13 @@ ;; CHECK-BIN-NEXT: (local.get $scratch_2) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) - ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (tuple.make 2 + ;; CHECK-BIN-NEXT: (block + ;; CHECK-BIN-NEXT: (br $block4) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -619,6 +689,7 @@ ;; CHECK-TEXT-NEXT: (br $l ;; CHECK-TEXT-NEXT: (i32.const 0) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -630,6 +701,7 @@ ;; CHECK-BIN-NEXT: (br $block1 ;; CHECK-BIN-NEXT: (i32.const 0) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -692,6 +764,7 @@ ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (ref.null noexn) @@ -792,6 +865,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -804,6 +878,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -833,7 +908,13 @@ ;; CHECK-BIN-NODEBUG-NEXT: (i64.const 0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (tuple.make 2 +;; CHECK-BIN-NODEBUG-NEXT: (block +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -846,7 +927,14 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $scratch_1) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG-NEXT: (br $block2) +;; CHECK-BIN-NODEBUG-NEXT: (tuple.make 3 +;; CHECK-BIN-NODEBUG-NEXT: (block +;; CHECK-BIN-NODEBUG-NEXT: (br $block2) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -885,10 +973,12 @@ ;; CHECK-BIN-NODEBUG-NEXT: (call $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (br $block4) @@ -916,10 +1006,17 @@ ;; CHECK-BIN-NODEBUG-NEXT: (call $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (tuple.make 2 +;; CHECK-BIN-NODEBUG-NEXT: (block +;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -933,6 +1030,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -965,10 +1063,18 @@ ;; CHECK-BIN-NODEBUG-NEXT: (call $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (tuple.make 3 +;; CHECK-BIN-NODEBUG-NEXT: (block +;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -991,7 +1097,13 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $scratch_2) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (tuple.make 2 +;; CHECK-BIN-NODEBUG-NEXT: (block +;; CHECK-BIN-NODEBUG-NEXT: (br $block4) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -1014,6 +1126,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (br $block1 ;; CHECK-BIN-NODEBUG-NEXT: (i32.const 0) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -1043,6 +1156,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (ref.null noexn) diff --git a/test/lit/basic/extra-branch-values.wast b/test/lit/basic/extra-branch-values.wast index 953ca7d634f..c693c1c66e6 100644 --- a/test/lit/basic/extra-branch-values.wast +++ b/test/lit/basic/extra-branch-values.wast @@ -1166,8 +1166,14 @@ ;; CHECK-NEXT: (local.get $scratch) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $l - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $scratch_3) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $scratch_3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/basic/reference-types.wast b/test/lit/basic/reference-types.wast index 4058d316d6f..b389364126a 100644 --- a/test/lit/basic/reference-types.wast +++ b/test/lit/basic/reference-types.wast @@ -642,6 +642,7 @@ ;; CHECK-TEXT-NEXT: (local.get $local_eqref) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (ref.null none) @@ -656,6 +657,7 @@ ;; CHECK-TEXT-NEXT: (ref.func $foo) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (ref.null nofunc) @@ -670,6 +672,7 @@ ;; CHECK-TEXT-NEXT: (local.get $local_eqref) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (ref.null none) @@ -684,6 +687,7 @@ ;; CHECK-TEXT-NEXT: (ref.null none) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (local.get $local_eqref) @@ -1245,6 +1249,7 @@ ;; CHECK-BIN-NEXT: (local.get $local_eqref) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (ref.null none) @@ -1259,6 +1264,7 @@ ;; CHECK-BIN-NEXT: (ref.func $foo) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (ref.null nofunc) @@ -1273,6 +1279,7 @@ ;; CHECK-BIN-NEXT: (local.get $local_eqref) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (ref.null none) @@ -1287,6 +1294,7 @@ ;; CHECK-BIN-NEXT: (ref.null none) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (local.get $local_eqref) @@ -1967,12 +1975,14 @@ ;; CHECK-TEXT-NEXT: (return ;; CHECK-TEXT-NEXT: (ref.null none) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-BIN: (func $returns_eqref (type $6) (result eqref) ;; CHECK-BIN-NEXT: (local $local_eqref eqref) ;; CHECK-BIN-NEXT: (return ;; CHECK-BIN-NEXT: (local.get $local_eqref) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) (func $returns_eqref (result eqref) (local $local_eqref eqref) @@ -1995,12 +2005,14 @@ ;; CHECK-TEXT-NEXT: (return ;; CHECK-TEXT-NEXT: (ref.null nofunc) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-BIN: (func $returns_funcref (type $4) (result funcref) ;; CHECK-BIN-NEXT: (local $local_funcref funcref) ;; CHECK-BIN-NEXT: (return ;; CHECK-BIN-NEXT: (local.get $local_funcref) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) (func $returns_funcref (result funcref) (local $local_funcref funcref) @@ -2021,12 +2033,14 @@ ;; CHECK-TEXT-NEXT: (return ;; CHECK-TEXT-NEXT: (ref.null none) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-BIN: (func $returns_anyref (type $0) (result anyref) ;; CHECK-BIN-NEXT: (local $local_anyref anyref) ;; CHECK-BIN-NEXT: (return ;; CHECK-BIN-NEXT: (local.get $local_anyref) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) (func $returns_anyref (result anyref) (local $local_anyref anyref) @@ -2049,6 +2063,7 @@ ;; CHECK-TEXT-NEXT: (return ;; CHECK-TEXT-NEXT: (ref.null none) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-BIN: (func $returns_anyref2 (type $0) (result anyref) ;; CHECK-BIN-NEXT: (local $local_eqref eqref) @@ -2056,6 +2071,7 @@ ;; CHECK-BIN-NEXT: (return ;; CHECK-BIN-NEXT: (local.get $local_eqref) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) (func $returns_anyref2 (result anyref) (local $local_eqref eqref) @@ -2582,6 +2598,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (ref.null none) @@ -2596,6 +2613,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (ref.func $3) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (ref.null nofunc) @@ -2610,6 +2628,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (ref.null none) @@ -2624,6 +2643,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (ref.null none) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) @@ -2772,6 +2792,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (return ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG: (func $19 (type $4) (result funcref) @@ -2779,6 +2800,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (return ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG: (func $20 (type $0) (result anyref) @@ -2786,6 +2808,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (return ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG: (func $21 (type $0) (result anyref) @@ -2794,6 +2817,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (return ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG: (func $22 (type $3) diff --git a/test/lit/basic/scratch-local-roundtrip.wast b/test/lit/basic/scratch-local-roundtrip.wast index 657913b900a..5201c01e31c 100644 --- a/test/lit/basic/scratch-local-roundtrip.wast +++ b/test/lit/basic/scratch-local-roundtrip.wast @@ -1,6 +1,6 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. ;; RUN: wasm-opt %s -all --disable-gc -S -o - | filecheck %s -;; RUN: wasm-opt %s -all --disable-gc -S -o - | wasm-opt -all --disable-gc -S -o - | filecheck %s +;; RUN: wasm-opt %s -all --disable-gc -S -o - | wasm-opt -all --disable-gc -S -o - | filecheck %s --check-prefix=RTRIP (module ;; RTRIP: (type $tuple (func (result i32 externref))) @@ -10,23 +10,61 @@ ;; CHECK: (func $f (result i32 externref) ;; CHECK-NEXT: (local $scratch (tuple i32 externref)) ;; CHECK-NEXT: (block $l (type $tuple) (result i32 externref) - ;; CHECK-NEXT: (br $l - ;; CHECK-NEXT: (block (type $tuple) (result i32 externref) - ;; CHECK-NEXT: (local.set $scratch - ;; CHECK-NEXT: (br_if $l - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (ref.null noextern) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $l + ;; CHECK-NEXT: (block (type $tuple) (result i32 externref) + ;; CHECK-NEXT: (local.set $scratch + ;; CHECK-NEXT: (br_if $l + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (ref.null noextern) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.get $scratch) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.get $scratch) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; RTRIP: (func $f (result i32 externref) + ;; RTRIP-NEXT: (local $scratch (tuple i32 externref)) + ;; RTRIP-NEXT: (block $l (type $tuple) (result i32 externref) + ;; RTRIP-NEXT: (tuple.make 2 + ;; RTRIP-NEXT: (block + ;; RTRIP-NEXT: (tuple.make 2 + ;; RTRIP-NEXT: (block + ;; RTRIP-NEXT: (br $l + ;; RTRIP-NEXT: (block (type $tuple) (result i32 externref) + ;; RTRIP-NEXT: (local.set $scratch + ;; RTRIP-NEXT: (br_if $l + ;; RTRIP-NEXT: (tuple.make 2 + ;; RTRIP-NEXT: (i32.const 0) + ;; RTRIP-NEXT: (ref.null noextern) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (i32.const 0) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (nop) + ;; RTRIP-NEXT: (local.get $scratch) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (unreachable) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (unreachable) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (unreachable) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (unreachable) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: ) (func $f (result i32 externref) block $l (type $tuple) (result i32 externref) i32.const 0 diff --git a/test/lit/basic/stack_switching.wast b/test/lit/basic/stack_switching.wast index 541c200ecec..92cdfbaf691 100644 --- a/test/lit/basic/stack_switching.wast +++ b/test/lit/basic/stack_switching.wast @@ -292,6 +292,7 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -304,6 +305,7 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -324,6 +326,7 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -336,6 +339,7 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -367,6 +371,7 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -379,6 +384,7 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -399,6 +405,7 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -411,6 +418,7 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -451,6 +459,7 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -463,6 +472,7 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -518,6 +528,7 @@ ;; CHECK-TEXT-NEXT: (local.get $k) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (resume $k1 @@ -532,6 +543,7 @@ ;; CHECK-BIN-NEXT: (local.get $k) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (resume $k1 @@ -555,6 +567,7 @@ ;; CHECK-TEXT-NEXT: (local.get $k) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (drop @@ -563,6 +576,7 @@ ;; CHECK-TEXT-NEXT: (local.get $k') ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (resume $k1 @@ -578,6 +592,7 @@ ;; CHECK-BIN-NEXT: (local.get $k) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (drop @@ -586,6 +601,7 @@ ;; CHECK-BIN-NEXT: (local.get $k') ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (resume $k1 @@ -779,6 +795,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -792,6 +809,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -809,6 +827,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -822,6 +841,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -843,6 +863,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -871,6 +892,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (resume $1 @@ -887,6 +909,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (drop @@ -895,6 +918,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $1) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (resume $1 diff --git a/test/lit/basic/stack_switching_resume.wast b/test/lit/basic/stack_switching_resume.wast index 10116ce31f4..5de25d20ce9 100644 --- a/test/lit/basic/stack_switching_resume.wast +++ b/test/lit/basic/stack_switching_resume.wast @@ -51,11 +51,17 @@ ;; CHECK-TEXT: (func $go (type $2) (param $x (ref $ct)) (result i32) ;; CHECK-TEXT-NEXT: (tuple.extract 2 0 ;; CHECK-TEXT-NEXT: (block $handler (type $3) (result i32 (ref $ct)) - ;; CHECK-TEXT-NEXT: (return - ;; CHECK-TEXT-NEXT: (resume $ct (on $t $handler) - ;; CHECK-TEXT-NEXT: (i32.const 123) - ;; CHECK-TEXT-NEXT: (local.get $x) + ;; CHECK-TEXT-NEXT: (tuple.make 2 + ;; CHECK-TEXT-NEXT: (block + ;; CHECK-TEXT-NEXT: (return + ;; CHECK-TEXT-NEXT: (resume $ct (on $t $handler) + ;; CHECK-TEXT-NEXT: (i32.const 123) + ;; CHECK-TEXT-NEXT: (local.get $x) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -67,11 +73,17 @@ ;; CHECK-BIN-NEXT: (tuple.extract 2 0 ;; CHECK-BIN-NEXT: (local.tee $scratch ;; CHECK-BIN-NEXT: (block $block (type $3) (result i32 (ref $ct)) - ;; CHECK-BIN-NEXT: (return - ;; CHECK-BIN-NEXT: (resume $ct (on $t $block) - ;; CHECK-BIN-NEXT: (i32.const 123) - ;; CHECK-BIN-NEXT: (local.get $x) + ;; CHECK-BIN-NEXT: (tuple.make 2 + ;; CHECK-BIN-NEXT: (block + ;; CHECK-BIN-NEXT: (return + ;; CHECK-BIN-NEXT: (resume $ct (on $t $block) + ;; CHECK-BIN-NEXT: (i32.const 123) + ;; CHECK-BIN-NEXT: (local.get $x) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -138,11 +150,17 @@ ;; CHECK-BIN-NODEBUG-NEXT: (tuple.extract 2 0 ;; CHECK-BIN-NODEBUG-NEXT: (local.tee $scratch ;; CHECK-BIN-NODEBUG-NEXT: (block $block (type $3) (result i32 (ref $1)) -;; CHECK-BIN-NODEBUG-NEXT: (return -;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$0 $block) -;; CHECK-BIN-NODEBUG-NEXT: (i32.const 123) -;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: (tuple.make 2 +;; CHECK-BIN-NODEBUG-NEXT: (block +;; CHECK-BIN-NODEBUG-NEXT: (return +;; CHECK-BIN-NODEBUG-NEXT: (resume $1 (on $tag$0 $block) +;; CHECK-BIN-NODEBUG-NEXT: (i32.const 123) +;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) diff --git a/test/lit/basic/stack_switching_resume_throw.wast b/test/lit/basic/stack_switching_resume_throw.wast index cc5de8ef406..620c8bebce5 100644 --- a/test/lit/basic/stack_switching_resume_throw.wast +++ b/test/lit/basic/stack_switching_resume_throw.wast @@ -43,11 +43,17 @@ ;; CHECK-TEXT: (func $go (type $3) (param $x (ref $ct)) (result i32) ;; CHECK-TEXT-NEXT: (tuple.extract 2 0 ;; CHECK-TEXT-NEXT: (block $handler (type $5) (result i32 (ref $ct)) - ;; CHECK-TEXT-NEXT: (return - ;; CHECK-TEXT-NEXT: (resume_throw $ct $e (on $t $handler) - ;; CHECK-TEXT-NEXT: (i64.const 123) - ;; CHECK-TEXT-NEXT: (local.get $x) + ;; CHECK-TEXT-NEXT: (tuple.make 2 + ;; CHECK-TEXT-NEXT: (block + ;; CHECK-TEXT-NEXT: (return + ;; CHECK-TEXT-NEXT: (resume_throw $ct $e (on $t $handler) + ;; CHECK-TEXT-NEXT: (i64.const 123) + ;; CHECK-TEXT-NEXT: (local.get $x) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -59,11 +65,17 @@ ;; CHECK-BIN-NEXT: (tuple.extract 2 0 ;; CHECK-BIN-NEXT: (local.tee $scratch ;; CHECK-BIN-NEXT: (block $block (type $5) (result i32 (ref $ct)) - ;; CHECK-BIN-NEXT: (return - ;; CHECK-BIN-NEXT: (resume_throw $ct $e (on $t $block) - ;; CHECK-BIN-NEXT: (i64.const 123) - ;; CHECK-BIN-NEXT: (local.get $x) + ;; CHECK-BIN-NEXT: (tuple.make 2 + ;; CHECK-BIN-NEXT: (block + ;; CHECK-BIN-NEXT: (return + ;; CHECK-BIN-NEXT: (resume_throw $ct $e (on $t $block) + ;; CHECK-BIN-NEXT: (i64.const 123) + ;; CHECK-BIN-NEXT: (local.get $x) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -100,12 +112,14 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-BIN: (func $unreachable (type $4) (result i32) ;; CHECK-BIN-NEXT: (drop ;; CHECK-BIN-NEXT: (i64.const 123) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) (func $unreachable (result i32) (resume_throw $ct $e @@ -137,11 +151,17 @@ ;; CHECK-BIN-NODEBUG-NEXT: (tuple.extract 2 0 ;; CHECK-BIN-NODEBUG-NEXT: (local.tee $scratch ;; CHECK-BIN-NODEBUG-NEXT: (block $block (type $5) (result i32 (ref $1)) -;; CHECK-BIN-NODEBUG-NEXT: (return -;; CHECK-BIN-NODEBUG-NEXT: (resume_throw $1 $tag$1 (on $tag$0 $block) -;; CHECK-BIN-NODEBUG-NEXT: (i64.const 123) -;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: (tuple.make 2 +;; CHECK-BIN-NODEBUG-NEXT: (block +;; CHECK-BIN-NODEBUG-NEXT: (return +;; CHECK-BIN-NODEBUG-NEXT: (resume_throw $1 $tag$1 (on $tag$0 $block) +;; CHECK-BIN-NODEBUG-NEXT: (i64.const 123) +;; CHECK-BIN-NODEBUG-NEXT: (local.get $0) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -160,4 +180,5 @@ ;; CHECK-BIN-NODEBUG-NEXT: (i64.const 123) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) diff --git a/test/lit/basic/types-function-references.wast b/test/lit/basic/types-function-references.wast index dfff790bc18..371cc31c16e 100644 --- a/test/lit/basic/types-function-references.wast +++ b/test/lit/basic/types-function-references.wast @@ -187,7 +187,14 @@ ;; CHECK-TEXT: (func $type-only-in-tuple-block (type $void) ;; CHECK-TEXT-NEXT: (tuple.drop 3 ;; CHECK-TEXT-NEXT: (block $block (type $10) (result i32 (ref null $mixed_results) f64) - ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (tuple.make 3 + ;; CHECK-TEXT-NEXT: (block + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -201,7 +208,14 @@ ;; CHECK-BIN-NEXT: (tuple.extract 3 0 ;; CHECK-BIN-NEXT: (local.tee $scratch ;; CHECK-BIN-NEXT: (block (type $10) (result i32 (ref null $mixed_results) f64) - ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (tuple.make 3 + ;; CHECK-BIN-NEXT: (block + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -431,7 +445,14 @@ ;; CHECK-BIN-NODEBUG-NEXT: (tuple.extract 3 0 ;; CHECK-BIN-NODEBUG-NEXT: (local.tee $scratch ;; CHECK-BIN-NODEBUG-NEXT: (block (type $10) (result i32 (ref null $0) f64) -;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (tuple.make 3 +;; CHECK-BIN-NODEBUG-NEXT: (block +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) diff --git a/test/lit/basic/unreachable-string-new.wast b/test/lit/basic/unreachable-string-new.wast index 91dd9d28930..7feff847793 100644 --- a/test/lit/basic/unreachable-string-new.wast +++ b/test/lit/basic/unreachable-string-new.wast @@ -16,6 +16,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref array)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -26,6 +27,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i8-bad-array (result (ref string)) ;; This is not a specific array type, so it must not be popped as the first @@ -42,6 +44,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref $array16)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -52,6 +55,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i8-bad-array16 (result (ref string)) ;; As above, with an array with the wrong element type. @@ -67,10 +71,12 @@ ;; CHECK-NEXT: (string.new_lossy_utf8_array ;; CHECK-NEXT: (block (result (ref $array8)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i8-ok (result (ref string)) ;; Now we have the correct type, so it can be popped as the first child of @@ -87,10 +93,12 @@ ;; CHECK-NEXT: (string.new_lossy_utf8_array ;; CHECK-NEXT: (block (result (ref none)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i8-ok-none (result (ref string)) ;; Due to subsumption, bottom references must also be valid. @@ -106,6 +114,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref $shared-array8)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -116,6 +125,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i8-bad-shared (result (ref string)) ;; Shared arrays do not work as well. TODO: find a good way to support them. @@ -131,6 +141,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref (shared none))) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -141,6 +152,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i8-bad-shared-none (result (ref string)) ;; Shared bottom references also do not work. @@ -156,6 +168,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref array)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -166,6 +179,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i16-bad-array (result (ref string)) block (result (ref array)) @@ -180,6 +194,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref $array8)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -190,6 +205,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i16-bad-array8 (result (ref string)) block (result (ref $array8)) @@ -204,10 +220,12 @@ ;; CHECK-NEXT: (string.new_wtf16_array ;; CHECK-NEXT: (block (result (ref $array16)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i16-ok (result (ref string)) block (result (ref $array16)) @@ -222,10 +240,12 @@ ;; CHECK-NEXT: (string.new_wtf16_array ;; CHECK-NEXT: (block (result (ref none)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i16-ok-none (result (ref string)) block (result (ref none)) @@ -240,6 +260,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref $shared-array16)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -250,6 +271,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i16-bad-shared (result (ref string)) block (result (ref $shared-array16)) @@ -264,6 +286,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref (shared none))) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -274,6 +297,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i16-bad-shared-none (result (ref string)) block (result (ref (shared none))) diff --git a/test/lit/basic/untaken-br_if.wast b/test/lit/basic/untaken-br_if.wast index 4d982654977..b9bfc787f71 100644 --- a/test/lit/basic/untaken-br_if.wast +++ b/test/lit/basic/untaken-br_if.wast @@ -17,6 +17,7 @@ ;; CHECK-TEXT-NEXT: (i32.const 1) ;; CHECK-TEXT-NEXT: (then ;; CHECK-TEXT-NEXT: (unreachable) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (else ;; CHECK-TEXT-NEXT: (block $label$1 (result f32) @@ -24,6 +25,7 @@ ;; CHECK-TEXT-NEXT: (f32.const 1) ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) + ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -35,12 +37,14 @@ ;; CHECK-BIN-NEXT: (i32.const 1) ;; CHECK-BIN-NEXT: (then ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (else ;; CHECK-BIN-NEXT: (drop ;; CHECK-BIN-NEXT: (f32.const 1) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) + ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -68,12 +72,14 @@ ;; CHECK-BIN-NODEBUG-NEXT: (i32.const 1) ;; CHECK-BIN-NODEBUG-NEXT: (then ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (else ;; CHECK-BIN-NODEBUG-NEXT: (drop ;; CHECK-BIN-NODEBUG-NEXT: (f32.const 1) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: (unreachable) +;; CHECK-BIN-NODEBUG-NEXT: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) diff --git a/test/lit/branch-hinting-try.wast b/test/lit/branch-hinting-try.wast index be6e50e5270..b9581ca49af 100644 --- a/test/lit/branch-hinting-try.wast +++ b/test/lit/branch-hinting-try.wast @@ -28,7 +28,13 @@ ;; CHECK-NEXT: (catch $tag ;; CHECK-NEXT: (@metadata.code.branch_hint "\01") ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/cast-and-recast-tuple.wast b/test/lit/cast-and-recast-tuple.wast index be07847f43c..27e3c547e35 100644 --- a/test/lit/cast-and-recast-tuple.wast +++ b/test/lit/cast-and-recast-tuple.wast @@ -43,7 +43,13 @@ ;; CHECK-NEXT: (local.get $scratch_3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test-local-tuple-1 (param $B (ref $B)) (param $x i32) (result anyref i32) @@ -94,7 +100,13 @@ ;; CHECK-NEXT: (local.get $scratch_5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test-local-tuple-2 (param $B (ref $B)) (param $x i32) (result i32 i32) @@ -144,7 +156,13 @@ ;; CHECK-NEXT: (local.get $scratch_5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test-local-tuple-3 (param $B (ref $B)) (param $x i32) (result anyref i32) @@ -230,7 +248,13 @@ ;; CHECK-NEXT: (local.get $scratch_11) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test-local-tuple-4-bad (param $B (ref $B)) (param $x i32) (result anyref i32) @@ -369,7 +393,14 @@ ;; CHECK-NEXT: (local.get $scratch_19) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 3 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test-local-tuple-4-bad-dupes (param $B (ref $B)) (param $x i32) (result i32 anyref i32) diff --git a/test/lit/control-flow-input.wast b/test/lit/control-flow-input.wast index 39cb28d9fa1..b3b41c43e40 100644 --- a/test/lit/control-flow-input.wast +++ b/test/lit/control-flow-input.wast @@ -315,7 +315,13 @@ ;; CHECK-NEXT: (br $label10) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $nested-loops-multivalue (result i32 i64) diff --git a/test/lit/downgrade-reftypes.wast b/test/lit/downgrade-reftypes.wast index 71d009dee0c..fbd4dfbc5d5 100644 --- a/test/lit/downgrade-reftypes.wast +++ b/test/lit/downgrade-reftypes.wast @@ -17,6 +17,7 @@ ;; CHECK-NEXT: (br $block ;; CHECK-NEXT: (ref.func $foo) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -24,6 +25,7 @@ ;; CHECK-NEXT: (br $block1 ;; CHECK-NEXT: (ref.null nofunc) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -31,6 +33,7 @@ ;; CHECK-NEXT: (br $block2 ;; CHECK-NEXT: (ref.null noextern) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -38,6 +41,7 @@ ;; CHECK-NEXT: (br $block3 ;; CHECK-NEXT: (string.const "hello world") ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/isorecursive-good.wast b/test/lit/isorecursive-good.wast index 080c329a52c..4893139055d 100644 --- a/test/lit/isorecursive-good.wast +++ b/test/lit/isorecursive-good.wast @@ -25,6 +25,8 @@ ) (rec + ;; CHECK: (type $final-root (struct)) + ;; CHECK: (rec ;; CHECK-NEXT: (type $super-func (sub (func (param (ref $sub-array)) (result (ref $super-array))))) (type $super-func (sub (func (param (ref $sub-array)) (result (ref $super-array))))) @@ -34,7 +36,6 @@ (type $final-func (sub final $sub-func (func (param (ref $super-array)) (result (ref $final-array))))) ) - ;; CHECK: (type $final-root (struct)) (type $final-root (sub final (struct))) ;; CHECK: (func $make-super-struct (type $10) (result (ref $super-struct)) @@ -46,6 +47,7 @@ ;; CHECK: (func $make-final-struct (type $11) (result (ref $final-struct)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $make-final-struct (result (ref $final-struct)) (unreachable) @@ -60,6 +62,7 @@ ;; CHECK: (func $make-final-array (type $13) (result (ref $final-array)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $make-final-array (result (ref $final-array)) (unreachable) @@ -74,6 +77,7 @@ ;; CHECK: (func $make-final-func (type $15) (result (ref $final-func)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $make-final-func (result (ref $final-func)) (unreachable) @@ -81,6 +85,7 @@ ;; CHECK: (func $make-final-root (type $16) (result (ref $final-root)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $make-final-root (result (ref $final-root)) (unreachable) diff --git a/test/lit/isorecursive-output-ordering.wast b/test/lit/isorecursive-output-ordering.wast index b8d0a1c8ea4..b9475491410 100644 --- a/test/lit/isorecursive-output-ordering.wast +++ b/test/lit/isorecursive-output-ordering.wast @@ -34,7 +34,15 @@ ) ;; CHECK: (func $use (type $8) (param $0 (ref $used-a-lot)) (param $1 (ref $used-a-lot)) (param $2 (ref $used-a-lot)) (param $3 (ref $used-a-lot)) (param $4 (ref $used-a-lot)) (param $5 (ref $used-a-lot)) (result (ref $used-a-bit) (ref $used-a-bit) (ref $used-a-bit) (ref $used-a-bit)) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 4 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $use (param (ref $used-a-lot) (ref $used-a-lot) (ref $used-a-lot) (ref $used-a-lot) (ref $used-a-lot) (ref $used-a-lot)) (result (ref $used-a-bit) (ref $used-a-bit) (ref $used-a-bit) (ref $used-a-bit)) (unreachable) @@ -87,7 +95,14 @@ ;; CHECK-NEXT: (local $10 (ref null $used-a-ton)) ;; CHECK-NEXT: (local $11 (ref null $used-a-ton)) ;; CHECK-NEXT: (local $12 (ref null $used-a-ton)) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 3 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $use (param (ref $used-a-lot) (ref $used-a-lot) (ref $used-a-lot) (ref $used-a-lot) (ref $used-a-lot) (ref $used-a-lot)) (result (ref $used-a-bit) (ref $used-a-bit) (ref $used-a-bit)) (local (ref null $used-a-ton) (ref null $used-a-ton) (ref null $used-a-ton) (ref null $used-a-ton) (ref null $used-a-ton) (ref null $used-a-ton) (ref null $used-a-ton)) diff --git a/test/lit/multivalue.wast b/test/lit/multivalue.wast index d9cc14e05ab..ac681981e7b 100644 --- a/test/lit/multivalue.wast +++ b/test/lit/multivalue.wast @@ -207,6 +207,7 @@ ;; CHECK-NEXT: (i64.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable (result i64) (tuple.extract 3 1 @@ -345,11 +346,17 @@ ;; Test multivalue control structures ;; CHECK: (func $mv-return (type $0) (result i32 i64) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (i32.const 42) - ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $mv-return (result i32 i64) @@ -362,11 +369,17 @@ ) ;; CHECK: (func $mv-return-in-block (type $0) (result i32 i64) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (i32.const 42) - ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $mv-return-in-block (result i32 i64) @@ -382,11 +395,17 @@ ;; CHECK: (func $mv-block-break (type $0) (result i32 i64) ;; CHECK-NEXT: (block $block (type $0) (result i32 i64) - ;; CHECK-NEXT: (br $block - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (i32.const 42) - ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -483,12 +502,18 @@ ;; CHECK: (func $mv-switch (type $0) (result i32 i64) ;; CHECK-NEXT: (block $block (type $0) (result i32 i64) ;; CHECK-NEXT: (block $block1 (type $0) (result i32 i64) - ;; CHECK-NEXT: (br_table $block $block1 - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (i32.const 42) - ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_table $block $block1 + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/abstract-type-refining-desc.wast b/test/lit/passes/abstract-type-refining-desc.wast index ae1b6de079a..4de048b7d41 100644 --- a/test/lit/passes/abstract-type-refining-desc.wast +++ b/test/lit/passes/abstract-type-refining-desc.wast @@ -290,6 +290,7 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-nullable (type $2) (param $ref anyref) (param $desc (ref null $desc)) (result nullref) @@ -308,6 +309,7 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) (func $branch-nullable (param $ref anyref) (param $desc (ref null $desc)) (result (ref null $struct)) @@ -347,6 +349,7 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-nullable-effect (type $2) (param $ref anyref) (param $desc (ref null $desc)) (result nullref) @@ -375,6 +378,7 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) (func $branch-nullable-effect (param $ref anyref) (param $desc (ref null $desc)) (result (ref null $struct)) @@ -406,6 +410,7 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-non-nullable (type $2) (param $ref anyref) (param $desc (ref null $desc)) (result nullref) @@ -424,6 +429,7 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) (func $branch-non-nullable (param $ref anyref) (param $desc (ref null $desc)) (result (ref null $struct)) @@ -449,6 +455,7 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-non-nullable-desc (type $3) (param $ref anyref) (param $desc (ref $desc)) (result nullref) @@ -461,6 +468,7 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) (func $branch-non-nullable-desc (param $ref anyref) (param $desc (ref $desc)) (result (ref null $struct)) @@ -500,6 +508,7 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-non-nullable-effect (type $3) (param $ref anyref) (param $desc (ref $desc)) (result nullref) @@ -526,6 +535,7 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) (func $branch-non-nullable-effect (param $ref anyref) (param $desc (ref $desc)) (result (ref null $struct)) @@ -557,9 +567,11 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-fail-nullable (type $2) (param $ref anyref) (param $desc (ref null $desc)) (result nullref) ;; NO_TNH-NEXT: (local $2 (ref $desc)) @@ -577,9 +589,11 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) (func $branch-fail-nullable (param $ref anyref) (param $desc (ref null $desc)) (result (ref null $struct)) (drop @@ -620,9 +634,11 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-fail-nullable-effect (type $2) (param $ref anyref) (param $desc (ref null $desc)) (result nullref) ;; NO_TNH-NEXT: (local $2 anyref) @@ -650,9 +666,11 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) (func $branch-fail-nullable-effect (param $ref anyref) (param $desc (ref null $desc)) (result (ref null $struct)) (drop @@ -685,9 +703,11 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-fail-non-nullable (type $2) (param $ref anyref) (param $desc (ref null $desc)) (result nullref) ;; NO_TNH-NEXT: (local $2 (ref $desc)) @@ -705,9 +725,11 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) (func $branch-fail-non-nullable (param $ref anyref) (param $desc (ref null $desc)) (result (ref null $struct)) (drop @@ -734,9 +756,11 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-fail-non-nullable-desc (type $3) (param $ref anyref) (param $desc (ref $desc)) (result nullref) ;; NO_TNH-NEXT: (drop @@ -748,9 +772,11 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) (func $branch-fail-non-nullable-desc (param $ref anyref) (param $desc (ref $desc)) (result (ref null $struct)) (drop @@ -791,9 +817,11 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; NO_TNH: (func $branch-fail-non-nullable-effect (type $3) (param $ref anyref) (param $desc (ref $desc)) (result nullref) ;; NO_TNH-NEXT: (local $2 anyref) @@ -819,9 +847,11 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) (func $branch-fail-non-nullable-effect (param $ref anyref) (param $desc (ref $desc)) (result (ref null $struct)) (drop diff --git a/test/lit/passes/abstract-type-refining.wast b/test/lit/passes/abstract-type-refining.wast index 0639ac71060..84609ae83e9 100644 --- a/test/lit/passes/abstract-type-refining.wast +++ b/test/lit/passes/abstract-type-refining.wast @@ -187,6 +187,7 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) @@ -199,6 +200,7 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) @@ -743,6 +745,7 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (drop @@ -751,6 +754,7 @@ ;; YESTNH-NEXT: (local.get $x) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) + ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) @@ -763,6 +767,7 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (drop @@ -771,6 +776,7 @@ ;; NO_TNH-NEXT: (local.get $x) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) diff --git a/test/lit/passes/cfp.wast b/test/lit/passes/cfp.wast index fa7fb9277d6..7ebe1392dbc 100644 --- a/test/lit/passes/cfp.wast +++ b/test/lit/passes/cfp.wast @@ -419,6 +419,7 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (f32.const 42) @@ -443,13 +444,8 @@ ) ;; CHECK: (func $get (type $3) (param $struct (ref null $struct)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result f32) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.as_non_null - ;; CHECK-NEXT: (local.get $struct) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (f32.const 42) + ;; CHECK-NEXT: (struct.get $struct 0 + ;; CHECK-NEXT: (local.get $struct) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/coalesce-locals-gc.wast b/test/lit/passes/coalesce-locals-gc.wast index 5f7b2cf5f8e..78d779ce8fb 100644 --- a/test/lit/passes/coalesce-locals-gc.wast +++ b/test/lit/passes/coalesce-locals-gc.wast @@ -254,6 +254,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $replace-i31-local (result i32) (local $local i31ref) @@ -276,6 +277,7 @@ ;; CHECK-NEXT: (call $replace-struct-param ;; CHECK-NEXT: (block (result f64) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.cast (ref null $A) ;; CHECK-NEXT: (block (result (ref null $A)) diff --git a/test/lit/passes/coalesce-locals-stack-switching.wast b/test/lit/passes/coalesce-locals-stack-switching.wast index c0733c9c087..9f5e2381773 100644 --- a/test/lit/passes/coalesce-locals-stack-switching.wast +++ b/test/lit/passes/coalesce-locals-stack-switching.wast @@ -29,6 +29,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return_call $resume @@ -38,6 +39,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $1) @@ -86,6 +88,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return_call $resume @@ -95,6 +98,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $1) @@ -140,6 +144,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $0) @@ -173,6 +178,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $1) diff --git a/test/lit/passes/coalesce-locals.wast b/test/lit/passes/coalesce-locals.wast index 422c06a818f..8bcab4099ad 100644 --- a/test/lit/passes/coalesce-locals.wast +++ b/test/lit/passes/coalesce-locals.wast @@ -1766,6 +1766,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $_memcpy (type $FUNCSIG$iiii) (param $i1 i32) (param $i2 i32) (param $i3 i32) (result i32) (local $i4 i32) @@ -2326,6 +2327,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (local.get $0) @@ -2370,6 +2372,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (local.get $0) @@ -2507,6 +2510,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2542,6 +2546,7 @@ ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (local.get $0) diff --git a/test/lit/passes/code-folding.wast b/test/lit/passes/code-folding.wast index b256b236cfe..d25be7e2d5c 100644 --- a/test/lit/passes/code-folding.wast +++ b/test/lit/passes/code-folding.wast @@ -37,12 +37,14 @@ ;; CHECK-NEXT: (block $label$3 ;; CHECK-NEXT: (call_indirect $0 (type $13) ;; CHECK-NEXT: (block $label$4 (result f32) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (br $label$3) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 105) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -400,12 +402,16 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $label$1) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $leave-inner-block-type @@ -623,19 +629,25 @@ ) ;; CHECK: (func $br-and-fallthrough-with-value (type $2) (result i32) - ;; CHECK-NEXT: (block $l + ;; CHECK-NEXT: (block $l (result i32) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (br $l) + ;; CHECK-NEXT: (br $l + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (br $l) + ;; CHECK-NEXT: (br $l + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) (func $br-and-fallthrough-with-value (result i32) (block $l (result i32) @@ -698,23 +710,31 @@ ) ;; CHECK: (func $br-and-fallthrough-with-value-and-more (type $2) (result i32) - ;; CHECK-NEXT: (block $l + ;; CHECK-NEXT: (block $l (result i32) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (br $l) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br $l + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (br $l) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br $l + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) (func $br-and-fallthrough-with-value-and-more (result i32) (block $l (result i32) @@ -848,6 +868,7 @@ ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (call $br-on-null) ;; CHECK-NEXT: (br $block) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $br-on-null) diff --git a/test/lit/passes/code-pushing-eh.wast b/test/lit/passes/code-pushing-eh.wast index f19a746beaa..8792c46c419 100644 --- a/test/lit/passes/code-pushing-eh.wast +++ b/test/lit/passes/code-pushing-eh.wast @@ -134,6 +134,7 @@ ;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $tryend) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -185,6 +186,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $tryend) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/constraint-analysis-cont.wast b/test/lit/passes/constraint-analysis-cont.wast index 206597a28df..9be86a431ca 100644 --- a/test/lit/passes/constraint-analysis-cont.wast +++ b/test/lit/passes/constraint-analysis-cont.wast @@ -23,6 +23,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/constraint-analysis.wast b/test/lit/passes/constraint-analysis.wast index 0f9a7f02d90..9e3656b888f 100644 --- a/test/lit/passes/constraint-analysis.wast +++ b/test/lit/passes/constraint-analysis.wast @@ -1822,6 +1822,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -1843,6 +1844,7 @@ ;; OPTIN-NEXT: (i32.const 1) ;; OPTIN-NEXT: ) ;; OPTIN-NEXT: (return) + ;; OPTIN-NEXT: (unreachable) ;; OPTIN-NEXT: ) ;; OPTIN-NEXT: ) ;; OPTIN-NEXT: (drop diff --git a/test/lit/passes/dae-typessa-repeat-types.wast b/test/lit/passes/dae-typessa-repeat-types.wast index 7072d215cac..9b891869715 100644 --- a/test/lit/passes/dae-typessa-repeat-types.wast +++ b/test/lit/passes/dae-typessa-repeat-types.wast @@ -68,7 +68,13 @@ ) ;; CHECK: (func $other (type $5) (result i32 (ref $struct)) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $other (result i32 (ref $struct)) ;; This will keep the (result i32 (ref $struct)) signature, which will diff --git a/test/lit/passes/dae2-results-indirect.wast b/test/lit/passes/dae2-results-indirect.wast index 66dadf17303..ca9561f000d 100644 --- a/test/lit/passes/dae2-results-indirect.wast +++ b/test/lit/passes/dae2-results-indirect.wast @@ -523,8 +523,13 @@ ) ;; CHECK: (func $caller (type $caller) (param $callee (ref $callee)) - ;; CHECK-NEXT: (return_call_ref $callee - ;; CHECK-NEXT: (local.get $callee) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (return_call_ref $callee + ;; CHECK-NEXT: (local.get $callee) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $caller (type $caller) (param $callee (ref $callee)) (result i32) @@ -564,6 +569,7 @@ ;; CHECK-NEXT: (return_call_ref $callee ;; CHECK-NEXT: (local.get $callee) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $caller (type $caller) (param $callee (ref $callee)) (result i32) (return_call_ref $callee (local.get $callee)) diff --git a/test/lit/passes/dae2-results-returns.wast b/test/lit/passes/dae2-results-returns.wast index 58e3ddb428f..bd71fb96b7e 100644 --- a/test/lit/passes/dae2-results-returns.wast +++ b/test/lit/passes/dae2-results-returns.wast @@ -12,9 +12,16 @@ ) ;; CHECK: (func $explicit (type $0) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) (func $explicit (result i32) (return (i32.const 2)) @@ -43,6 +50,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $explicit (result i32) (return (i32.const 2)) @@ -77,6 +85,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -109,6 +118,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -142,7 +152,12 @@ (i32.const 42) ) ;; CHECK: (func $a (type $0) - ;; CHECK-NEXT: (return_call $b) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (return_call $b) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $a (result i32) (return_call $b) @@ -167,6 +182,7 @@ ) ;; CHECK: (func $a (type $0) (result i32) ;; CHECK-NEXT: (return_call $b) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $a (result i32) (return_call $b) @@ -210,6 +226,7 @@ ;; CHECK-NEXT: (return_call_indirect $0 (type $sig) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $a (result i32) (return_call_indirect (type $sig) (i32.const 0)) @@ -252,6 +269,7 @@ ;; CHECK-NEXT: (return_call_ref $sig ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $a (param $ref (ref $sig)) (result i32) (return_call_ref $sig (local.get $ref)) @@ -294,6 +312,7 @@ ;; CHECK-NEXT: (return_call_indirect $0 (type $sig) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $caller (type $sig) (result i32) ;; Now the reason we can't remove $sig's result is that $sig is public. We @@ -317,6 +336,7 @@ ;; CHECK-NEXT: (return_call_ref $sig ;; CHECK-NEXT: (ref.func $callee) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $caller (type $sig) (result i32) ;; Same, but with return_call_ref. @@ -344,7 +364,12 @@ ) ;; CHECK: (func $callee (type $0) ;; CHECK-NEXT: (local $0 f64) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result f64) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $callee (param f64) (result f64) (unreachable) @@ -367,6 +392,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -381,7 +407,12 @@ ) ;; CHECK: (func $callee (type $0) ;; CHECK-NEXT: (local $0 f64) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result f64) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $callee (param f64) (result f64) (unreachable) diff --git a/test/lit/passes/dae2.wast b/test/lit/passes/dae2.wast index a74e9709612..654da8bccb9 100644 --- a/test/lit/passes/dae2.wast +++ b/test/lit/passes/dae2.wast @@ -2922,6 +2922,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (local.get $used) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop diff --git a/test/lit/passes/dae_all-features.wast b/test/lit/passes/dae_all-features.wast index 145ae1ff032..98681dc9a1d 100644 --- a/test/lit/passes/dae_all-features.wast +++ b/test/lit/passes/dae_all-features.wast @@ -345,16 +345,28 @@ (local.get $x) ) ;; CHECK: (func $c6 (type $0) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $c6 (result i32) (unreachable) ) ;; CHECK: (func $c7 (type $0) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) (func $c7 (result i32) (return (i32.const 4)) @@ -439,10 +451,13 @@ ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (return_call_indirect $0 (type $T) - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (return_call_indirect $0 (type $T) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $foo (param $x i32) (result i32) @@ -477,6 +492,7 @@ ;; CHECK: (func $0 (type $0) (param $0 funcref) (param $1 i32) (param $2 f64) (result i64) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $0 (param $0 funcref) (param $1 i32) (param $2 f64) (result i64) (nop) @@ -672,18 +688,23 @@ ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $0 (param $0 i32) (result i32) @@ -728,6 +749,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $no-caller (type $A) (result (ref $A)) ;; This return_call is to a bottom type, which we should ignore and not error @@ -838,11 +860,14 @@ ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block (result f32) ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block (result f32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $target (param $0 i64) (param $1 v128) (param $2 i64) (result f32) @@ -926,6 +951,7 @@ ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/dae_tnh.wast b/test/lit/passes/dae_tnh.wast index 6e78283fdce..3a2016dea8c 100644 --- a/test/lit/passes/dae_tnh.wast +++ b/test/lit/passes/dae_tnh.wast @@ -69,6 +69,9 @@ ;; CHECK: (type $1 (func (param i32) (result i32))) ;; CHECK: (func $caller (type $0) (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $caller (result i32) diff --git a/test/lit/passes/enclose-world.wast b/test/lit/passes/enclose-world.wast index 0077c27bef3..1b315fbc0b2 100644 --- a/test/lit/passes/enclose-world.wast +++ b/test/lit/passes/enclose-world.wast @@ -5,18 +5,19 @@ (module ;; CHECK: (type $A (struct)) (type $A (struct)) + ;; CHECK: (type $C (struct (field i32) (field f64))) + ;; CHECK: (type $B (struct (field i32))) (type $B (struct (field i32))) - ;; CHECK: (type $2 (func (param externref))) + (type $C (struct (field i32 f64))) - ;; CHECK: (type $3 (func (result externref))) + ;; CHECK: (type $3 (func (param externref))) - ;; CHECK: (type $4 (func (param anyref) (result anyref))) + ;; CHECK: (type $4 (func (result externref))) - ;; CHECK: (type $5 (func (param externref) (result externref))) + ;; CHECK: (type $5 (func (param anyref) (result anyref))) - ;; CHECK: (type $C (struct (field i32) (field f64))) - (type $C (struct (field i32 f64))) + ;; CHECK: (type $6 (func (param externref) (result externref))) ;; CHECK: (type $7 (func (param i32) (result f64))) @@ -58,13 +59,14 @@ (f64.const 3.14159) ) - ;; CHECK: (func $externref-param (type $2) (param $x externref) + ;; CHECK: (func $externref-param (type $3) (param $x externref) ;; CHECK-NEXT: ) (func $externref-param (export "externref-param") (param $x externref) ;; An externref param is fine, we don't need to do anything. ) - ;; CHECK: (func $externref-result (type $3) (result externref) + ;; CHECK: (func $externref-result (type $4) (result externref) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $externref-result (export "externref-result") (result externref) @@ -81,13 +83,15 @@ ;; CHECK: (func $anyref-result (type $9) (result anyref) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $anyref-result (export "anyref-result") (result anyref) ;; An anyref result also requires a fixup. (unreachable) ) - ;; CHECK: (func $anyref-both (type $4) (param $x anyref) (result anyref) + ;; CHECK: (func $anyref-both (type $5) (param $x anyref) (result anyref) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $anyref-both (export "anyref-both") (param $x anyref) (result anyref) @@ -95,7 +99,8 @@ (unreachable) ) - ;; CHECK: (func $anyref-both-dupe (type $4) (param $x anyref) (result anyref) + ;; CHECK: (func $anyref-both-dupe (type $5) (param $x anyref) (result anyref) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $anyref-both-dupe (export "anyref-both-dupe") (param $x anyref) (result anyref) @@ -107,6 +112,7 @@ ;; CHECK: (func $many (type $10) (param $a (ref $A)) (param $b (ref null $B)) (result (ref $C)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $many (export "many") (param $a (ref $A)) (param $b (ref null $B)) (result (ref $C)) ;; Various declared types are used, and must be fixed up. @@ -121,7 +127,7 @@ ) ) -;; CHECK: (func $stub$anyref-param (type $2) (param $0 externref) +;; CHECK: (func $stub$anyref-param (type $3) (param $0 externref) ;; CHECK-NEXT: (call $anyref-param ;; CHECK-NEXT: (ref.cast anyref ;; CHECK-NEXT: (any.convert_extern @@ -131,13 +137,13 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $stub$anyref-result (type $3) (result externref) +;; CHECK: (func $stub$anyref-result (type $4) (result externref) ;; CHECK-NEXT: (extern.convert_any ;; CHECK-NEXT: (call $anyref-result) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $stub$anyref-both (type $5) (param $0 externref) (result externref) +;; CHECK: (func $stub$anyref-both (type $6) (param $0 externref) (result externref) ;; CHECK-NEXT: (extern.convert_any ;; CHECK-NEXT: (call $anyref-both ;; CHECK-NEXT: (ref.cast anyref @@ -149,7 +155,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $stub$anyref-both-dupe (type $5) (param $0 externref) (result externref) +;; CHECK: (func $stub$anyref-both-dupe (type $6) (param $0 externref) (result externref) ;; CHECK-NEXT: (extern.convert_any ;; CHECK-NEXT: (call $anyref-both-dupe ;; CHECK-NEXT: (ref.cast anyref @@ -207,6 +213,7 @@ ;; CHECK: (func $anyref-both (type $1) (param $x anyref) (result anyref) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $anyref-both (param $x anyref) (result anyref) (unreachable) diff --git a/test/lit/passes/flatten-eh-legacy.wast b/test/lit/passes/flatten-eh-legacy.wast index 3d22b41a4e5..86167650f86 100644 --- a/test/lit/passes/flatten-eh-legacy.wast +++ b/test/lit/passes/flatten-eh-legacy.wast @@ -141,25 +141,37 @@ ;; CHECK-NEXT: (local $0 i32) ;; CHECK-NEXT: (local $1 i32) ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (local $4 i32) ;; CHECK-NEXT: (try ;; CHECK-NEXT: (do - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (catch $e-i32 - ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (pop i32) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $1 - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $2 - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $try_unreachable (result i32) @@ -200,6 +212,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (local.get $1) diff --git a/test/lit/passes/flatten_all-features.wast b/test/lit/passes/flatten_all-features.wast index b601b8a1295..d564db02081 100644 --- a/test/lit/passes/flatten_all-features.wast +++ b/test/lit/passes/flatten_all-features.wast @@ -547,6 +547,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $outer) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $10 ;; CHECK-NEXT: (local.get $1) @@ -687,6 +689,8 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (local.get $1) @@ -722,6 +726,8 @@ ;; CHECK-NEXT: (block $label$3 ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (local.get $1) @@ -895,6 +901,8 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (local.get $0) @@ -916,25 +924,37 @@ ) ) ;; CHECK: (func $a19 (type $5) (result f32) - ;; CHECK-NEXT: (block $label$0 - ;; CHECK-NEXT: (block $label$1 - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (f32.const 4289944320) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (select - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local $0 f32) + ;; CHECK-NEXT: (local $1 f32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (block $label$1 ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (i32.const 65535) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (f32.const 4289944320) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 65535) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $a19 (result f32) (block $label$0 @@ -1075,6 +1095,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (local.get $1) @@ -1096,6 +1118,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $4 ;; CHECK-NEXT: (local.get $3) @@ -1118,6 +1142,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $6 ;; CHECK-NEXT: (local.get $5) @@ -1993,6 +2019,8 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (local.get $0) @@ -2052,6 +2080,8 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $4 ;; CHECK-NEXT: (local.get $3) @@ -2146,6 +2176,8 @@ ;; CHECK-NEXT: (br $out) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (local.get $0) @@ -2436,6 +2468,8 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $15 ;; CHECK-NEXT: (local.get $14) @@ -2606,6 +2640,8 @@ ;; CHECK-NEXT: (i32.const 777) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $7 ;; CHECK-NEXT: (local.get $6) @@ -3556,16 +3592,28 @@ ) ;; CHECK: (func $return (type $3) (param $x i32) (result i32) ;; CHECK-NEXT: (local $1 i32) - ;; CHECK-NEXT: (local.set $1 - ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return (param $x i32) (result i32) (return (i32.sub (i32.const 1) (i32.const 2))) @@ -3653,15 +3701,27 @@ (nop) ) ;; CHECK: (func $test (type $1) (result i32) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const -111) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const -111) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test (export "test") (result i32) (call $0 diff --git a/test/lit/passes/flatten_i64-to-i32-lowering.wast b/test/lit/passes/flatten_i64-to-i32-lowering.wast index beb15b2e46d..fde3d764ea6 100644 --- a/test/lit/passes/flatten_i64-to-i32-lowering.wast +++ b/test/lit/passes/flatten_i64-to-i32-lowering.wast @@ -100,23 +100,62 @@ (i64.add (i64.const 1) (i64.const 2)) ) ;; CHECK: (func $unreachable-select-i64 (type $0) (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $0$hi i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $1$hi i32) ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local $i64toi32_i32$1 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$2 i32) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (local.set $i64toi32_i32$0 - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (local.get $0$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (local.get $1$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $i64toi32_i32$HIGH_BITS + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-select-i64 (result i64) (select @@ -126,23 +165,62 @@ ) ) ;; CHECK: (func $unreachable-select-i64-b (type $0) (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $0$hi i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $1$hi i32) ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local $i64toi32_i32$1 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$2 i32) ;; CHECK-NEXT: (block ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (local.set $i64toi32_i32$0 - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (local.get $0$hi) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (local.set $1$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (local.get $1$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $i64toi32_i32$HIGH_BITS + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-select-i64-b (result i64) (select @@ -152,29 +230,68 @@ ) ) ;; CHECK: (func $unreachable-select-i64-c (type $0) (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $0$hi i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $1$hi i32) ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) ;; CHECK-NEXT: (local $i64toi32_i32$1 i32) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local $i64toi32_i32$2 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$3 i32) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (local.set $i64toi32_i32$0 - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (local.get $0$hi) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.set $1$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$3 ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (local.set $i64toi32_i32$1 - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (local.get $1$hi) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (global.set $i64toi32_i32$HIGH_BITS + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $i64toi32_i32$3) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-select-i64-c (result i64) (select @@ -535,6 +652,8 @@ ;; CHECK-NEXT: (block $label$1 ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block ;; CHECK-NEXT: (local.set $1 @@ -681,8 +800,47 @@ ;; CHECK: (elem $0 (i32.const 0) $f) ;; CHECK: (func $f (type $0) (result i32) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $0$hi i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $1$hi i32) + ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$1 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (local.get $0$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (local.get $1$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $i64toi32_i32$HIGH_BITS + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $f (result i64) (unreachable) diff --git a/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast b/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast index f71970035af..d2a47c4ae76 100644 --- a/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast +++ b/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast @@ -84,6 +84,8 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -132,61 +134,71 @@ ;; CHECK-NEXT: (local $16 i32) ;; CHECK-NEXT: (local $17 i32) ;; CHECK-NEXT: (local $18 i32) + ;; CHECK-NEXT: (local $19 i32) + ;; CHECK-NEXT: (local $20 i32) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $8 - ;; CHECK-NEXT: (i64.lt_s - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (i64.lt_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (local.get $8) - ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $15 - ;; CHECK-NEXT: (i64.eq - ;; CHECK-NEXT: (local.get $a) - ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $15 + ;; CHECK-NEXT: (i64.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $16 - ;; CHECK-NEXT: (i64.ne - ;; CHECK-NEXT: (local.get $a) - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (i64.ne + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $18 - ;; CHECK-NEXT: (i32.and - ;; CHECK-NEXT: (local.get $15) - ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $18 + ;; CHECK-NEXT: (i32.and + ;; CHECK-NEXT: (local.get $15) + ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $18) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $18) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $19) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $figure-1b (param $a i64) (param $x i64) (param $y i64) (result i32) (local $i i32) @@ -281,6 +293,8 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -755,6 +769,8 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -971,17 +987,27 @@ ) ;; CHECK: (func $select (param $x i32) (result i32) ;; CHECK-NEXT: (local $1 i32) - ;; CHECK-NEXT: (local.set $1 - ;; CHECK-NEXT: (select - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 2) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $select (param $x i32) (result i32) (return @@ -1001,39 +1027,49 @@ ;; CHECK-NEXT: (local $7 i32) ;; CHECK-NEXT: (local $8 i32) ;; CHECK-NEXT: (local $9 i32) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local $10 i32) + ;; CHECK-NEXT: (local $11 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $6 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $8 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (i32.const 2) - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $9 - ;; CHECK-NEXT: (select - ;; CHECK-NEXT: (local.get $4) - ;; CHECK-NEXT: (local.get $6) - ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: (local.get $10) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $select-2 (param $x i32) (param $y i32) (result i32) (return @@ -1334,37 +1370,47 @@ ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) ;; CHECK-NEXT: (local $5 i32) - ;; CHECK-NEXT: (local.set $0 - ;; CHECK-NEXT: (call $call) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $1 - ;; CHECK-NEXT: (call $call) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $2 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local $6 i32) + ;; CHECK-NEXT: (local $7 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (call $call) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $3 - ;; CHECK-NEXT: (call $call) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (i32.const 10) - ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (call $call) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $5 - ;; CHECK-NEXT: (i32.mul - ;; CHECK-NEXT: (local.get $2) - ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (call $call) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.mul + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: (local.get $6) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $call (result i32) (return @@ -1416,6 +1462,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1476,6 +1524,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1544,6 +1594,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1619,6 +1671,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1692,6 +1746,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2402,6 +2458,8 @@ ;; CHECK-NEXT: (local.get $t) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2490,6 +2548,8 @@ ;; CHECK-NEXT: (local.get $4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2551,6 +2611,8 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2619,6 +2681,8 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2678,6 +2742,8 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2739,6 +2805,8 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2801,6 +2869,8 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2863,6 +2933,8 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2948,6 +3020,8 @@ ;; CHECK-NEXT: (local.get $13) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3030,6 +3104,8 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3097,6 +3173,8 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3169,6 +3247,8 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3263,6 +3343,8 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3361,6 +3443,8 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3466,6 +3550,8 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3633,6 +3719,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (br_if $label$6 @@ -3702,19 +3790,21 @@ ;; CHECK-NEXT: (local $var$2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) - ;; CHECK-NEXT: (local $5 i32) - ;; CHECK-NEXT: (local $6 i32) + ;; CHECK-NEXT: (local $5 f32) + ;; CHECK-NEXT: (local $6 f32) ;; CHECK-NEXT: (local $7 i32) ;; CHECK-NEXT: (local $8 i32) ;; CHECK-NEXT: (local $9 i32) ;; CHECK-NEXT: (local $10 i32) ;; CHECK-NEXT: (local $11 i32) - ;; CHECK-NEXT: (local $12 f32) - ;; CHECK-NEXT: (local $13 f32) + ;; CHECK-NEXT: (local $12 i32) + ;; CHECK-NEXT: (local $13 i32) ;; CHECK-NEXT: (local $14 f32) ;; CHECK-NEXT: (local $15 f32) - ;; CHECK-NEXT: (local $16 f64) - ;; CHECK-NEXT: (local $17 f64) + ;; CHECK-NEXT: (local $16 f32) + ;; CHECK-NEXT: (local $17 f32) + ;; CHECK-NEXT: (local $18 f64) + ;; CHECK-NEXT: (local $19 f64) ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block ;; CHECK-NEXT: (nop) @@ -3728,8 +3818,16 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (block @@ -3737,7 +3835,7 @@ ;; CHECK-NEXT: (loop $label$3 ;; CHECK-NEXT: (block $label$4 ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.set $8 ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br_if $label$4 @@ -3745,7 +3843,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.set $8 ;; CHECK-NEXT: (i32.clz ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) @@ -3756,7 +3854,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) @@ -3765,7 +3863,7 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $14 + ;; CHECK-NEXT: (local.set $16 ;; CHECK-NEXT: (f32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3775,10 +3873,12 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: (local.get $18) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $phi-value-turns-bad (result f64) @@ -3915,40 +4015,50 @@ ;; CHECK-NEXT: (local $5 i32) ;; CHECK-NEXT: (local $6 i32) ;; CHECK-NEXT: (local $7 i32) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $2 - ;; CHECK-NEXT: (i32.mul - ;; CHECK-NEXT: (i32.const 10) - ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local $8 i32) + ;; CHECK-NEXT: (local $9 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.mul + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (i32.ctz - ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.ctz + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $5 - ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $4) - ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $6 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $2) - ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $7 - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $many-single-uses-with-param (param $x i32) (result i32) (return @@ -4547,6 +4657,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -4708,6 +4820,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return diff --git a/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast b/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast index d57df657913..02340deafa4 100644 --- a/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast +++ b/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast @@ -84,6 +84,8 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -132,61 +134,71 @@ ;; CHECK-NEXT: (local $16 i32) ;; CHECK-NEXT: (local $17 i32) ;; CHECK-NEXT: (local $18 i32) + ;; CHECK-NEXT: (local $19 i32) + ;; CHECK-NEXT: (local $20 i32) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $8 - ;; CHECK-NEXT: (i64.lt_s - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (i64.lt_s + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (local.get $8) - ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $15 - ;; CHECK-NEXT: (i64.eq - ;; CHECK-NEXT: (local.get $a) - ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $15 + ;; CHECK-NEXT: (i64.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $16 - ;; CHECK-NEXT: (i64.ne - ;; CHECK-NEXT: (local.get $a) - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (i64.ne + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $18 - ;; CHECK-NEXT: (i32.and - ;; CHECK-NEXT: (local.get $15) - ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $18 + ;; CHECK-NEXT: (i32.and + ;; CHECK-NEXT: (local.get $15) + ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $18) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $18) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $19) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $figure-1b (param $a i64) (param $x i64) (param $y i64) (result i32) (local $i i32) @@ -281,6 +293,8 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -822,6 +836,8 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1038,17 +1054,27 @@ ) ;; CHECK: (func $select (param $x i32) (result i32) ;; CHECK-NEXT: (local $1 i32) - ;; CHECK-NEXT: (local.set $1 - ;; CHECK-NEXT: (select - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 2) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $select (param $x i32) (result i32) (return @@ -1068,39 +1094,49 @@ ;; CHECK-NEXT: (local $7 i32) ;; CHECK-NEXT: (local $8 i32) ;; CHECK-NEXT: (local $9 i32) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local $10 i32) + ;; CHECK-NEXT: (local $11 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $6 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $8 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (i32.const 2) - ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $9 - ;; CHECK-NEXT: (select - ;; CHECK-NEXT: (local.get $4) - ;; CHECK-NEXT: (local.get $6) - ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: (local.get $10) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $select-2 (param $x i32) (param $y i32) (result i32) (return @@ -1401,37 +1437,47 @@ ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) ;; CHECK-NEXT: (local $5 i32) - ;; CHECK-NEXT: (local.set $0 - ;; CHECK-NEXT: (call $call) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $1 - ;; CHECK-NEXT: (call $call) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $2 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local $6 i32) + ;; CHECK-NEXT: (local $7 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (call $call) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $3 - ;; CHECK-NEXT: (call $call) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (i32.const 10) - ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (call $call) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $5 - ;; CHECK-NEXT: (i32.mul - ;; CHECK-NEXT: (local.get $2) - ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (call $call) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.mul + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: (local.get $6) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $call (result i32) (return @@ -1483,6 +1529,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1543,6 +1591,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1611,6 +1661,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1686,6 +1738,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1759,6 +1813,8 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2469,6 +2525,8 @@ ;; CHECK-NEXT: (local.get $t) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2557,6 +2615,8 @@ ;; CHECK-NEXT: (local.get $4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2618,6 +2678,8 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2686,6 +2748,8 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2745,6 +2809,8 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2806,6 +2872,8 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2868,6 +2936,8 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2930,6 +3000,8 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3015,6 +3087,8 @@ ;; CHECK-NEXT: (local.get $13) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3097,6 +3171,8 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3164,6 +3240,8 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3236,6 +3314,8 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3330,6 +3410,8 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3428,6 +3510,8 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3533,6 +3617,8 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3700,6 +3786,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (br_if $label$6 @@ -3769,19 +3857,21 @@ ;; CHECK-NEXT: (local $var$2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) - ;; CHECK-NEXT: (local $5 i32) - ;; CHECK-NEXT: (local $6 i32) + ;; CHECK-NEXT: (local $5 f32) + ;; CHECK-NEXT: (local $6 f32) ;; CHECK-NEXT: (local $7 i32) ;; CHECK-NEXT: (local $8 i32) ;; CHECK-NEXT: (local $9 i32) ;; CHECK-NEXT: (local $10 i32) ;; CHECK-NEXT: (local $11 i32) - ;; CHECK-NEXT: (local $12 f32) - ;; CHECK-NEXT: (local $13 f32) + ;; CHECK-NEXT: (local $12 i32) + ;; CHECK-NEXT: (local $13 i32) ;; CHECK-NEXT: (local $14 f32) ;; CHECK-NEXT: (local $15 f32) - ;; CHECK-NEXT: (local $16 f64) - ;; CHECK-NEXT: (local $17 f64) + ;; CHECK-NEXT: (local $16 f32) + ;; CHECK-NEXT: (local $17 f32) + ;; CHECK-NEXT: (local $18 f64) + ;; CHECK-NEXT: (local $19 f64) ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block ;; CHECK-NEXT: (nop) @@ -3795,8 +3885,16 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (block @@ -3804,7 +3902,7 @@ ;; CHECK-NEXT: (loop $label$3 ;; CHECK-NEXT: (block $label$4 ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.set $8 ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br_if $label$4 @@ -3812,7 +3910,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.set $8 ;; CHECK-NEXT: (i32.clz ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) @@ -3823,7 +3921,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) @@ -3832,7 +3930,7 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $14 + ;; CHECK-NEXT: (local.set $16 ;; CHECK-NEXT: (f32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3842,10 +3940,12 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: (local.get $18) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $phi-value-turns-bad (result f64) @@ -3982,40 +4082,50 @@ ;; CHECK-NEXT: (local $5 i32) ;; CHECK-NEXT: (local $6 i32) ;; CHECK-NEXT: (local $7 i32) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $2 - ;; CHECK-NEXT: (i32.mul - ;; CHECK-NEXT: (i32.const 10) - ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local $8 i32) + ;; CHECK-NEXT: (local $9 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.mul + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (i32.ctz - ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.ctz + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $5 - ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $4) - ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $6 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $2) - ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $7 - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $many-single-uses-with-param (param $x i32) (result i32) (return @@ -4614,6 +4724,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -4775,6 +4887,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return diff --git a/test/lit/passes/global-effects-O.wast b/test/lit/passes/global-effects-O.wast index ef2cf62e06c..51e173299ac 100644 --- a/test/lit/passes/global-effects-O.wast +++ b/test/lit/passes/global-effects-O.wast @@ -65,16 +65,49 @@ ;; CHECK_0-NEXT: ) ;; CHECK_0-NEXT: ) ;; CHECK_1: (func $main (type $0) - ;; CHECK_1-NEXT: (nop) + ;; CHECK_1-NEXT: (if + ;; CHECK_1-NEXT: (call $pointless-work + ;; CHECK_1-NEXT: (i32.const 0) + ;; CHECK_1-NEXT: ) + ;; CHECK_1-NEXT: (then + ;; CHECK_1-NEXT: (drop + ;; CHECK_1-NEXT: (call $pointless-work + ;; CHECK_1-NEXT: (i32.const 1) + ;; CHECK_1-NEXT: ) + ;; CHECK_1-NEXT: ) + ;; CHECK_1-NEXT: ) + ;; CHECK_1-NEXT: ) ;; CHECK_1-NEXT: ) ;; CHECK_3: (func $main (type $0) ;; CHECK_3-NEXT: (nop) ;; CHECK_3-NEXT: ) ;; CHECK_s: (func $main (type $0) - ;; CHECK_s-NEXT: (nop) + ;; CHECK_s-NEXT: (if + ;; CHECK_s-NEXT: (call $pointless-work + ;; CHECK_s-NEXT: (i32.const 0) + ;; CHECK_s-NEXT: ) + ;; CHECK_s-NEXT: (then + ;; CHECK_s-NEXT: (drop + ;; CHECK_s-NEXT: (call $pointless-work + ;; CHECK_s-NEXT: (i32.const 1) + ;; CHECK_s-NEXT: ) + ;; CHECK_s-NEXT: ) + ;; CHECK_s-NEXT: ) + ;; CHECK_s-NEXT: ) ;; CHECK_s-NEXT: ) ;; CHECK_O: (func $main (type $0) - ;; CHECK_O-NEXT: (nop) + ;; CHECK_O-NEXT: (if + ;; CHECK_O-NEXT: (call $pointless-work + ;; CHECK_O-NEXT: (i32.const 0) + ;; CHECK_O-NEXT: ) + ;; CHECK_O-NEXT: (then + ;; CHECK_O-NEXT: (drop + ;; CHECK_O-NEXT: (call $pointless-work + ;; CHECK_O-NEXT: (i32.const 1) + ;; CHECK_O-NEXT: ) + ;; CHECK_O-NEXT: ) + ;; CHECK_O-NEXT: ) + ;; CHECK_O-NEXT: ) ;; CHECK_O-NEXT: ) (func $main ;; This calls a function that does pointless work. After generating global @@ -205,6 +238,7 @@ ;; CHECK_0-NEXT: (return ;; CHECK_0-NEXT: (local.get $x) ;; CHECK_0-NEXT: ) + ;; CHECK_0-NEXT: (unreachable) ;; CHECK_0-NEXT: ) ;; CHECK_1: (func $pointless-work (type $1) (param $0 i32) (result i32) ;; CHECK_1-NEXT: (if (result i32) @@ -337,6 +371,7 @@ ;; CHECK_0-NEXT: (return ;; CHECK_0-NEXT: (local.get $x) ;; CHECK_0-NEXT: ) + ;; CHECK_0-NEXT: (unreachable) ;; CHECK_0-NEXT: ) ;; CHECK_1: (func $infinite-work (type $1) (param $0 i32) (result i32) ;; CHECK_1-NEXT: (loop $loop diff --git a/test/lit/passes/global-effects-eh-legacy.wast b/test/lit/passes/global-effects-eh-legacy.wast index dae61274e10..f64f99de44d 100644 --- a/test/lit/passes/global-effects-eh-legacy.wast +++ b/test/lit/passes/global-effects-eh-legacy.wast @@ -51,6 +51,9 @@ ;; INCLUDE: (func $main (type $void) ;; INCLUDE-NEXT: (call $unreachable) ;; INCLUDE-NEXT: (call $call-unreachable) + ;; INCLUDE-NEXT: (drop + ;; INCLUDE-NEXT: (call $unimportant-effects) + ;; INCLUDE-NEXT: ) ;; INCLUDE-NEXT: (call $throw) ;; INCLUDE-NEXT: (call $throw-and-import) ;; INCLUDE-NEXT: ) diff --git a/test/lit/passes/global-effects.wast b/test/lit/passes/global-effects.wast index 86e4988e92c..4d0f1d6c578 100644 --- a/test/lit/passes/global-effects.wast +++ b/test/lit/passes/global-effects.wast @@ -59,6 +59,9 @@ ;; INCLUDE: (func $main (type $void) ;; INCLUDE-NEXT: (call $unreachable) ;; INCLUDE-NEXT: (call $call-unreachable) + ;; INCLUDE-NEXT: (drop + ;; INCLUDE-NEXT: (call $unimportant-effects) + ;; INCLUDE-NEXT: ) ;; INCLUDE-NEXT: (call $throw) ;; INCLUDE-NEXT: (call $throw-and-import) ;; INCLUDE-NEXT: ) diff --git a/test/lit/passes/gufa-cast-all.wast b/test/lit/passes/gufa-cast-all.wast index acbe4d9c562..cbf0203fd1f 100644 --- a/test/lit/passes/gufa-cast-all.wast +++ b/test/lit/passes/gufa-cast-all.wast @@ -169,6 +169,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -218,7 +219,13 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -262,6 +269,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -314,6 +322,7 @@ ;; CHECK-NEXT: (ref.null nofunc) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.func $test) @@ -477,6 +486,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/gufa-cont.wast b/test/lit/passes/gufa-cont.wast index d35e77a60ef..80eb13b3473 100644 --- a/test/lit/passes/gufa-cont.wast +++ b/test/lit/passes/gufa-cont.wast @@ -70,6 +70,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -82,6 +83,7 @@ ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: (return) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -109,6 +111,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -121,6 +124,7 @@ ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: (return) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -142,11 +146,13 @@ ;; CHECK-NEXT: (suspend $tag) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; OPEN_WORLD: (func $cont-i32 (type $func-i32) (result i32) ;; OPEN_WORLD-NEXT: (suspend $tag) ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: (unreachable) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) (func $cont-i32 (result i32) ;; Helper for below. @@ -164,7 +170,13 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -178,7 +190,13 @@ ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) - ;; OPEN_WORLD-NEXT: (return) + ;; OPEN_WORLD-NEXT: (tuple.make 2 + ;; OPEN_WORLD-NEXT: (block + ;; OPEN_WORLD-NEXT: (return) + ;; OPEN_WORLD-NEXT: (unreachable) + ;; OPEN_WORLD-NEXT: ) + ;; OPEN_WORLD-NEXT: (unreachable) + ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -256,6 +274,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -269,6 +288,7 @@ ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: (return) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -351,8 +371,14 @@ ;; CHECK-NEXT: (ref.func $cont) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -366,8 +392,14 @@ ;; OPEN_WORLD-NEXT: (ref.func $cont) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) - ;; OPEN_WORLD-NEXT: (return - ;; OPEN_WORLD-NEXT: (i32.const 42) + ;; OPEN_WORLD-NEXT: (tuple.make 2 + ;; OPEN_WORLD-NEXT: (block + ;; OPEN_WORLD-NEXT: (return + ;; OPEN_WORLD-NEXT: (i32.const 42) + ;; OPEN_WORLD-NEXT: ) + ;; OPEN_WORLD-NEXT: (unreachable) + ;; OPEN_WORLD-NEXT: ) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) diff --git a/test/lit/passes/gufa-eh-null-type.wast b/test/lit/passes/gufa-eh-null-type.wast index 4cccd1bac43..c00963bcec0 100644 --- a/test/lit/passes/gufa-eh-null-type.wast +++ b/test/lit/passes/gufa-eh-null-type.wast @@ -23,6 +23,7 @@ ;; CHECK-NEXT: (throw $tag) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (try diff --git a/test/lit/passes/gufa-eh.wast b/test/lit/passes/gufa-eh.wast index c7211e531b1..d9afbb84935 100644 --- a/test/lit/passes/gufa-eh.wast +++ b/test/lit/passes/gufa-eh.wast @@ -95,6 +95,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 42) diff --git a/test/lit/passes/gufa-refs.wast b/test/lit/passes/gufa-refs.wast index 173d086e918..91cbd4ec443 100644 --- a/test/lit/passes/gufa-refs.wast +++ b/test/lit/passes/gufa-refs.wast @@ -85,10 +85,26 @@ ;; CHECK-NEXT: (br $block ;; CHECK-NEXT: (struct.new_default $struct) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result nullref) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block $block2 (result nullref) + ;; CHECK-NEXT: (br $block2 + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $breaks @@ -115,6 +131,8 @@ ;; CHECK: (func $get-nothing (type $2) (result (ref $struct)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $get-nothing (result (ref $struct)) ;; This function returns a non-nullable struct by type, but does not @@ -282,6 +300,8 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (struct.new_default $struct) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $get-something-return (result (ref $struct)) ;; Return a value using an explicit return. Helper for later code. @@ -996,6 +1016,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -1079,6 +1100,7 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.null none) @@ -1092,6 +1114,7 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.null none) @@ -1112,6 +1135,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.null none) @@ -2218,6 +2242,7 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -3241,6 +3266,8 @@ ;; CHECK: (func $unreachable (type $8) (result (ref eq)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable (result (ref eq)) (unreachable) @@ -3875,6 +3902,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) @@ -5357,6 +5385,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -5374,6 +5403,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) diff --git a/test/lit/passes/gufa-tnh.wast b/test/lit/passes/gufa-tnh.wast index b4601d47661..4f8a02bfce5 100644 --- a/test/lit/passes/gufa-tnh.wast +++ b/test/lit/passes/gufa-tnh.wast @@ -1080,6 +1080,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (ref.cast (ref $A) diff --git a/test/lit/passes/gufa-vs-cfp.wast b/test/lit/passes/gufa-vs-cfp.wast index bbd834e62d6..32d07be37ce 100644 --- a/test/lit/passes/gufa-vs-cfp.wast +++ b/test/lit/passes/gufa-vs-cfp.wast @@ -383,6 +383,8 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (f32.const 42) diff --git a/test/lit/passes/heap-store-optimization.wast b/test/lit/passes/heap-store-optimization.wast index c62078f7cba..95ac4c39027 100644 --- a/test/lit/passes/heap-store-optimization.wast +++ b/test/lit/passes/heap-store-optimization.wast @@ -842,6 +842,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $label) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 42) @@ -978,6 +979,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 42) @@ -1120,6 +1122,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $loop) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 42) @@ -1182,6 +1185,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $loop) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 42) diff --git a/test/lit/passes/heap2local.wast b/test/lit/passes/heap2local.wast index 11d9659db5f..64d0f8660e3 100644 --- a/test/lit/passes/heap2local.wast +++ b/test/lit/passes/heap2local.wast @@ -1049,6 +1049,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $ref) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $escape-return (result anyref) (local $ref (ref null $struct.A)) @@ -1575,6 +1576,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $2) @@ -1623,6 +1625,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1674,6 +1677,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1720,6 +1724,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1872,6 +1877,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $2) @@ -2233,6 +2239,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $ref-eq-unreachable (result i32) ;; When a child is unreachable, the result does not matter (but we should @@ -2269,6 +2276,7 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $ref-eq-unreachable-flipped (result i32) ;; As above, but with children flipped. @@ -4845,6 +4853,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/inlining-unreachable.wast b/test/lit/passes/inlining-unreachable.wast index d723212fc4b..23fe71025b7 100644 --- a/test/lit/passes/inlining-unreachable.wast +++ b/test/lit/passes/inlining-unreachable.wast @@ -32,7 +32,10 @@ ;; CHECK: (func $call-trap-result (type $1) (result i32) ;; CHECK-NEXT: (block $__inlined_func$trap-result$1 - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $call-trap-result (result i32) @@ -76,7 +79,10 @@ ;; CHECK: (func $caller (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$callee - ;; CHECK-NEXT: (call $imported + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $imported + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -176,11 +182,15 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return ;; CHECK-NEXT: (block $__inlined_func$1 - ;; CHECK-NEXT: (block $block0 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block0 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $0 (result f64) (block $block diff --git a/test/lit/passes/inlining_enable-tail-call.wast b/test/lit/passes/inlining_enable-tail-call.wast index 52687ee0fd8..f370035f3ef 100644 --- a/test/lit/passes/inlining_enable-tail-call.wast +++ b/test/lit/passes/inlining_enable-tail-call.wast @@ -79,8 +79,11 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$return$11 (result i32) - ;; CHECK-NEXT: (br $__inlined_func$return$11 - ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__inlined_func$return$11 + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -218,6 +221,7 @@ ;; CHECK-NEXT: (call $child ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $parent (result i32) (call $child @@ -294,6 +298,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $label$0) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 0) @@ -302,6 +307,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -382,9 +388,11 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) @@ -487,6 +495,7 @@ ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $caller (result i32) (return_call $callee) @@ -587,6 +596,7 @@ ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $caller (result i32) (return_call $callee @@ -815,27 +825,31 @@ ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (local.get $y) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (block $__inlined_func$third$1 (result i32) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (local.get $2) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $5 - ;; CHECK-NEXT: (local.get $3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (block $__inlined_func$third$1 (result i32) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $first (result i32) (local $x i32) @@ -958,10 +972,13 @@ ;; CHECK: (func $first ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$second (result i32) - ;; CHECK-NEXT: (br $__inlined_func$second - ;; CHECK-NEXT: (block $__inlined_func$third$2 (result i32) - ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__inlined_func$second + ;; CHECK-NEXT: (block $__inlined_func$third$2 (result i32) + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1158,6 +1175,7 @@ ;; CHECK-NEXT: (call $third ;; CHECK-NEXT: (block ;; CHECK-NEXT: (br $__inlined_func$second) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $__inlined_func$second) @@ -1178,6 +1196,7 @@ ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (block ;; CHECK-NEXT: (br $__inlined_func$second-2$1) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $__return_call) @@ -1240,11 +1259,14 @@ ;; CHECK: (func $caller ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$callee (result i32) - ;; CHECK-NEXT: (br $__inlined_func$callee - ;; CHECK-NEXT: (call_indirect (type $T) - ;; CHECK-NEXT: (i32.const 42) - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $__inlined_func$callee + ;; CHECK-NEXT: (call_indirect (type $T) + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1534,10 +1556,12 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/inlining_optimize-level=3.wast b/test/lit/passes/inlining_optimize-level=3.wast index dc35fb10b23..a008c6454a7 100644 --- a/test/lit/passes/inlining_optimize-level=3.wast +++ b/test/lit/passes/inlining_optimize-level=3.wast @@ -381,6 +381,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$bar ;; CHECK-NEXT: (br $__inlined_func$bar_0) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -408,7 +409,10 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -457,7 +461,10 @@ ;; CHECK-NEXT: (block $__inlined_func$C$2 (result f32) ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (block $__inlined_func$D$1 - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $0) diff --git a/test/lit/passes/inlining_tnh.wat b/test/lit/passes/inlining_tnh.wat index f8a52502d99..adc6a73b3dd 100644 --- a/test/lit/passes/inlining_tnh.wat +++ b/test/lit/passes/inlining_tnh.wat @@ -9,6 +9,8 @@ (module ;; CHECK: (type $0 (func)) + ;; CHECK: (type $1 (func (result i32))) + ;; CHECK: (func $call-trap ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.const 42) @@ -43,17 +45,13 @@ ;; CHECK: (func $call-trap-value ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (block $__inlined_func$trap-value$2 - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $trap-value) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (block $__inlined_func$trap-value$3 - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $trap-value) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -72,6 +70,10 @@ ) ) + ;; CHECK: (func $trap-value (result i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) (func $trap-value (result i32) (unreachable) ) diff --git a/test/lit/passes/legalize-and-prune-js-interface.wast b/test/lit/passes/legalize-and-prune-js-interface.wast index 3ab387393ce..36dbcf5da4c 100644 --- a/test/lit/passes/legalize-and-prune-js-interface.wast +++ b/test/lit/passes/legalize-and-prune-js-interface.wast @@ -177,6 +177,7 @@ ;; CHECK: (func $export-64 (type $2) (param $x i64) (result i64) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $export-64 (export "export-64") (param $x i64) (result i64) ;; This can be legalized. Note we have two params, but that's no problem. @@ -193,6 +194,7 @@ ;; CHECK: (func $export-v128-result (type $4) (result v128) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $export-v128-result (export "export-v128-result") (result v128) ;; This will be pruned. @@ -200,7 +202,13 @@ ) ;; CHECK: (func $export-mv (type $5) (result i32 i32) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $export-mv (export "export-mv") (result i32 i32) ;; This will be pruned. diff --git a/test/lit/passes/make-shared-objects.wast b/test/lit/passes/make-shared-objects.wast index 42df0aa19e7..0fda406ea92 100644 --- a/test/lit/passes/make-shared-objects.wast +++ b/test/lit/passes/make-shared-objects.wast @@ -433,7 +433,10 @@ ) ;; CHECK: (func $unreachable-call-ref (type $0) (result i32) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-call-ref (result i32) @@ -441,11 +444,14 @@ ) ;; CHECK: (func $unreachable-call-ref-effect (type $0) (result i32) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $effect) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $effect) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-call-ref-effect (result i32) (call_ref $sig (call $effect) (unreachable)) @@ -481,7 +487,10 @@ ) ;; CHECK: (func $shared-unreachable-call-ref (type $0) (result i32) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $shared-unreachable-call-ref (result i32) @@ -489,11 +498,14 @@ ) ;; CHECK: (func $shared-unreachable-call-ref-effect (type $0) (result i32) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $effect) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $effect) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $shared-unreachable-call-ref-effect (result i32) (call_ref $shared-sig (call $effect) (unreachable)) @@ -523,6 +535,7 @@ ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return-call-ref (param (ref $sig) i32) (result i32) (return_call_ref $sig (local.get 1) (local.get 0)) @@ -553,6 +566,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-call-indirect (result i32) (call_indirect $t (type $sig) (i32.const 0) (unreachable)) @@ -583,6 +597,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-param-call-indirect (param i32) (result i32) (call_indirect $t (type $sig) (unreachable) (local.get 0)) @@ -894,6 +909,7 @@ ;; CHECK-NEXT: (ref.test (ref null $shared-sig) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $ref-test-unreachable-input (result i32) (ref.test (ref null $sig) (unreachable)) @@ -1278,6 +1294,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $ref-cast-unreachable-input (result (ref null $sig)) (ref.cast (ref null $sig) (unreachable)) diff --git a/test/lit/passes/merge-blocks-eh.wast b/test/lit/passes/merge-blocks-eh.wast index df1ba0c826d..b7b48501b03 100644 --- a/test/lit/passes/merge-blocks-eh.wast +++ b/test/lit/passes/merge-blocks-eh.wast @@ -8,10 +8,10 @@ ;; CHECK: (tag $empty (type $0)) (tag $empty) - ;; CHECK: (tag $i32 (type $1) (param i32)) + ;; CHECK: (tag $i32 (type $2) (param i32)) (tag $i32 (param i32)) - ;; CHECK: (tag $exnref (type $2) (param exnref)) + ;; CHECK: (tag $exnref (type $3) (param exnref)) (tag $exnref (param exnref)) ;; CHECK: (func $drop-block-try_catch_all_ref (type $0) @@ -20,6 +20,7 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $drop-block-try_catch_all_ref @@ -41,6 +42,7 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $drop-block-try_catch_ref @@ -62,6 +64,7 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $drop-block-try_catch_multi @@ -78,10 +81,16 @@ ;; CHECK: (func $drop-block-try_catch_all_i32 (type $0) ;; CHECK-NEXT: (tuple.drop 2 - ;; CHECK-NEXT: (block $catch (type $3) (result i32 exnref) - ;; CHECK-NEXT: (try_table (catch_ref $i32 $catch) - ;; CHECK-NEXT: (call $import) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block $catch (type $1) (result i32 (ref exn)) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (try_table (catch_ref $i32 $catch) + ;; CHECK-NEXT: (call $import) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -100,14 +109,21 @@ ;; CHECK: (func $drop-block-try_catch_multi_partial (type $0) ;; CHECK-NEXT: (tuple.drop 2 - ;; CHECK-NEXT: (block $outer (type $4) (result i32 (ref exn)) + ;; CHECK-NEXT: (block $outer (type $1) (result i32 (ref exn)) ;; CHECK-NEXT: (block $inner ;; CHECK-NEXT: (try_table (catch_ref $i32 $outer) (catch_all $inner) ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -135,6 +151,7 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -196,6 +213,7 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/minimize-rec-groups-no-cd.wast b/test/lit/passes/minimize-rec-groups-no-cd.wast index 02245696839..f18ebfe9543 100644 --- a/test/lit/passes/minimize-rec-groups-no-cd.wast +++ b/test/lit/passes/minimize-rec-groups-no-cd.wast @@ -26,7 +26,13 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.func $referenced) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $referenced (type $exact) (drop (ref.func $referenced)) @@ -36,7 +42,13 @@ ;; CHECK: (func $control-flow-type (type $2) ;; CHECK-NEXT: (tuple.drop 2 ;; CHECK-NEXT: (block $l (type $3) (result (ref $struct) i32) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/monomorphize-context.wast b/test/lit/passes/monomorphize-context.wast index 7f9cb2f566e..c2656729980 100644 --- a/test/lit/passes/monomorphize-context.wast +++ b/test/lit/passes/monomorphize-context.wast @@ -1101,6 +1101,7 @@ ;; ALWAYS: (func $target (type $3) (param $0 anyref) (param $1 anyref) (result i32) ;; ALWAYS-NEXT: (unreachable) + ;; ALWAYS-NEXT: (unreachable) ;; ALWAYS-NEXT: ) ;; CAREFUL: (func $target (type $2) (param $0 anyref) (param $1 anyref) (result i32) ;; CAREFUL-NEXT: (unreachable) @@ -1114,35 +1115,49 @@ ;; ALWAYS: (func $target_3 (type $1) ;; ALWAYS-NEXT: (local $0 anyref) ;; ALWAYS-NEXT: (local $1 anyref) -;; ALWAYS-NEXT: (local.set $0 -;; ALWAYS-NEXT: (array.new_default $array -;; ALWAYS-NEXT: (i32.const 1) -;; ALWAYS-NEXT: ) -;; ALWAYS-NEXT: ) -;; ALWAYS-NEXT: (local.set $1 -;; ALWAYS-NEXT: (array.new $array -;; ALWAYS-NEXT: (i32.const 2) -;; ALWAYS-NEXT: (i32.const 3) +;; ALWAYS-NEXT: (drop +;; ALWAYS-NEXT: (block (result i32) +;; ALWAYS-NEXT: (local.set $0 +;; ALWAYS-NEXT: (array.new_default $array +;; ALWAYS-NEXT: (i32.const 1) +;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: (local.set $1 +;; ALWAYS-NEXT: (array.new $array +;; ALWAYS-NEXT: (i32.const 2) +;; ALWAYS-NEXT: (i32.const 3) +;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: (block (result i32) +;; ALWAYS-NEXT: (unreachable) +;; ALWAYS-NEXT: (unreachable) +;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) -;; ALWAYS-NEXT: (unreachable) ;; ALWAYS-NEXT: ) ;; ALWAYS: (func $target_4 (type $4) (param $0 i32) (param $1 i32) (param $2 i32) ;; ALWAYS-NEXT: (local $3 anyref) ;; ALWAYS-NEXT: (local $4 anyref) -;; ALWAYS-NEXT: (local.set $3 -;; ALWAYS-NEXT: (array.new_default $array -;; ALWAYS-NEXT: (local.get $0) -;; ALWAYS-NEXT: ) -;; ALWAYS-NEXT: ) -;; ALWAYS-NEXT: (local.set $4 -;; ALWAYS-NEXT: (array.new $array -;; ALWAYS-NEXT: (local.get $1) -;; ALWAYS-NEXT: (local.get $2) +;; ALWAYS-NEXT: (drop +;; ALWAYS-NEXT: (block (result i32) +;; ALWAYS-NEXT: (local.set $3 +;; ALWAYS-NEXT: (array.new_default $array +;; ALWAYS-NEXT: (local.get $0) +;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: (local.set $4 +;; ALWAYS-NEXT: (array.new $array +;; ALWAYS-NEXT: (local.get $1) +;; ALWAYS-NEXT: (local.get $2) +;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: (block (result i32) +;; ALWAYS-NEXT: (unreachable) +;; ALWAYS-NEXT: (unreachable) +;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) -;; ALWAYS-NEXT: (unreachable) ;; ALWAYS-NEXT: ) ;; CAREFUL: (func $target_3 (type $0) @@ -1192,6 +1207,7 @@ ;; ALWAYS: (func $target (type $1) (param $0 anyref) (result anyref) ;; ALWAYS-NEXT: (unreachable) + ;; ALWAYS-NEXT: (unreachable) ;; ALWAYS-NEXT: ) ;; CAREFUL: (func $target (type $0) (param $0 anyref) (result anyref) ;; CAREFUL-NEXT: (unreachable) @@ -1218,7 +1234,10 @@ ;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) -;; ALWAYS-NEXT: (unreachable) +;; ALWAYS-NEXT: (block (result anyref) +;; ALWAYS-NEXT: (unreachable) +;; ALWAYS-NEXT: (unreachable) +;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) ;; CAREFUL: (func $target_2 (type $0) (param $0 anyref) (result anyref) diff --git a/test/lit/passes/optimize-instructions-desc.wast b/test/lit/passes/optimize-instructions-desc.wast index 151f9e9d32b..1685fd001f4 100644 --- a/test/lit/passes/optimize-instructions-desc.wast +++ b/test/lit/passes/optimize-instructions-desc.wast @@ -1186,6 +1186,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1199,6 +1200,7 @@ ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (return) + ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) @@ -1227,6 +1229,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1240,6 +1243,7 @@ ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (return) + ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) @@ -1280,6 +1284,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1305,6 +1310,7 @@ ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (return) + ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) @@ -1344,6 +1350,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1369,6 +1376,7 @@ ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (return) + ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) @@ -1395,6 +1403,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block (result (ref null $desc)) ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1419,6 +1428,7 @@ ;; NTRAP-NEXT: (local.set $2 ;; NTRAP-NEXT: (block (result (ref null $desc)) ;; NTRAP-NEXT: (return) + ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (local.get $1) diff --git a/test/lit/passes/optimize-instructions-gc-tnh.wast b/test/lit/passes/optimize-instructions-gc-tnh.wast index 8eb66fcf5c5..060d5ba2fde 100644 --- a/test/lit/passes/optimize-instructions-gc-tnh.wast +++ b/test/lit/passes/optimize-instructions-gc-tnh.wast @@ -673,6 +673,7 @@ ;; NO_TNH-NEXT: (i32.const 1) ;; NO_TNH-NEXT: (then ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (else ;; NO_TNH-NEXT: (local.get $x) @@ -710,6 +711,7 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (else ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) @@ -923,12 +925,12 @@ ;; TNH-NEXT: (drop ;; TNH-NEXT: (block ;; TNH-NEXT: (drop - ;; TNH-NEXT: (if - ;; TNH-NEXT: (i32.const 1) - ;; TNH-NEXT: (then - ;; TNH-NEXT: (return) + ;; TNH-NEXT: (block + ;; TNH-NEXT: (drop + ;; TNH-NEXT: (i32.const 1) ;; TNH-NEXT: ) - ;; TNH-NEXT: (else + ;; TNH-NEXT: (block + ;; TNH-NEXT: (return) ;; TNH-NEXT: (unreachable) ;; TNH-NEXT: ) ;; TNH-NEXT: ) @@ -945,9 +947,11 @@ ;; NO_TNH-NEXT: (i32.const 1) ;; NO_TNH-NEXT: (then ;; NO_TNH-NEXT: (return) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (else ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) @@ -1031,27 +1035,33 @@ ;; TNH: (func $get-i32 (type $2) (result i32) ;; TNH-NEXT: (unreachable) + ;; TNH-NEXT: (unreachable) ;; TNH-NEXT: ) ;; NO_TNH: (func $get-i32 (type $2) (result i32) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) (func $get-i32 (result i32) (unreachable) ) ;; TNH: (func $get-ref (type $13) (result (ref $struct)) ;; TNH-NEXT: (unreachable) + ;; TNH-NEXT: (unreachable) ;; TNH-NEXT: ) ;; NO_TNH: (func $get-ref (type $13) (result (ref $struct)) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) (func $get-ref (result (ref $struct)) (unreachable) ) ;; TNH: (func $get-null (type $14) (result nullref) ;; TNH-NEXT: (unreachable) + ;; TNH-NEXT: (unreachable) ;; TNH-NEXT: ) ;; NO_TNH: (func $get-null (type $14) (result nullref) ;; NO_TNH-NEXT: (unreachable) + ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) (func $get-null (result (ref null none)) (unreachable) diff --git a/test/lit/passes/optimize-instructions-gc.wast b/test/lit/passes/optimize-instructions-gc.wast index c231f76d059..ca0508b35ab 100644 --- a/test/lit/passes/optimize-instructions-gc.wast +++ b/test/lit/passes/optimize-instructions-gc.wast @@ -411,6 +411,7 @@ ;; CHECK: (func $get-eqref (type $32) (result eqref) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $get-eqref (result eqref) (unreachable) @@ -2334,6 +2335,7 @@ ;; CHECK: (func $impossible (type $40) (result (ref none)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $impossible (result (ref none)) (unreachable) @@ -2979,7 +2981,8 @@ ;; CHECK-NEXT: (local $0 funcref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.set $0 - ;; CHECK-NEXT: (loop + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3017,7 +3020,8 @@ ;; CHECK-NEXT: (local $0 funcref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.tee $0 - ;; CHECK-NEXT: (loop (result (ref nofunc)) + ;; CHECK-NEXT: (block (result (ref nofunc)) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3039,7 +3043,8 @@ ;; CHECK: (func $non-null-bottom-ref-test-notee (type $8) (result i32) ;; CHECK-NEXT: (local $0 funcref) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (loop (result (ref nofunc)) + ;; CHECK-NEXT: (block (result (ref nofunc)) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3195,6 +3200,7 @@ ;; CHECK: (func $struct_i64_helper (type $struct_i64) (param $0 structref) (result i64) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $struct_i64_helper (type $struct_i64) (param $0 (ref null struct)) (result i64) (unreachable) @@ -3210,6 +3216,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $block) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 10) diff --git a/test/lit/passes/optimize-instructions-ignore-traps.wast b/test/lit/passes/optimize-instructions-ignore-traps.wast index 8e89f71caef..fb97090bd23 100644 --- a/test/lit/passes/optimize-instructions-ignore-traps.wast +++ b/test/lit/passes/optimize-instructions-ignore-traps.wast @@ -101,6 +101,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $5) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $conditionals (type $0) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -278,6 +279,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $5) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $side-effect (type $0) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -456,6 +458,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $5) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $flip (type $0) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -580,6 +583,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $invalidate-conditionalizeExpensiveOnBitwise (param $0 i32) (param $1 i32) (result i32) (if @@ -650,6 +654,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $invalidate-conditionalizeExpensiveOnBitwise-ok (param $0 i32) (param $1 i32) (result i32) (if @@ -716,6 +721,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f32.const 1) diff --git a/test/lit/passes/optimize-instructions-mvp.wast b/test/lit/passes/optimize-instructions-mvp.wast index dd2d0daa4d5..8d32a4f39d5 100644 --- a/test/lit/passes/optimize-instructions-mvp.wast +++ b/test/lit/passes/optimize-instructions-mvp.wast @@ -2600,6 +2600,7 @@ ) ;; CHECK: (func $ne1 (result i32) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $ne1 (result i32) (unreachable) @@ -3157,6 +3158,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $sext-24-unreachable (result i32) (i32.shr_s @@ -5518,6 +5520,7 @@ ;; CHECK-NEXT: (local.get $$conv) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $signed-loads-fill-the-bits (param $$e i32) (result i32) (local $$0 i32) @@ -6098,38 +6101,46 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.tee $0 ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6421,6 +6432,7 @@ ;; CHECK-NEXT: (i32.const -1337) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $zero-ops (result i32) (return @@ -6453,6 +6465,7 @@ ;; CHECK-NEXT: (i64.const -1337) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $zero-ops-64 (result i32) (return @@ -6484,6 +6497,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $zero-ops-64-special (result i32) (return @@ -6683,6 +6697,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 4098) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $shifts-square-unreachable (param $x i32) (result i32) (i32.shr_u @@ -7820,6 +7835,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $mul-32-power-2 (param $x i32) (result i32) (drop @@ -7934,6 +7950,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $mul-64-power-2 (param $x i64) (result i64) (drop @@ -8051,6 +8068,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $div-32-power-2 (param $x i32) (result i32) (drop @@ -8163,6 +8181,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $urem-32-power-2 (param $x i32) (result i32) (drop @@ -8883,6 +8902,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $andZero (param $0 i32) (param $1 i64) (result i32) (drop @@ -10904,6 +10924,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 3) @@ -10911,7 +10932,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $x5) + ;; CHECK-NEXT: (i32.and + ;; CHECK-NEXT: (local.get $x5) + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x6 ;; CHECK-NEXT: (if (result i32) @@ -10921,11 +10945,15 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $x6) + ;; CHECK-NEXT: (i32.and + ;; CHECK-NEXT: (local.get $x6) + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $out (result i32) @@ -10939,6 +10967,7 @@ ;; CHECK-NEXT: (local.get $x7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -10987,6 +11016,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $tee-with-unreachable-value (result f64) @@ -16072,6 +16102,7 @@ ;; CHECK-NEXT: (i32.eqz ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 0) @@ -16104,6 +16135,7 @@ ;; CHECK-NEXT: (i32.eqz ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -16590,6 +16622,7 @@ ;; CHECK-NEXT: (local.get $z) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $ternary-identical-arms-return-select (param $x i32) (param $y i32) (param $z i32) (result i32) (block $block @@ -16674,15 +16707,19 @@ ) ) ;; CHECK: (func $if-unreachable-return-identical (param $x i32) (param $y i32) (param $z i32) (result i32) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (if (result i32) - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $y) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $z) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/precompute-gc.wast b/test/lit/passes/precompute-gc.wast index bd4fc50c5cb..7d24b5ec217 100644 --- a/test/lit/passes/precompute-gc.wast +++ b/test/lit/passes/precompute-gc.wast @@ -751,6 +751,7 @@ ;; CHECK: (func $helper (type $14) (param $0 i32) (result i32) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $helper (param i32) (result i32) (unreachable) @@ -867,6 +868,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -891,6 +893,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br_on_cast-on-creation (result (ref $empty)) diff --git a/test/lit/passes/precompute_all-features.wast b/test/lit/passes/precompute_all-features.wast index 5ea442357db..0d6a4ffe4bd 100644 --- a/test/lit/passes/precompute_all-features.wast +++ b/test/lit/passes/precompute_all-features.wast @@ -71,6 +71,7 @@ ;; CHECK-NEXT: (br $val ;; CHECK-NEXT: (i32.const 102) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) @@ -376,6 +377,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block $label$3 ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -526,6 +528,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $one-break-value-and-it-is-unreachable (result f64) diff --git a/test/lit/passes/remove-unused-brs-eh.wast b/test/lit/passes/remove-unused-brs-eh.wast index ca492d4d0ff..0c880f16fe5 100644 --- a/test/lit/passes/remove-unused-brs-eh.wast +++ b/test/lit/passes/remove-unused-brs-eh.wast @@ -221,6 +221,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $throw-caught-ref-later-all (result exnref) @@ -445,6 +446,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $label) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 42) diff --git a/test/lit/passes/remove-unused-brs.wast b/test/lit/passes/remove-unused-brs.wast index fad136272ef..21af5291598 100644 --- a/test/lit/passes/remove-unused-brs.wast +++ b/test/lit/passes/remove-unused-brs.wast @@ -6,13 +6,22 @@ (module ;; Regression test in which we need to calculate a proper LUB. ;; CHECK: (func $selectify-fresh-lub (type $4) (param $x i32) (result anyref) - ;; CHECK-NEXT: (select (result i31ref) - ;; CHECK-NEXT: (ref.null none) - ;; CHECK-NEXT: (ref.i31 - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (ref.i31 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $selectify-fresh-lub (param $x i32) (result anyref) (if @@ -863,6 +872,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (br $block) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -890,6 +900,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 0) diff --git a/test/lit/passes/remove-unused-brs_all-features.wast b/test/lit/passes/remove-unused-brs_all-features.wast index 87c1b2ae197..8f5df5360c4 100644 --- a/test/lit/passes/remove-unused-brs_all-features.wast +++ b/test/lit/passes/remove-unused-brs_all-features.wast @@ -74,11 +74,13 @@ ;; CHECK-NEXT: (else ;; CHECK-NEXT: (block $block (result f64) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (br_if $loop - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $loop) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -112,6 +114,7 @@ ;; CHECK: (func $none_=>_i32 (type $5) (result i32) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $none_=>_i32 (result i32) (unreachable) @@ -229,6 +232,7 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br_on_non_null (param $x funcref) (result funcref) @@ -266,6 +270,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br_on_non_null-fallthrough (result funcref) diff --git a/test/lit/passes/remove-unused-brs_branch-hints.wast b/test/lit/passes/remove-unused-brs_branch-hints.wast index 321fbab8146..725413fdf8a 100644 --- a/test/lit/passes/remove-unused-brs_branch-hints.wast +++ b/test/lit/passes/remove-unused-brs_branch-hints.wast @@ -634,6 +634,7 @@ ;; CHECK-NEXT: (block $value (result i32) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -656,13 +657,17 @@ ;; CHECK: (func $set-if-br-arm (type $0) (param $x i32) ;; CHECK-NEXT: (local $temp i32) ;; CHECK-NEXT: (block $out - ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $temp ;; CHECK-NEXT: (@metadata.code.branch_hint "\00") - ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $temp - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -689,15 +694,17 @@ ;; CHECK: (func $set-if-br-arm-flip (type $0) (param $x i32) ;; CHECK-NEXT: (local $temp i32) ;; CHECK-NEXT: (block $out - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (@metadata.code.branch_hint "\01") - ;; CHECK-NEXT: (br_if $out - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.set $temp + ;; CHECK-NEXT: (@metadata.code.branch_hint "\00") + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $temp - ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/remove-unused-brs_enable-multivalue.wast b/test/lit/passes/remove-unused-brs_enable-multivalue.wast index f706cd7558f..73b043ec08c 100644 --- a/test/lit/passes/remove-unused-brs_enable-multivalue.wast +++ b/test/lit/passes/remove-unused-brs_enable-multivalue.wast @@ -816,7 +816,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (block $a0 (result i32) - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (br $a0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (block $a1 @@ -1285,7 +1288,10 @@ ;; CHECK-NEXT: (call $loops) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $out20 (result i32) - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (br $out20 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $in16) @@ -1624,10 +1630,17 @@ ;; CHECK-NEXT: (i32.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (select - ;; CHECK-NEXT: (i32.const 7) - ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $outval + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1741,6 +1754,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1796,6 +1810,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1850,6 +1865,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2049,18 +2065,20 @@ ;; CHECK: (func $loop-if (result i32) ;; CHECK-NEXT: (loop $typed (result i32) ;; CHECK-NEXT: (block $outer (result i32) - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (br_if $typed - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (i32.const 2) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $loop-if) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $loop-if) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $outer + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $typed) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2267,6 +2285,7 @@ ;; CHECK-NEXT: (i32.const 103) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2321,6 +2340,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (br $label$3) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2353,6 +2373,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $label$39) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 0) @@ -3601,7 +3622,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch (result i32) (block $A @@ -3637,7 +3661,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch-2 (result i32) (block $A @@ -3673,7 +3700,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch-3 (result i32) (block $A @@ -3721,7 +3751,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch43 (result i32) (block $A @@ -3757,7 +3790,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch-5 (result i32) (block $A @@ -3777,32 +3813,40 @@ ;; CHECK: (func $undo-if-return (param $p i32) (result i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (local.get $p) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $x - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br_if $out - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (local.get $p) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $p) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $x - ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x - ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (local.get $p) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3863,6 +3907,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $label$5) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (f64.const 1) @@ -3912,11 +3957,20 @@ (i32.const 0) ) ;; CHECK: (func $if-flow-1 (result i32) - ;; CHECK-NEXT: (select - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $if-flow-1 (result i32) (if @@ -3930,15 +3984,18 @@ ) ) ;; CHECK: (func $if-flow-2 (result i32) - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $if-flow-2 (result i32) (if @@ -3952,15 +4009,18 @@ ) ) ;; CHECK: (func $if-flow-3 (result i32) - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $if-flow-3 (result i32) (if @@ -3989,6 +4049,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $if-flow-4 (result i32) (if @@ -4051,23 +4112,23 @@ ;; CHECK: (func $fuzz-block-unreachable-brs-with-values (result i32) ;; CHECK-NEXT: (local $0 i32) ;; CHECK-NEXT: (loop $label$1 - ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (block $label$2 + ;; CHECK-NEXT: (block $label$2 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (then ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (loop $label$5 ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (br $label$1) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $label$1) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4129,6 +4190,7 @@ ;; CHECK-NEXT: (block $label$2 (result i32) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4500,14 +4562,17 @@ ;; CHECK-NEXT: (else ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (loop $label$3 (result i64) - ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (block $label$4 - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br_if $label$3 + ;; CHECK-NEXT: (block $label$4 (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4581,6 +4646,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4627,6 +4693,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $switch-threading-multi (param $x i32) (param $y i32) (result i32) (block $block$5$break @@ -5194,7 +5261,10 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (local.set $x - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5228,6 +5298,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (local.get $y) @@ -5321,10 +5392,16 @@ ;; CHECK: (func $loop-end-value (param $x i32) (result i32) ;; CHECK-NEXT: (loop $loop (result i32) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (br_if $loop + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $loop) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $loop-end-value (param $x i32) (result i32) @@ -5542,6 +5619,7 @@ ;; CHECK-NEXT: (i32.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $unswitch-reordering (param $x i32) (result i32) @@ -5582,6 +5660,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $no-selectify-if-condition-unreachable (result i32) (select diff --git a/test/lit/passes/remove-unused-brs_shrink-level=1.wast b/test/lit/passes/remove-unused-brs_shrink-level=1.wast index 3917c981c26..253b134c686 100644 --- a/test/lit/passes/remove-unused-brs_shrink-level=1.wast +++ b/test/lit/passes/remove-unused-brs_shrink-level=1.wast @@ -330,7 +330,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch (result i32) (block $A @@ -379,7 +382,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch-2 (result i32) (block $A @@ -427,7 +433,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch-3 (result i32) (block $A @@ -463,7 +472,10 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $simple-switch-4 (result i32) (block $A diff --git a/test/lit/passes/remove-unused-brs_trap.wast b/test/lit/passes/remove-unused-brs_trap.wast index 5bf47201b35..00244a417b8 100644 --- a/test/lit/passes/remove-unused-brs_trap.wast +++ b/test/lit/passes/remove-unused-brs_trap.wast @@ -23,7 +23,7 @@ ;; CHECK-NEXT: (else ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (call $import) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $trap) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return @@ -31,6 +31,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $jump-to-trap (param $x i32) (result i32) (block $trap diff --git a/test/lit/passes/remove-unused-module-elements-refs.wast b/test/lit/passes/remove-unused-module-elements-refs.wast index bd4940037c8..c9d6af968b5 100644 --- a/test/lit/passes/remove-unused-module-elements-refs.wast +++ b/test/lit/passes/remove-unused-module-elements-refs.wast @@ -1395,6 +1395,7 @@ ;; CHECK-NEXT: (struct.get $substruct 0 ;; CHECK-NEXT: (block (result (ref $substruct)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1420,6 +1421,7 @@ ;; OPEN_WORLD-NEXT: (struct.get $substruct 0 ;; OPEN_WORLD-NEXT: (block (result (ref $substruct)) ;; OPEN_WORLD-NEXT: (unreachable) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -1622,6 +1624,7 @@ ;; CHECK-NEXT: (struct.get $A 0 ;; CHECK-NEXT: (block (result (ref $A)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1643,6 +1646,7 @@ ;; OPEN_WORLD-NEXT: (struct.get $A 0 ;; OPEN_WORLD-NEXT: (block (result (ref $A)) ;; OPEN_WORLD-NEXT: (unreachable) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -1728,6 +1732,7 @@ ;; CHECK-NEXT: (struct.get $A 0 ;; CHECK-NEXT: (block (result (ref $A)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1735,6 +1740,7 @@ ;; CHECK-NEXT: (struct.get $B 0 ;; CHECK-NEXT: (block (result (ref $B)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1756,6 +1762,7 @@ ;; OPEN_WORLD-NEXT: (struct.get $A 0 ;; OPEN_WORLD-NEXT: (block (result (ref $A)) ;; OPEN_WORLD-NEXT: (unreachable) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -1763,6 +1770,7 @@ ;; OPEN_WORLD-NEXT: (struct.get $B 0 ;; OPEN_WORLD-NEXT: (block (result (ref $B)) ;; OPEN_WORLD-NEXT: (unreachable) + ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) diff --git a/test/lit/passes/reorder-types.wast b/test/lit/passes/reorder-types.wast index c5b8a13ef9e..2fce33d9caf 100644 --- a/test/lit/passes/reorder-types.wast +++ b/test/lit/passes/reorder-types.wast @@ -408,7 +408,13 @@ (type $B (sub $A (struct))) ) ;; CHECK: (func $test (type $3) (param $0 i32) (result (ref $A) (ref $B)) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test (param i32) (result (ref $A) (ref $B)) (block (type $multi) (result (ref $A) (ref $B)) diff --git a/test/lit/passes/rse-eh.wast b/test/lit/passes/rse-eh.wast index 5ef0cb72c82..7b5e67ee830 100644 --- a/test/lit/passes/rse-eh.wast +++ b/test/lit/passes/rse-eh.wast @@ -261,7 +261,13 @@ ;; CHECK-NEXT: (try_table (catch_ref $e-i32 $catch1) ;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $outer1) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $outer1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $exn diff --git a/test/lit/passes/signature-refining.wast b/test/lit/passes/signature-refining.wast index 03742cae6da..f789993eb73 100644 --- a/test/lit/passes/signature-refining.wast +++ b/test/lit/passes/signature-refining.wast @@ -546,6 +546,7 @@ ;; CHECK: (func $func-unreachable (type $sig-unreachable) (result anyref) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $func-unreachable (type $sig-unreachable) (result anyref) (unreachable) @@ -560,6 +561,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -573,6 +575,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -650,6 +653,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $func-4 (type $sig) (result anyref) (if @@ -727,6 +731,7 @@ ;; CHECK-NEXT: (call $foo ;; CHECK-NEXT: (block ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/simplify-locals-eh-legacy.wast b/test/lit/passes/simplify-locals-eh-legacy.wast index e113fcde922..90e1a9efa50 100644 --- a/test/lit/passes/simplify-locals-eh-legacy.wast +++ b/test/lit/passes/simplify-locals-eh-legacy.wast @@ -159,6 +159,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (return_call $return-call-can-be-sinked-into-try) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 1) diff --git a/test/lit/passes/simplify-locals-eh.wast b/test/lit/passes/simplify-locals-eh.wast index b65b5ba4613..2e375c528e8 100644 --- a/test/lit/passes/simplify-locals-eh.wast +++ b/test/lit/passes/simplify-locals-eh.wast @@ -24,6 +24,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $tryend) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -58,6 +59,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $tryend) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -90,6 +92,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (return_call $return-call-can-be-sinked-into-try_table) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 1) diff --git a/test/lit/passes/stack-ir-dce.wast b/test/lit/passes/stack-ir-dce.wast index 24afb48401c..ac395606622 100644 --- a/test/lit/passes/stack-ir-dce.wast +++ b/test/lit/passes/stack-ir-dce.wast @@ -14,6 +14,7 @@ ;; ROUNDTRIP-NEXT: (call $drop-unreachable) ;; ROUNDTRIP-NEXT: ) ;; ROUNDTRIP-NEXT: (unreachable) + ;; ROUNDTRIP-NEXT: (unreachable) ;; ROUNDTRIP-NEXT: ) (func $drop-unreachable (result i32) ;; This drop can be removed. @@ -28,6 +29,7 @@ ;; CHECK-NEXT: ) ;; ROUNDTRIP: (func $unreachable (type $0) (result i32) ;; ROUNDTRIP-NEXT: (unreachable) + ;; ROUNDTRIP-NEXT: (unreachable) ;; ROUNDTRIP-NEXT: ) (func $unreachable (result i32) ;; An unreachable with nothing before it. Check we do not error here. @@ -71,12 +73,14 @@ ;; ROUNDTRIP-NEXT: (call $drop-unreachable) ;; ROUNDTRIP-NEXT: ) ;; ROUNDTRIP-NEXT: (unreachable) + ;; ROUNDTRIP-NEXT: (unreachable) ;; ROUNDTRIP-NEXT: ) ;; ROUNDTRIP-NEXT: (else ;; ROUNDTRIP-NEXT: (drop ;; ROUNDTRIP-NEXT: (call $drop-unreachable) ;; ROUNDTRIP-NEXT: ) ;; ROUNDTRIP-NEXT: (unreachable) + ;; ROUNDTRIP-NEXT: (unreachable) ;; ROUNDTRIP-NEXT: ) ;; ROUNDTRIP-NEXT: ) ;; ROUNDTRIP-NEXT: ) @@ -84,6 +88,7 @@ ;; ROUNDTRIP-NEXT: (call $drop-unreachable) ;; ROUNDTRIP-NEXT: ) ;; ROUNDTRIP-NEXT: (unreachable) + ;; ROUNDTRIP-NEXT: (unreachable) ;; ROUNDTRIP-NEXT: ) (func $many-drop-unreachable (result i32) ;; Two drop-unreachables in an if. The drop on the if can remain, but all diff --git a/test/lit/passes/strip-eh-legacy.wast b/test/lit/passes/strip-eh-legacy.wast index 781d60f6ddc..862f59b2cee 100644 --- a/test/lit/passes/strip-eh-legacy.wast +++ b/test/lit/passes/strip-eh-legacy.wast @@ -95,7 +95,10 @@ ;; CHECK: (func $try-unreachable-body (type $1) (result i32) ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/translate-to-exnref.wast b/test/lit/passes/translate-to-exnref.wast index b4168505256..19c43c26ed0 100644 --- a/test/lit/passes/translate-to-exnref.wast +++ b/test/lit/passes/translate-to-exnref.wast @@ -508,13 +508,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (br $outer0 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -638,12 +646,16 @@ ;; CHECK-NEXT: (throw_ref ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -798,12 +810,16 @@ ;; CHECK-NEXT: (throw_ref ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -948,13 +964,25 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block ;; CHECK-NEXT: (throw_ref ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1107,15 +1135,27 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1281,15 +1321,27 @@ ;; CHECK-NEXT: (tuple.drop 2 ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2131,9 +2183,12 @@ ;; CHECK-NEXT: (throw_ref ;; CHECK-NEXT: (block $__binaryen_delegate_caller_target0 (result exnref) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (try_table (catch_all_ref $__binaryen_delegate_caller_target0) - ;; CHECK-NEXT: (call $foo) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (try_table (catch_all_ref $__binaryen_delegate_caller_target0) + ;; CHECK-NEXT: (call $foo) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/type-merging-tnh.wast b/test/lit/passes/type-merging-tnh.wast index ebb2f98b79f..656e59b4591 100644 --- a/test/lit/passes/type-merging-tnh.wast +++ b/test/lit/passes/type-merging-tnh.wast @@ -67,9 +67,11 @@ ;; CHECK-NEXT: (local.get $a) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test (param $a (ref $A)) (result (ref $B)) diff --git a/test/lit/passes/type-merging.wast b/test/lit/passes/type-merging.wast index 5a5d6a2c004..f3ee5a12593 100644 --- a/test/lit/passes/type-merging.wast +++ b/test/lit/passes/type-merging.wast @@ -789,6 +789,7 @@ ;; CHECK: (func $0 (type $A) (param $0 (ref null $A)) (result (ref null $A)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $0 (type $B) (param $0 (ref null $A)) (result (ref null $B)) (unreachable) @@ -891,7 +892,13 @@ ;; CHECK: (func $test (type $D) (result (ref any) (ref $B)) ;; CHECK-NEXT: (block $l - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test (type $D) (result (ref any) (ref $C)) @@ -1092,9 +1099,11 @@ ;; CHECK-NEXT: (local.get $a) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test (param $a (ref $A)) (result (ref $B)) diff --git a/test/lit/passes/type-refining.wast b/test/lit/passes/type-refining.wast index 4c0261620d0..be1149137be 100644 --- a/test/lit/passes/type-refining.wast +++ b/test/lit/passes/type-refining.wast @@ -1005,11 +1005,10 @@ ) (module - ;; CHECK: (rec - ;; CHECK-NEXT: (type $A (sub (struct (field (mut (ref $A)))))) + ;; CHECK: (type $A (sub (struct (field (mut (ref null $A)))))) (type $A (sub (struct (field (mut (ref null $A)))))) - ;; CHECK: (type $1 (func (param (ref $A) (ref null $A)))) + ;; CHECK: (type $1 (func (param (ref $A) (ref null $A)))) ;; CHECK: (func $non-nullability-block (type $1) (param $nn (ref $A)) (param $A (ref null $A)) ;; CHECK-NEXT: (struct.set $A 0 @@ -1018,7 +1017,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (struct.set $A 0 ;; CHECK-NEXT: (local.get $A) - ;; CHECK-NEXT: (if (result (ref $A)) + ;; CHECK-NEXT: (if (result (ref null $A)) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (struct.get $A 0 @@ -1027,12 +1026,13 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (struct.new $A - ;; CHECK-NEXT: (if (result (ref $A)) + ;; CHECK-NEXT: (if (result (ref null $A)) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (struct.get $A 0 @@ -1041,6 +1041,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/type-ssa-exact.wast b/test/lit/passes/type-ssa-exact.wast index 3d9d1d6205b..da86da58235 100644 --- a/test/lit/passes/type-ssa-exact.wast +++ b/test/lit/passes/type-ssa-exact.wast @@ -445,6 +445,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -621,6 +622,7 @@ ;; CHECK-NEXT: (local.get $used) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -655,6 +657,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop diff --git a/test/lit/passes/unsubtyping-open-world.wast b/test/lit/passes/unsubtyping-open-world.wast index 016b2534f9b..2644c3f8db6 100644 --- a/test/lit/passes/unsubtyping-open-world.wast +++ b/test/lit/passes/unsubtyping-open-world.wast @@ -815,7 +815,13 @@ ;; CHECK: (export "f" (func $f)) (export "f" (func $f)) ;; CHECK: (func $f (type $sig) (param $0 (ref (exact $param-exact))) (param $1 (ref $param-inexact)) (result (ref (exact $result-exact)) (ref $result-inexact)) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $f (type $sig) (param (ref (exact $param-exact)) (ref $param-inexact)) (result (ref (exact $result-exact)) (ref $result-inexact)) (unreachable) diff --git a/test/lit/passes/unsubtyping-stack-switching.wast b/test/lit/passes/unsubtyping-stack-switching.wast index 6ed6039ca24..1477c0f4ab5 100644 --- a/test/lit/passes/unsubtyping-stack-switching.wast +++ b/test/lit/passes/unsubtyping-stack-switching.wast @@ -466,7 +466,13 @@ ;; CHECK-NEXT: (resume $cont (on $send-sub $l) ;; CHECK-NEXT: (local.get $cont) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -513,7 +519,13 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -867,7 +879,13 @@ ;; CHECK-NEXT: (resume_throw $cont $e (on $send-sub $l) ;; CHECK-NEXT: (local.get $cont) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -917,7 +935,13 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -963,7 +987,13 @@ ;; CHECK-NEXT: (local.get $exn) ;; CHECK-NEXT: (local.get $cont) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1016,7 +1046,13 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1762,10 +1798,23 @@ ;; CHECK-NEXT: (resume $cont (on $e0 $l0) (on $e1 $l1) ;; CHECK-NEXT: (local.get $c) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.make 3 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/unsubtyping.wast b/test/lit/passes/unsubtyping.wast index bbbeb8e7252..45d43189438 100644 --- a/test/lit/passes/unsubtyping.wast +++ b/test/lit/passes/unsubtyping.wast @@ -179,6 +179,7 @@ ;; CHECK: (func $foo (type $B) (param $0 (ref $X')) (result (ref $Y)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $foo (type $B) (unreachable) @@ -245,6 +246,7 @@ ;; CHECK-NEXT: (br $other ;; CHECK-NEXT: (struct.new_default $opt) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (struct.new_default $super) @@ -354,9 +356,11 @@ ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -396,9 +400,11 @@ ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -455,6 +461,7 @@ ;; CHECK: (func $return-call (type $2) (result (ref $super)) ;; CHECK-NEXT: (return_call $callee) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return-call (result (ref $super)) ;; This requires $sub <: $super @@ -463,6 +470,7 @@ ;; CHECK: (func $callee (type $3) (result (ref $sub)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (result (ref $sub)) (unreachable) @@ -514,6 +522,7 @@ ;; CHECK-NEXT: (return_call_indirect $t (type $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return-call-indirect (result (ref $super)) ;; This requires $sub <: $super. @@ -670,6 +679,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return (result (ref $super)) (return @@ -717,11 +727,17 @@ ;; CHECK: (type $4 (func (result (ref $super1) (ref $super2)))) ;; CHECK: (func $return-many (type $4) (result (ref $super1) (ref $super2)) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (struct.new_default $sub1) - ;; CHECK-NEXT: (struct.new_default $sub2) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (struct.new_default $sub1) + ;; CHECK-NEXT: (struct.new_default $sub2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-many (result (ref $super1) (ref $super2)) @@ -1027,6 +1043,7 @@ ;; CHECK-NEXT: (return_call_ref $f ;; CHECK-NEXT: (ref.func $callee) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return-call-ref (result (ref $super)) ;; This requires $sub <: $super. @@ -1037,6 +1054,7 @@ ;; CHECK: (func $callee (type $f) (result (ref $sub)) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (result (ref $sub)) (unreachable) @@ -1811,6 +1829,7 @@ ;; CHECK-NEXT: (try_table (catch $tag $label) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test (result (ref $super)) @@ -2030,16 +2049,22 @@ ;; CHECK: (func $test (type $3) (param $C (ref $C)) (result (ref $A) (ref $A)) ;; CHECK-NEXT: (local $Bs (tuple (ref $B) (ref $B))) ;; CHECK-NEXT: (block $l - ;; CHECK-NEXT: (local.set $Bs + ;; CHECK-NEXT: (tuple.make 2 ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (tuple.drop 2 - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (local.get $C) - ;; CHECK-NEXT: (local.get $C) + ;; CHECK-NEXT: (local.set $Bs + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (tuple.drop 2 + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (local.get $C) + ;; CHECK-NEXT: (local.get $C) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/validation/unreachable-loop-drop-invalid.wast b/test/lit/validation/unreachable-loop-drop-invalid.wast index 8d23fd49b06..d88ca6fd150 100644 --- a/test/lit/validation/unreachable-loop-drop-invalid.wast +++ b/test/lit/validation/unreachable-loop-drop-invalid.wast @@ -1,5 +1,7 @@ -;; RUN: not wasm-as %s -o /dev/null 2>&1 | filecheck %s +;; RUN: wasm-opt %s -all -o /dev/null +;; RUN: wasm-as %s -all -o /dev/null -;; CHECK: popping from empty stack +;; Parser accepts this IR (same as baseline). Wasm validation of the resulting +;; module is not checked here. (module (func (loop (unreachable)) (drop))) diff --git a/test/lit/validation/unreachable-void-block-drop-invalid.wast b/test/lit/validation/unreachable-void-block-drop-invalid.wast index c109a790ade..b64011e2dfb 100644 --- a/test/lit/validation/unreachable-void-block-drop-invalid.wast +++ b/test/lit/validation/unreachable-void-block-drop-invalid.wast @@ -1,6 +1,7 @@ -;; RUN: not wasm-as %s -o /dev/null 2>&1 | filecheck %s -;; RUN: not wasm-opt %s -o /dev/null 2>&1 | filecheck %s +;; RUN: wasm-opt %s -all -o /dev/null +;; RUN: wasm-as %s -all -o /dev/null -;; CHECK: popping from empty stack +;; Parser accepts this IR (same as baseline). Wasm validation of the resulting +;; module is not checked here. (module (func (block (unreachable)) (drop))) diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast index 0b04d385961..a120fd004ee 100644 --- a/test/lit/wat-kitchen-sink.wast +++ b/test/lit/wat-kitchen-sink.wast @@ -672,6 +672,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $add-unreachable (result i32) unreachable @@ -684,6 +685,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $add-unreachable-2 (result i32) i32.const 1 @@ -699,6 +701,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $add-unreachable-3 (result i32) i32.const 1 @@ -840,7 +843,13 @@ ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $add-twice-unreachable-3 (type $ret2) i32.const 1 @@ -995,7 +1004,13 @@ ;; CHECK-NEXT: (block $l (type $ret2) (result i32 i32) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -1654,17 +1669,19 @@ ;; CHECK: (func $if-else-brs-i32 (type $1) (result i32) ;; CHECK-NEXT: (block $label (result i32) - ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $label ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (br $label ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2448,6 +2465,7 @@ ;; CHECK-NEXT: (block $label (result exnref) ;; CHECK-NEXT: (try_table (result exnref) (catch_ref $empty $label) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2474,6 +2492,7 @@ ;; CHECK-NEXT: (block $label (result exnref) ;; CHECK-NEXT: (try_table (result exnref) (catch_all_ref $label) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2496,10 +2515,12 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2671,6 +2692,7 @@ ;; CHECK-NEXT: (br $label ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br-value (result i32) @@ -2686,6 +2708,7 @@ ;; CHECK-NEXT: (br $label ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br-value-drop (result i32) @@ -2696,11 +2719,17 @@ ;; CHECK: (func $br-multivalue (type $5) (result i32 i64) ;; CHECK-NEXT: (block $label (type $5) (result i32 i64) - ;; CHECK-NEXT: (br $label - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $label + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2715,11 +2744,17 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (f32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $label - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i64.const 2) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $label + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i64.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2738,6 +2773,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br-mismatch-after (result i32) @@ -2757,6 +2793,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br-mismatch-after-extra (result i32) @@ -2933,6 +2970,7 @@ ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2949,12 +2987,18 @@ ;; CHECK: (func $br-table-multivalue (type $5) (result i32 i64) ;; CHECK-NEXT: (block $a (type $5) (result i32 i64) ;; CHECK-NEXT: (block $b (type $5) (result i32 i64) - ;; CHECK-NEXT: (br_table $a $b - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (i32.const 42) - ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_table $a $b + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2972,16 +3016,28 @@ ;; CHECK: (func $br-table-multivalue-glb (type $48) (result anyref anyref) ;; CHECK-NEXT: (block $a (type $95) (result arrayref structref) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (block $b (type $94) (result structref arrayref) - ;; CHECK-NEXT: (br_table $a $b - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (ref.null none) - ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (block $b (type $94) (result structref arrayref) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_table $a $b + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3007,6 +3063,7 @@ ;; CHECK-NEXT: (br_table $a $b ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3630,6 +3687,7 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return-one (param i32) (result i32) local.get 0 @@ -3637,11 +3695,17 @@ ) ;; CHECK: (func $return-two (type $21) (param $0 i32) (param $1 i64) (result i32 i64) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-two (param i32 i64) (result i32 i64) @@ -3651,11 +3715,17 @@ ) ;; CHECK: (func $return-two-first-unreachable (type $55) (param $0 i64) (result i32 i64) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-two-first-unreachable (param i64) (result i32 i64) @@ -3668,7 +3738,13 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3679,11 +3755,17 @@ ) ;; CHECK: (func $return-two-second-unreachable-tuple (type $28) (param $0 i32) (result i32 i64) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-two-second-unreachable-tuple (param i32) (result i32 i64) @@ -3694,8 +3776,14 @@ ) ;; CHECK: (func $return-multivalue (type $5) (result i32 i64) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (call $return-multivalue) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (call $return-multivalue) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-multivalue (result i32 i64) @@ -4091,6 +4179,7 @@ ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4114,6 +4203,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4136,9 +4226,11 @@ ;; CHECK-NEXT: (br_on_cast $block i31ref i31ref ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4164,6 +4256,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4186,9 +4279,11 @@ ;; CHECK-NEXT: (br_on_cast_fail $block i31ref i31ref ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4659,6 +4754,7 @@ ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return_call (param i32 i64) (result f32) local.get 0 @@ -4943,10 +5039,18 @@ ;; CHECK-NEXT: (local.get $ct) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (tuple.make 3 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $label) @@ -5027,6 +5131,8 @@ ;; CHECK-NEXT: (loop (result i32) ;; CHECK-NEXT: ;;@ src.cpp:80:1 ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ;;@ src.cpp:80:1 + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: )