From a81f7d14c598caad373b2af70142dc25eda454c7 Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Thu, 6 Aug 2026 23:56:38 +0530 Subject: [PATCH 1/8] 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/8] 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/8] 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/8] 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/8] 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/8] 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/8] 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: ) From 999c1cdeda05aef5e9a92288b2ba92105e4e191d Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Sun, 16 Aug 2026 17:32:00 +0530 Subject: [PATCH 8/8] Fix #8785: validate Wasm stack in IRBuilder without changing parsed IR. Track wasmStackType as a shadow operand stack for parse-time validation only; IR packaging still uses expr->type as on main. Reject Wasm stack underflow when validation is enabled and reuse --no-validation as the opt-out for tests that parse valid Binaryen IR but invalid Wasm. Restore lit -S expectations from main and add focused unreachable validation regressions. Signed-off-by: Gaurav Chaudhary --- docs/PR-8978-description.md | 55 +++ src/parser/contexts.h | 11 +- src/parser/parse-5-defs.cpp | 3 +- src/parser/wat-parser.cpp | 22 +- src/parser/wat-parser.h | 9 +- src/passes/Outlining.cpp | 3 +- src/tools/wasm-as.cpp | 6 +- src/tools/wasm-ctor-eval.cpp | 2 + src/tools/wasm-dis.cpp | 1 + src/tools/wasm-emscripten-finalize.cpp | 1 + src/tools/wasm-merge.cpp | 1 + src/tools/wasm-metadce.cpp | 1 + src/tools/wasm-opt.cpp | 5 +- src/tools/wasm-reduce/wasm-reduce.cpp | 1 + src/tools/wasm-split/wasm-split.cpp | 1 + src/tools/wasm2c/wasm2c.cpp | 1 + src/tools/wasm2js.cpp | 1 + src/wasm-binary.h | 5 + src/wasm-io.h | 4 + src/wasm-ir-builder.h | 6 +- src/wasm/wasm-io.cpp | 10 +- src/wasm/wasm-ir-builder.cpp | 221 +++------- test/lit/array-multibyte.wast | 2 +- 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 | 96 ++++- 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 | 53 +-- 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 | 195 +++------ .../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 +- ...nreachable-concrete-block-end-invalid.wast | 13 + .../unreachable-concrete-block-end-valid.wast | 13 - .../unreachable-if-double-drop-invalid.wast | 11 +- .../unreachable-loop-drop-invalid.wast | 9 +- .../unreachable-multivalue-drop-invalid.wast | 15 + .../unreachable-multivalue-drop-valid.wast | 12 + .../unreachable-stack-isolation-invalid.wast | 13 + .../unreachable-try-return-call-valid.wast | 8 +- ...chable-void-block-drop-folded-invalid.wast | 6 + .../unreachable-void-block-drop-invalid.wast | 9 +- test/lit/wasm-split/split-module-items.wast | 2 +- test/lit/wat-kitchen-sink.wast | 180 ++------ 125 files changed, 1128 insertions(+), 2716 deletions(-) create mode 100644 docs/PR-8978-description.md create mode 100644 test/lit/validation/unreachable-concrete-block-end-invalid.wast delete mode 100644 test/lit/validation/unreachable-concrete-block-end-valid.wast create mode 100644 test/lit/validation/unreachable-multivalue-drop-invalid.wast create mode 100644 test/lit/validation/unreachable-multivalue-drop-valid.wast create mode 100644 test/lit/validation/unreachable-stack-isolation-invalid.wast create mode 100644 test/lit/validation/unreachable-void-block-drop-folded-invalid.wast diff --git a/docs/PR-8978-description.md b/docs/PR-8978-description.md new file mode 100644 index 00000000000..ec59cb6a234 --- /dev/null +++ b/docs/PR-8978-description.md @@ -0,0 +1,55 @@ +## Summary + +Fixes [#8785](https://github.com/WebAssembly/binaryen/issues/8785): `wasm-opt` / `wasm-as` now reject Wasm operand-stack underflow at parse time (e.g. `(block (unreachable)) (drop)`), matching engines like V8, while **valid Wasm still parses to the same Binaryen IR as `main`**. + +## Problem + +Binaryen IR types void unreachable control flow as bottom (`unreachable`), so IRBuilder historically accepted patterns that are invalid on the Wasm stack. After a void `(block (unreachable))` completes, the Wasm stack is empty, but Binaryen still treated the block as a poppable IR operand. `WasmValidator` cannot catch this because it never models the Wasm operand stack. + +## Approach + +Track a **shadow** Wasm stack type (`StackEntry::wasmStackType`) alongside each parsed expression, mirroring `StackIRGenerator::makeStackInst` in `wasm-stack.cpp`: + +- **IR packaging** still uses `expr->type` (same as `main`): `hoistLastValue`, `ChildPopper::pop`, and `finishScope` are unchanged from baseline IR behavior. +- **Validation overlay** runs only when `PassOptions.validate` is true. Underflow on the shadow stack returns `popping from empty stack`. +- **`pushControlFlow`** records the **declared** Wasm block result (`none`, concrete, or multivalue tuple), not Binaryen bottom typing. Void unreachable blocks do **not** enter polymorphic mode in the parent scope (unlike plain `unreachable` instructions). +- Control-flow isolation uses the existing per-`ScopeCtx` `exprStack`; no global Wasm stack. + +## Opt-out + +Reuses existing flags (no new CLI option): + +- `wasm-opt` / most tools: `--no-validation` / `-n` → `PassOptions.validate = false` → skips Wasm stack checks during parse. +- `wasm-as`: also respects `--validate=none`. +- Internal IR reconstruction (`Outlining.cpp`) constructs `IRBuilder` with `validateWasmStack = false`. + +## Non-goals + +- No IR-shape changes for valid Wasm modules (reverted ~91 lit `-S` expectation diffs from the prior PR attempt). +- No full Wasm spec validator in `WasmValidator` (IR lacks enough stack detail; parser is the right place). +- Tests that intentionally parse valid Binaryen IR / invalid Wasm use `--no-validation` on those RUN lines only. + +## Performance + +Parse-only benchmark on `wat-kitchen-sink.wasm` (~5 KB), 100 iterations, `-all`: + +| Mode | Total time | Per parse (approx.) | +|------|------------|---------------------| +| Validation ON (default) | 724 ms | ~7.2 ms | +| `--no-validation` | 570 ms | ~5.7 ms | + +Overhead for shadow-stack tracking: **~21%** on this small module (fixed per-entry work; expect lower relative overhead on large binaries). + +## Tests + +- New/updated `test/lit/validation/unreachable-*.wast`: #8785 rejection, `--no-validation` bypass, multivalue, stack isolation, folded vs linear WAT. +- Restored lit `-S` expectations from `main` (except new validation tests). +- Targeted regressions: `array-multibyte`, `wat-kitchen-sink`, `remove-unused-brs_enable-multivalue`, `wasm-split/split-module-items` (pipe/opt-out where input is Binaryen-IR-shaped). +- `binaryen-unittests`: 379/379. + +## Test plan + +- [x] `binaryen-lit test/lit/validation/unreachable-*.wast` +- [x] `binaryen-lit` IR-shape fixtures listed above +- [x] `binaryen-unittests` +- [x] Manual: `wasm-opt jj.wat -all` rejects #8785; `--no-validation` accepts diff --git a/src/parser/contexts.h b/src/parser/contexts.h index 9602a17ce1f..b98be7c3f12 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -1054,6 +1054,8 @@ struct ParseDeclsCtx : NullTypeParserCtx, NullInstrParserCtx { // where we can parse their types and instructions. std::unordered_map implicitElemIndices; + bool validateWasmStack = true; + // Counters used for generating names for module elements. int funcCounter = 0; int tableCounter = 0; @@ -1077,7 +1079,8 @@ struct ParseDeclsCtx : NullTypeParserCtx, NullInstrParserCtx { return Ok{}; } - ParseDeclsCtx(Lexer& in, Module& wasm) : in(in), wasm(wasm) {} + ParseDeclsCtx(Lexer& in, Module& wasm, bool validateWasmStack = true) + : in(in), wasm(wasm), validateWasmStack(validateWasmStack) {} void addFuncType(SignatureT) {} void addContType(ContinuationT) {} @@ -1713,10 +1716,12 @@ struct ParseDefsCtx : TypeParserCtx, AnnotationParserCtx { const std::unordered_map>& typeNames, const std::unordered_map& implicitElemIndices, - const IndexMap& typeIndices) + const IndexMap& typeIndices, + bool validateWasmStack = true) : TypeParserCtx(typeIndices), in(in), wasm(wasm), builder(wasm), types(types), implicitTypes(implicitTypes), typeNames(typeNames), - implicitElemIndices(implicitElemIndices), irBuilder(wasm) {} + implicitElemIndices(implicitElemIndices), + irBuilder(wasm, validateWasmStack) {} template Result withLoc(Index pos, Result res) { if (auto err = res.getErr()) { diff --git a/src/parser/parse-5-defs.cpp b/src/parser/parse-5-defs.cpp index 31048176c42..b227b42f727 100644 --- a/src/parser/parse-5-defs.cpp +++ b/src/parser/parse-5-defs.cpp @@ -33,7 +33,8 @@ Result<> parseDefinitions( implicitTypes, typeNames, decls.implicitElemIndices, - typeIndices); + typeIndices, + decls.validateWasmStack); CHECK_ERR(parseDefs(ctx, decls.tableDefs, table)); CHECK_ERR(parseDefs(ctx, decls.globalDefs, global)); CHECK_ERR(parseDefs(ctx, decls.startDefs, start)); diff --git a/src/parser/wat-parser.cpp b/src/parser/wat-parser.cpp index 7f1f9fe16ce..39b3ff12f65 100644 --- a/src/parser/wat-parser.cpp +++ b/src/parser/wat-parser.cpp @@ -109,8 +109,11 @@ Result<> parseModuleWithDecls(ParseDeclsCtx& decls) { return Ok{}; } -Result<> doParseModule(Module& wasm, Lexer& input, bool allowExtra) { - ParseDeclsCtx decls(input, wasm); +Result<> doParseModule(Module& wasm, + Lexer& input, + bool allowExtra, + bool validateWasmStack) { + ParseDeclsCtx decls(input, wasm, validateWasmStack); CHECK_ERR(parseModule(decls)); if (!allowExtra && !decls.in.empty()) { return decls.in.err("Unexpected tokens after module"); @@ -128,22 +131,23 @@ Result<> doParseModule(Module& wasm, Lexer& input, bool allowExtra) { Result<> parseModule(Module& wasm, std::string_view in, - std::optional filename) { + std::optional filename, + bool validateWasmStack) { Lexer lexer(in, filename); - return doParseModule(wasm, lexer, /*allowExtra=*/false); + return doParseModule(wasm, lexer, /*allowExtra=*/false, validateWasmStack); } Result<> parseModule(Module& wasm, std::string_view in) { Lexer lexer(in); - return doParseModule(wasm, lexer, /*allowExtra=*/false); + return doParseModule(wasm, lexer, /*allowExtra=*/false, /*validateWasmStack=*/true); } -Result<> parseModule(Module& wasm, Lexer& lexer) { - return doParseModule(wasm, lexer, /*allowExtra=*/true); +Result<> parseModule(Module& wasm, Lexer& lexer, bool validateWasmStack) { + return doParseModule(wasm, lexer, /*allowExtra=*/true, validateWasmStack); } -Result<> parseModuleBody(Module& wasm, Lexer& lexer) { - ParseDeclsCtx decls(lexer, wasm); +Result<> parseModuleBody(Module& wasm, Lexer& lexer, bool validateWasmStack) { + ParseDeclsCtx decls(lexer, wasm, validateWasmStack); CHECK_ERR(parseModuleBody(decls)); CHECK_ERR(parseModuleWithDecls(decls)); diff --git a/src/parser/wat-parser.h b/src/parser/wat-parser.h index 389b23067be..7fb7e592c96 100644 --- a/src/parser/wat-parser.h +++ b/src/parser/wat-parser.h @@ -28,16 +28,19 @@ namespace wasm::WATParser { // Parse a single WAT module. Result<> parseModule(Module& wasm, std::string_view in, - std::optional filename = std::nullopt); + std::optional filename = std::nullopt, + bool validateWasmStack = true); // Parse a single WAT module that may have other things after it, as in a wast // file. -Result<> parseModule(Module& wasm, Lexer& lexer); +Result<> parseModule(Module& wasm, Lexer& lexer, bool validateWasmStack = true); // Similar to `parseModule`, parse the fields of a single WAT module (after the // initial module definition including its name) and stop at the ending right // paren. -Result<> parseModuleBody(Module& wasm, Lexer& lexer); +Result<> parseModuleBody(Module& wasm, + Lexer& lexer, + bool validateWasmStack = true); Result parseConst(Lexer& lexer); diff --git a/src/passes/Outlining.cpp b/src/passes/Outlining.cpp index 840a84bad37..b95d2f72f6e 100644 --- a/src/passes/Outlining.cpp +++ b/src/passes/Outlining.cpp @@ -397,7 +397,8 @@ struct ReconstructStringifyWalker : public StringifyWalker { ReconstructStringifyWalker(Module* wasm, Function* func) - : existingBuilder(*wasm), outlinedBuilder(*wasm), func(func) { + : existingBuilder(*wasm, /*validateWasmStack=*/false), + outlinedBuilder(*wasm, /*validateWasmStack=*/false), func(func) { this->setModule(wasm); ODBG(std::cerr << "\nexistingBuilder: " << &existingBuilder << " outlinedBuilder: " << &outlinedBuilder << "\n"); diff --git a/src/tools/wasm-as.cpp b/src/tools/wasm-as.cpp index 5301dfa2438..f1dcbdce42e 100644 --- a/src/tools/wasm-as.cpp +++ b/src/tools/wasm-as.cpp @@ -109,7 +109,11 @@ int main(int argc, const char* argv[]) { Module wasm; options.applyOptionsBeforeParse(wasm); - auto parsed = WATParser::parseModule(wasm, input); + auto parsed = WATParser::parseModule( + wasm, + input, + std::nullopt, + options.passOptions.validate && options.extra["validate"] != "none"); if (auto* err = parsed.getErr()) { Fatal() << err->msg; } diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp index f5b05c98220..6d96478d026 100644 --- a/src/tools/wasm-ctor-eval.cpp +++ b/src/tools/wasm-ctor-eval.cpp @@ -1617,6 +1617,7 @@ int main(int argc, const char* argv[]) { std::cout << "reading...\n"; } ModuleReader reader; + reader.setValidate(options.passOptions.validate); try { reader.read(options.extra["infile"], wasm); } catch (ParseException& p) { @@ -1643,6 +1644,7 @@ int main(int argc, const char* argv[]) { ModuleUtils::clearModule(wasm); wasm.features = features; ModuleReader reader; + reader.setValidate(options.passOptions.validate); reader.read(options.extra["infile"], wasm); } diff --git a/src/tools/wasm-dis.cpp b/src/tools/wasm-dis.cpp index d69cc1f96cc..9b178189c45 100644 --- a/src/tools/wasm-dis.cpp +++ b/src/tools/wasm-dis.cpp @@ -72,6 +72,7 @@ int main(int argc, const char* argv[]) { wasm.features = FeatureSet::All; auto moduleReader = ModuleReader(); + moduleReader.setValidate(options.passOptions.validate); try { moduleReader.readBinary(options.extra["infile"], wasm, sourceMapFilename); } catch (ParseException& p) { diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 59c091801c5..902648d2eb7 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -198,6 +198,7 @@ int main(int argc, const char* argv[]) { Module wasm; options.applyOptionsBeforeParse(wasm); ModuleReader reader; + reader.setValidate(options.passOptions.validate); // If we are not writing output then we definitely don't need to read debug // info. However, if we emit output then definitely load the names section so // that we roundtrip names properly. diff --git a/src/tools/wasm-merge.cpp b/src/tools/wasm-merge.cpp index 15367526ed3..bf7d8149fd9 100644 --- a/src/tools/wasm-merge.cpp +++ b/src/tools/wasm-merge.cpp @@ -816,6 +816,7 @@ Input source maps can be specified by adding an -ism option right after the modu options.applyOptionsBeforeParse(*currModule); ModuleReader reader; + reader.setValidate(options.passOptions.validate); try { reader.read(inputFile, *currModule, inputSourceMapFilename); } catch (ParseException& p) { diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp index 3f7c44cc5d4..100fa8964a5 100644 --- a/src/tools/wasm-metadce.cpp +++ b/src/tools/wasm-metadce.cpp @@ -548,6 +548,7 @@ int main(int argc, const char* argv[]) { std::cerr << "reading...\n"; } ModuleReader reader; + reader.setValidate(options.passOptions.validate); reader.setDWARF(debugInfo); try { reader.read(options.extra["infile"], wasm, inputSourceMapFilename); diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp index ef85804963c..be09195282f 100644 --- a/src/tools/wasm-opt.cpp +++ b/src/tools/wasm-opt.cpp @@ -321,6 +321,7 @@ For more on how to optimize effectively, see ModuleReader reader; // Enable DWARF parsing if we were asked for debug info, and were not // asked to remove it. + reader.setValidate(options.passOptions.validate); reader.setDWARF(options.passOptions.debugInfo && !willRemoveDebugInfo(options.passes)); reader.setProfile(options.profile); @@ -382,7 +383,9 @@ For more on how to optimize effectively, see // Add the second module. Module second; second.features = wasm.features; - ModuleReader().read(fuzzExecSecond, second); + ModuleReader secondReader; + secondReader.setValidate(options.passOptions.validate); + secondReader.read(fuzzExecSecond, second); results.collect(wasm, &second); } diff --git a/src/tools/wasm-reduce/wasm-reduce.cpp b/src/tools/wasm-reduce/wasm-reduce.cpp index 42eb113bd34..678282296eb 100644 --- a/src/tools/wasm-reduce/wasm-reduce.cpp +++ b/src/tools/wasm-reduce/wasm-reduce.cpp @@ -381,6 +381,7 @@ struct Reducer module->features = FeatureSet::All; ModuleReader reader; + reader.setValidate(toolOptions.passOptions.validate); try { reader.read(working, *module); } catch (ParseException& p) { diff --git a/src/tools/wasm-split/wasm-split.cpp b/src/tools/wasm-split/wasm-split.cpp index 112a001dd01..7183f7255dc 100644 --- a/src/tools/wasm-split/wasm-split.cpp +++ b/src/tools/wasm-split/wasm-split.cpp @@ -39,6 +39,7 @@ namespace { void parseInput(Module& wasm, const WasmSplitOptions& options) { options.applyOptionsBeforeParse(wasm); ModuleReader reader; + reader.setValidate(options.passOptions.validate); reader.setProfile(options.profile); try { reader.read(options.inputFiles[0], wasm); diff --git a/src/tools/wasm2c/wasm2c.cpp b/src/tools/wasm2c/wasm2c.cpp index ba5e5c70d7d..01be347b4bc 100644 --- a/src/tools/wasm2c/wasm2c.cpp +++ b/src/tools/wasm2c/wasm2c.cpp @@ -101,6 +101,7 @@ int main(int argc, const char* argv[]) { options.applyOptionsBeforeParse(wasm); try { ModuleReader reader; + reader.setValidate(options.passOptions.validate); reader.read(options.infile, wasm, ""); } catch (ParseException& p) { p.dump(std::cerr); diff --git a/src/tools/wasm2js.cpp b/src/tools/wasm2js.cpp index 3612b9194bb..b5fee281d36 100644 --- a/src/tools/wasm2js.cpp +++ b/src/tools/wasm2js.cpp @@ -947,6 +947,7 @@ int main(int argc, const char* argv[]) { wasm = std::make_shared(); options.applyOptionsBeforeParse(*wasm); ModuleReader reader; + reader.setValidate(options.passOptions.validate); reader.read(input, *wasm, ""); } else { auto input(read_file(options.extra["infile"], Flags::Text)); diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 6c5787f13ac..abba29a9c8b 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -1593,6 +1593,7 @@ class WasmBinaryReader { bool debugInfo = true; bool DWARF = false; bool skipFunctionBodies = false; + bool validateWasmStack = true; // Internal state. @@ -1618,6 +1619,10 @@ class WasmBinaryReader { void setSkipFunctionBodies(bool skipFunctionBodies_) { skipFunctionBodies = skipFunctionBodies_; } + void setValidateWasmStack(bool validateWasmStack_) { + validateWasmStack = validateWasmStack_; + builder.setValidateWasmStack(validateWasmStack_); + } void read(); void readCustomSection(size_t payloadLen); diff --git a/src/wasm-io.h b/src/wasm-io.h index 01d9462a5ca..f28c782ea02 100644 --- a/src/wasm-io.h +++ b/src/wasm-io.h @@ -53,6 +53,8 @@ class ModuleReader : public ModuleIOBase { skipFunctionBodies = skipFunctionBodies_; } + void setValidate(bool validate_) { validate = validate_; } + // read text void readText(std::string filename, Module& wasm); // read binary @@ -75,6 +77,8 @@ class ModuleReader : public ModuleIOBase { bool skipFunctionBodies = false; + bool validate = true; + FeatureSet featuresSectionFeatures = FeatureSet::MVP; void readStdin(Module& wasm, std::string sourceMapFilename); diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index c653d6952c7..6377abdc32f 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -40,7 +40,10 @@ namespace wasm { // globals, tables, functions, etc.) to already exist in the module. class IRBuilder : public UnifiedExpressionVisitor> { public: - IRBuilder(Module& wasm) : wasm(wasm), builder(wasm) {} + IRBuilder(Module& wasm, bool validateWasmStack = true) + : wasm(wasm), builder(wasm), validateWasmStack(validateWasmStack) {} + + void setValidateWasmStack(bool value) { validateWasmStack = value; } // Get the valid Binaryen IR expression representing the sequence of visited // instructions. The IRBuilder is reset and can be used with a fresh sequence @@ -327,6 +330,7 @@ class IRBuilder : public UnifiedExpressionVisitor> { Module& wasm; Function* func = nullptr; Builder builder; + bool validateWasmStack = true; // Used for setting DWARF expression locations. size_t* binaryPos = nullptr; diff --git a/src/wasm/wasm-io.cpp b/src/wasm/wasm-io.cpp index 77fc57e57b7..7b3d7b3dad8 100644 --- a/src/wasm/wasm-io.cpp +++ b/src/wasm/wasm-io.cpp @@ -37,8 +37,9 @@ namespace wasm { static void readTextData(std::optional filename, std::string& input, Module& wasm, - IRProfile profile) { - if (auto parsed = WATParser::parseModule(wasm, input, filename); + IRProfile profile, + bool validateWasmStack) { + if (auto parsed = WATParser::parseModule(wasm, input, filename, validateWasmStack); auto err = parsed.getErr()) { Fatal() << err->msg; } @@ -47,7 +48,7 @@ static void readTextData(std::optional filename, void ModuleReader::readText(std::string filename, Module& wasm) { BYN_TRACE("reading text from " << filename << "\n"); auto input(read_file(filename, Flags::Text)); - readTextData(filename, input, wasm, profile); + readTextData(filename, input, wasm, profile, validate); } void ModuleReader::readBinaryData(std::vector& input, @@ -64,6 +65,7 @@ void ModuleReader::readBinaryData(std::vector& input, parser.setDebugInfo(debugInfo); parser.setDWARF(DWARF); parser.setSkipFunctionBodies(skipFunctionBodies); + parser.setValidateWasmStack(validate); parser.read(); if (wasm.hasFeaturesSection) { featuresSectionFeatures = parser.getFeaturesSectionFeatures(); @@ -120,7 +122,7 @@ void ModuleReader::readStdin(Module& wasm, std::string sourceMapFilename) { std::ostringstream s; s.write(input.data(), input.size()); std::string input_str = s.str(); - readTextData(std::nullopt, input_str, wasm, profile); + readTextData(std::nullopt, input_str, wasm, profile, validate); } } diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 1b58ecab5fc..25f998d132c 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -81,8 +81,6 @@ namespace wasm { 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) { @@ -90,57 +88,38 @@ bool isWasmUnreachableValue(Expression* expr, Type wasmStackType) { !Properties::isControlFlowStructure(expr); } -bool blockHasNonFallthroughControlFlow(Block* block) { - for (auto* child : block->list) { - if (hasNonFallthroughControlFlow(child)) { - return true; +MaybeResult +findLastWasmStackValueIndex(const std::vector& stack) { + for (int i = int(stack.size()) - 1; i >= 0; --i) { + if (stack[i].wasmStackType != Type::none) { + return Index(i); + } + if (isWasmUnreachableValue(stack[i].expr, stack[i].wasmStackType)) { + return Index(i); } } - return false; + return {}; } -bool hasNonFallthroughControlFlow(Expression* expr) { - if (expr->is() || expr->is() || expr->is() || - 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); - } - 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; - } +Result<> validateWasmStackOperand(bool validateWasmStack, + const std::vector& stack, + bool unreachable) { + if (!validateWasmStack) { + return Ok{}; } - if (auto* tryy = expr->dynCast()) { - if (hasNonFallthroughControlFlow(tryy->body)) { - return true; - } - for (auto* catchBody : tryy->catchBodies) { - if (hasNonFallthroughControlFlow(catchBody)) { - return true; - } + auto idx = findLastWasmStackValueIndex(stack); + if (!idx) { + if (!unreachable) { + return Err{"popping from empty stack"}; } + return Ok{}; } - if (auto* trytable = expr->dynCast()) { - return hasNonFallthroughControlFlow(trytable->body); + auto& entry = stack[*idx]; + if (entry.wasmStackType == Type::none && + !isWasmUnreachableValue(entry.expr, entry.wasmStackType)) { + return Err{"popping from empty stack"}; } - return false; + return Ok{}; } std::vector @@ -187,36 +166,20 @@ Result IRBuilder::addScratchLocal(Type type) { MaybeResult IRBuilder::hoistLastValue(bool greedy) { auto& stack = getScope().exprStack; - if (stack.empty()) { - return {}; - } int valIndex = stack.size() - 1; for (; valIndex >= 0; --valIndex) { - auto& entry = stack[valIndex]; - if (entry.wasmStackType != Type::none) { - break; - } - 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) { + if (stack[valIndex].expr->type != Type::none) { break; } } if (valIndex < 0) { - // There is no value-producing expression. + // There is no value-producing or unreachable expression. return {}; } int hoistIndex = valIndex; if (greedy) { - while (hoistIndex > 0 && - stack[hoistIndex - 1].wasmStackType == Type::none && - !isWasmUnreachableValue(stack[hoistIndex - 1].expr, - stack[hoistIndex - 1].wasmStackType)) { + while (hoistIndex > 0 && stack[hoistIndex - 1].expr->type == Type::none) { --hoistIndex; } } @@ -226,11 +189,7 @@ MaybeResult IRBuilder::hoistLastValue(bool greedy) { return HoistedVal{Index(hoistIndex), nullptr}; } auto*& expr = stack[valIndex].expr; - if (stack[valIndex].wasmStackType == Type::unreachable || - isWasmUnreachableValue(expr, stack[valIndex].wasmStackType) || - (Properties::isControlFlowStructure(expr) && - stack[valIndex].wasmStackType == Type::none && - expr->type != Type::none)) { + if (expr->type == Type::unreachable) { // No need for a scratch local to hoist an unreachable. return HoistedVal{Index(hoistIndex), nullptr}; } @@ -242,8 +201,7 @@ 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 = - stack[valIndex].wasmStackType.asWrittenGivenFeatures(wasm.features); + auto type = expr->type.asWrittenGivenFeatures(wasm.features); auto scratchIdx = addScratchLocal(type); CHECK_ERR(scratchIdx); expr = builder.makeLocalSet(*scratchIdx, expr); @@ -270,7 +228,7 @@ Result<> IRBuilder::packageHoistedValue(const HoistedVal& hoisted, pushSynthetic(block); }; - auto type = scope.exprStack.back().wasmStackType; + auto type = scope.exprStack.back().expr->type; 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. @@ -355,21 +313,14 @@ void IRBuilder::push(Expression* expr, Origin origin) { void IRBuilder::pushControlFlow(Expression* expr, Type wasmStackResult, Origin origin) { - auto& scope = getScope(); Type stackType = wasmStackResult; 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. - stackType = Type::unreachable; - } else { - stackType = Type::none; + getScope().unreachable = true; } + stackType = Type::none; } pushStackEntry(expr, stackType, origin); } @@ -570,26 +521,6 @@ 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; @@ -613,10 +544,6 @@ 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) { @@ -630,7 +557,6 @@ struct IRBuilder::ChildPopper } --childIndex; childTupleIndex = children[childIndex].constraint.size() - 1; - lastSkippedNoneAbove = std::nullopt; } // Advance to the next available value on the stack. @@ -647,19 +573,12 @@ struct IRBuilder::ChildPopper return unreachableFallbackSize; } --stackIndex; - auto& entry = scope.exprStack[stackIndex]; - if (isWasmUnreachableValue(entry.expr, entry.wasmStackType)) { - stackTupleIndex = 0; - break; - } - stackTupleIndex = entry.wasmStackType.size() - 1; + stackTupleIndex = + scope.exprStack[stackIndex].expr->type.size() - 1; } // Skip expressions that don't produce values. - if (scope.exprStack[stackIndex].wasmStackType == Type::none) { - if (scope.unreachable) { - lastSkippedNoneAbove = stackIndex; - } + if (scope.exprStack[stackIndex].expr->type == Type::none) { stackTupleIndex = 0; continue; } @@ -669,16 +588,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& entry = scope.exprStack[stackIndex]; - auto type = isWasmUnreachableValue(entry.expr, entry.wasmStackType) - ? Type::unreachable - : entry.wasmStackType[stackTupleIndex]; - if (unreachableFallbackSize || lastSkippedNoneAbove) { + auto type = scope.exprStack[stackIndex].expr->type[stackTupleIndex]; + if (unreachableFallbackSize) { auto constraint = children[childIndex].constraint[childTupleIndex]; if (!PrincipalType::matches(type, constraint)) { - if (lastSkippedNoneAbove) { - return *lastSkippedNoneAbove + 1; - } return unreachableFallbackSize; } } @@ -697,9 +610,6 @@ struct IRBuilder::ChildPopper // must be concrete. assert(type.isConcrete()); seenConcrete = true; - if (lastSkippedNoneAbove && scope.unreachable) { - unreachableFallbackSize = *lastSkippedNoneAbove + 1; - } } } @@ -732,18 +642,15 @@ struct IRBuilder::ChildPopper return Err{"popping from empty stack"}; } + CHECK_ERR(validateWasmStackOperand( + builder.validateWasmStack, scope.exprStack, scope.unreachable)); + CHECK_ERR(builder.packageHoistedValue(*hoisted, size)); - auto& entry = scope.exprStack.back(); + auto* ret = scope.exprStack.back().expr; // 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 || - isWasmUnreachableValue(entry.expr, entry.wasmStackType) || - (Properties::isControlFlowStructure(entry.expr) && - entry.wasmStackType == Type::none && - entry.expr->type != Type::none)) { - auto* ret = entry.expr; + // Unreachable values satisfy any size. + if (ret->type.size() == size || ret->type == Type::unreachable) { scope.exprStack.pop_back(); return ret; } @@ -1092,38 +999,21 @@ Result IRBuilder::finishScope(Block* block) { auto hoisted = hoistLastValue(); CHECK_ERR(hoisted); if (!hoisted) { - 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"}; - } - } else if (scope.exprStack.back().wasmStackType == Type::none) { + return Err{"popping from empty stack"}; + } + + CHECK_ERR(validateWasmStackOperand( + validateWasmStack, scope.exprStack, scope.unreachable)); + + if (scope.exprStack.back().expr->type == 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() && hoisted) { - auto hoistedType = scope.exprStack.back().wasmStackType; + if (type.isTuple()) { + auto hoistedType = scope.exprStack.back().expr->type; if (hoistedType != Type::unreachable && hoistedType.size() != type.size()) { // We cannot propagate the hoisted value directly because it does not @@ -1158,13 +1048,6 @@ Result IRBuilder::finishScope(Block* block) { // 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(exprs); } else { diff --git a/test/lit/array-multibyte.wast b/test/lit/array-multibyte.wast index 5bb339f5e21..16b8d584139 100644 --- a/test/lit/array-multibyte.wast +++ b/test/lit/array-multibyte.wast @@ -4,7 +4,7 @@ ;; Check that we can roundtrip through the text format as well. -;; RUN: wasm-opt %s -all -S -o - | wasm-opt -all -S -o - +;; RUN: wasm-opt %s -all -S -o - | wasm-opt -all --no-validation -S -o - (module diff --git a/test/lit/basic/exception-handling.wast b/test/lit/basic/exception-handling.wast index e57f1d8389b..0a0dd3e8904 100644 --- a/test/lit/basic/exception-handling.wast +++ b/test/lit/basic/exception-handling.wast @@ -173,7 +173,6 @@ ;; 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) @@ -204,7 +203,6 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) - ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -232,14 +230,7 @@ ;; 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: (br $outer) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -269,13 +260,7 @@ ;; CHECK-BIN-NEXT: (i64.const 0) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) - ;; 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: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -288,14 +273,7 @@ ;; CHECK-BIN-NEXT: (local.get $scratch_1) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) - ;; 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: (br $block2) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -351,12 +329,10 @@ ;; 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) @@ -376,12 +352,10 @@ ;; 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) @@ -431,21 +405,13 @@ ;; 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 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: (br $outer) - ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -470,17 +436,10 @@ ;; 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: (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: (br $block4) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -494,7 +453,6 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (br $block4) - ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -544,27 +502,13 @@ ;; 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: ) @@ -596,18 +540,10 @@ ;; 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: (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: (br $block4) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -630,13 +566,7 @@ ;; CHECK-BIN-NEXT: (local.get $scratch_2) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) - ;; 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: (br $block4) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -689,7 +619,6 @@ ;; 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: ) @@ -701,7 +630,6 @@ ;; 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: ) @@ -764,7 +692,6 @@ ;; 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) @@ -865,7 +792,6 @@ ;; 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: ) @@ -878,7 +804,6 @@ ;; 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: ) @@ -908,13 +833,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (i64.const 0) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; 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: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -927,14 +846,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $scratch_1) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; 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: (br $block2) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -973,12 +885,10 @@ ;; 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) @@ -1006,17 +916,10 @@ ;; 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: (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: (br $block4) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -1030,7 +933,6 @@ ;; 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: ) @@ -1063,18 +965,10 @@ ;; 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: (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: (br $block4) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -1097,13 +991,7 @@ ;; CHECK-BIN-NODEBUG-NEXT: (local.get $scratch_2) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) -;; 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: (br $block4) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -1126,7 +1014,6 @@ ;; 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: ) @@ -1156,7 +1043,6 @@ ;; 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 c693c1c66e6..953ca7d634f 100644 --- a/test/lit/basic/extra-branch-values.wast +++ b/test/lit/basic/extra-branch-values.wast @@ -1166,14 +1166,8 @@ ;; CHECK-NEXT: (local.get $scratch) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $l - ;; 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: (return + ;; CHECK-NEXT: (local.get $scratch_3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/basic/reference-types.wast b/test/lit/basic/reference-types.wast index b389364126a..4058d316d6f 100644 --- a/test/lit/basic/reference-types.wast +++ b/test/lit/basic/reference-types.wast @@ -642,7 +642,6 @@ ;; 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) @@ -657,7 +656,6 @@ ;; 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) @@ -672,7 +670,6 @@ ;; 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) @@ -687,7 +684,6 @@ ;; 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) @@ -1249,7 +1245,6 @@ ;; 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) @@ -1264,7 +1259,6 @@ ;; 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) @@ -1279,7 +1273,6 @@ ;; 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) @@ -1294,7 +1287,6 @@ ;; 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) @@ -1975,14 +1967,12 @@ ;; 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) @@ -2005,14 +1995,12 @@ ;; 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) @@ -2033,14 +2021,12 @@ ;; 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) @@ -2063,7 +2049,6 @@ ;; 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) @@ -2071,7 +2056,6 @@ ;; 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) @@ -2598,7 +2582,6 @@ ;; 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) @@ -2613,7 +2596,6 @@ ;; 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) @@ -2628,7 +2610,6 @@ ;; 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) @@ -2643,7 +2624,6 @@ ;; 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) @@ -2792,7 +2772,6 @@ ;; 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) @@ -2800,7 +2779,6 @@ ;; 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) @@ -2808,7 +2786,6 @@ ;; 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) @@ -2817,7 +2794,6 @@ ;; 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 5201c01e31c..657913b900a 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 --check-prefix=RTRIP +;; RUN: wasm-opt %s -all --disable-gc -S -o - | wasm-opt -all --disable-gc -S -o - | filecheck %s (module ;; RTRIP: (type $tuple (func (result i32 externref))) @@ -10,61 +10,23 @@ ;; CHECK: (func $f (result i32 externref) ;; CHECK-NEXT: (local $scratch (tuple i32 externref)) ;; CHECK-NEXT: (block $l (type $tuple) (result i32 externref) - ;; 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: (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: (nop) - ;; CHECK-NEXT: (local.get $scratch) + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.get $scratch) ;; 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 92cdfbaf691..541c200ecec 100644 --- a/test/lit/basic/stack_switching.wast +++ b/test/lit/basic/stack_switching.wast @@ -292,7 +292,6 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) - ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -305,7 +304,6 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) - ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -326,7 +324,6 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) - ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -339,7 +336,6 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) - ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -371,7 +367,6 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) - ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -384,7 +379,6 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) - ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -405,7 +399,6 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) - ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -418,7 +411,6 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) - ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -459,7 +451,6 @@ ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: (unreachable) - ;; CHECK-TEXT-NEXT: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -472,7 +463,6 @@ ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: (unreachable) - ;; CHECK-BIN-NEXT: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -528,7 +518,6 @@ ;; 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 @@ -543,7 +532,6 @@ ;; 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 @@ -567,7 +555,6 @@ ;; 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 @@ -576,7 +563,6 @@ ;; 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 @@ -592,7 +578,6 @@ ;; 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 @@ -601,7 +586,6 @@ ;; 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 @@ -795,7 +779,6 @@ ;; 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,7 +792,6 @@ ;; 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: ) @@ -827,7 +809,6 @@ ;; 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: ) @@ -841,7 +822,6 @@ ;; 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: ) @@ -863,7 +843,6 @@ ;; 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: ) @@ -892,7 +871,6 @@ ;; 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 @@ -909,7 +887,6 @@ ;; 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 @@ -918,7 +895,6 @@ ;; 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 5de25d20ce9..10116ce31f4 100644 --- a/test/lit/basic/stack_switching_resume.wast +++ b/test/lit/basic/stack_switching_resume.wast @@ -51,17 +51,11 @@ ;; 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: (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: (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: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -73,17 +67,11 @@ ;; 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: (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: (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: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -150,17 +138,11 @@ ;; 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: (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: (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: (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 620c8bebce5..cc5de8ef406 100644 --- a/test/lit/basic/stack_switching_resume_throw.wast +++ b/test/lit/basic/stack_switching_resume_throw.wast @@ -43,17 +43,11 @@ ;; 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: (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: (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: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -65,17 +59,11 @@ ;; 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: (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: (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: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -112,14 +100,12 @@ ;; 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 @@ -151,17 +137,11 @@ ;; 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: (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: (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: (unreachable) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) ;; CHECK-BIN-NODEBUG-NEXT: ) @@ -180,5 +160,4 @@ ;; 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 371cc31c16e..dfff790bc18 100644 --- a/test/lit/basic/types-function-references.wast +++ b/test/lit/basic/types-function-references.wast @@ -187,14 +187,7 @@ ;; 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: (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: (unreachable) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) ;; CHECK-TEXT-NEXT: ) @@ -208,14 +201,7 @@ ;; 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: (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: (unreachable) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) ;; CHECK-BIN-NEXT: ) @@ -445,14 +431,7 @@ ;; 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: (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: (unreachable) ;; 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 7feff847793..91dd9d28930 100644 --- a/test/lit/basic/unreachable-string-new.wast +++ b/test/lit/basic/unreachable-string-new.wast @@ -16,7 +16,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref array)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -27,7 +26,6 @@ ;; 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 @@ -44,7 +42,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref $array16)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -55,7 +52,6 @@ ;; 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. @@ -71,12 +67,10 @@ ;; 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 @@ -93,12 +87,10 @@ ;; 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. @@ -114,7 +106,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref $shared-array8)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -125,7 +116,6 @@ ;; 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. @@ -141,7 +131,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref (shared none))) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -152,7 +141,6 @@ ;; 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. @@ -168,7 +156,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref array)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -179,7 +166,6 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i16-bad-array (result (ref string)) block (result (ref array)) @@ -194,7 +180,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref $array8)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -205,7 +190,6 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $i16-bad-array8 (result (ref string)) block (result (ref $array8)) @@ -220,12 +204,10 @@ ;; 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)) @@ -240,12 +222,10 @@ ;; 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)) @@ -260,7 +240,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref $shared-array16)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -271,7 +250,6 @@ ;; 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)) @@ -286,7 +264,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result (ref (shared none))) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -297,7 +274,6 @@ ;; 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 b9bfc787f71..4d982654977 100644 --- a/test/lit/basic/untaken-br_if.wast +++ b/test/lit/basic/untaken-br_if.wast @@ -17,7 +17,6 @@ ;; 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) @@ -25,7 +24,6 @@ ;; 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: ) @@ -37,14 +35,12 @@ ;; 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: ) @@ -72,14 +68,12 @@ ;; 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 b9581ca49af..be6e50e5270 100644 --- a/test/lit/branch-hinting-try.wast +++ b/test/lit/branch-hinting-try.wast @@ -28,13 +28,7 @@ ;; CHECK-NEXT: (catch $tag ;; CHECK-NEXT: (@metadata.code.branch_hint "\01") ;; CHECK-NEXT: (nop) - ;; 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/cast-and-recast-tuple.wast b/test/lit/cast-and-recast-tuple.wast index 27e3c547e35..be07847f43c 100644 --- a/test/lit/cast-and-recast-tuple.wast +++ b/test/lit/cast-and-recast-tuple.wast @@ -43,13 +43,7 @@ ;; CHECK-NEXT: (local.get $scratch_3) ;; 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: ) (func $test-local-tuple-1 (param $B (ref $B)) (param $x i32) (result anyref i32) @@ -100,13 +94,7 @@ ;; CHECK-NEXT: (local.get $scratch_5) ;; 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: ) (func $test-local-tuple-2 (param $B (ref $B)) (param $x i32) (result i32 i32) @@ -156,13 +144,7 @@ ;; CHECK-NEXT: (local.get $scratch_5) ;; 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: ) (func $test-local-tuple-3 (param $B (ref $B)) (param $x i32) (result anyref i32) @@ -248,13 +230,7 @@ ;; CHECK-NEXT: (local.get $scratch_11) ;; 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: ) (func $test-local-tuple-4-bad (param $B (ref $B)) (param $x i32) (result anyref i32) @@ -393,14 +369,7 @@ ;; CHECK-NEXT: (local.get $scratch_19) ;; CHECK-NEXT: ) ;; 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: (unreachable) ;; 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 b3b41c43e40..39cb28d9fa1 100644 --- a/test/lit/control-flow-input.wast +++ b/test/lit/control-flow-input.wast @@ -315,13 +315,7 @@ ;; CHECK-NEXT: (br $label10) ;; 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: ) (func $nested-loops-multivalue (result i32 i64) diff --git a/test/lit/downgrade-reftypes.wast b/test/lit/downgrade-reftypes.wast index fbd4dfbc5d5..71d009dee0c 100644 --- a/test/lit/downgrade-reftypes.wast +++ b/test/lit/downgrade-reftypes.wast @@ -17,7 +17,6 @@ ;; CHECK-NEXT: (br $block ;; CHECK-NEXT: (ref.func $foo) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -25,7 +24,6 @@ ;; CHECK-NEXT: (br $block1 ;; CHECK-NEXT: (ref.null nofunc) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -33,7 +31,6 @@ ;; CHECK-NEXT: (br $block2 ;; CHECK-NEXT: (ref.null noextern) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -41,7 +38,6 @@ ;; 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 4893139055d..080c329a52c 100644 --- a/test/lit/isorecursive-good.wast +++ b/test/lit/isorecursive-good.wast @@ -25,8 +25,6 @@ ) (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))))) @@ -36,6 +34,7 @@ (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)) @@ -47,7 +46,6 @@ ;; 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) @@ -62,7 +60,6 @@ ;; 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) @@ -77,7 +74,6 @@ ;; 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) @@ -85,7 +81,6 @@ ;; 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 b9475491410..b8d0a1c8ea4 100644 --- a/test/lit/isorecursive-output-ordering.wast +++ b/test/lit/isorecursive-output-ordering.wast @@ -34,15 +34,7 @@ ) ;; 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: (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: (unreachable) ;; 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) @@ -95,14 +87,7 @@ ;; 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: (tuple.make 3 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; 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 ac681981e7b..d9cc14e05ab 100644 --- a/test/lit/multivalue.wast +++ b/test/lit/multivalue.wast @@ -207,7 +207,6 @@ ;; CHECK-NEXT: (i64.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable (result i64) (tuple.extract 3 1 @@ -346,17 +345,11 @@ ;; Test multivalue control structures ;; CHECK: (func $mv-return (type $0) (result i32 i64) - ;; 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: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $mv-return (result i32 i64) @@ -369,17 +362,11 @@ ) ;; CHECK: (func $mv-return-in-block (type $0) (result i32 i64) - ;; 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: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $mv-return-in-block (result i32 i64) @@ -395,17 +382,11 @@ ;; CHECK: (func $mv-block-break (type $0) (result i32 i64) ;; CHECK-NEXT: (block $block (type $0) (result i32 i64) - ;; 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: (br $block + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -502,18 +483,12 @@ ;; 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: (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: (br_table $block $block1 + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 0) ;; 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 4de048b7d41..ae1b6de079a 100644 --- a/test/lit/passes/abstract-type-refining-desc.wast +++ b/test/lit/passes/abstract-type-refining-desc.wast @@ -290,7 +290,6 @@ ;; 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) @@ -309,7 +308,6 @@ ;; 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)) @@ -349,7 +347,6 @@ ;; 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) @@ -378,7 +375,6 @@ ;; 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)) @@ -410,7 +406,6 @@ ;; 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) @@ -429,7 +424,6 @@ ;; 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)) @@ -455,7 +449,6 @@ ;; 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) @@ -468,7 +461,6 @@ ;; 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)) @@ -508,7 +500,6 @@ ;; 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) @@ -535,7 +526,6 @@ ;; 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)) @@ -567,11 +557,9 @@ ;; 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)) @@ -589,11 +577,9 @@ ;; 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 @@ -634,11 +620,9 @@ ;; 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) @@ -666,11 +650,9 @@ ;; 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 @@ -703,11 +685,9 @@ ;; 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)) @@ -725,11 +705,9 @@ ;; 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 @@ -756,11 +734,9 @@ ;; 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 @@ -772,11 +748,9 @@ ;; 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 @@ -817,11 +791,9 @@ ;; 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) @@ -847,11 +819,9 @@ ;; 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 84609ae83e9..0639ac71060 100644 --- a/test/lit/passes/abstract-type-refining.wast +++ b/test/lit/passes/abstract-type-refining.wast @@ -187,7 +187,6 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) - ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) @@ -200,7 +199,6 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) - ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) @@ -745,7 +743,6 @@ ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) - ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (drop @@ -754,7 +751,6 @@ ;; YESTNH-NEXT: (local.get $x) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: (unreachable) - ;; YESTNH-NEXT: (unreachable) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) ;; YESTNH-NEXT: ) @@ -767,7 +763,6 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (unreachable) - ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (drop @@ -776,7 +771,6 @@ ;; 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 7ebe1392dbc..fa7fb9277d6 100644 --- a/test/lit/passes/cfp.wast +++ b/test/lit/passes/cfp.wast @@ -419,7 +419,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (f32.const 42) @@ -444,8 +443,13 @@ ) ;; CHECK: (func $get (type $3) (param $struct (ref null $struct)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (struct.get $struct 0 - ;; CHECK-NEXT: (local.get $struct) + ;; 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: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/coalesce-locals-gc.wast b/test/lit/passes/coalesce-locals-gc.wast index 78d779ce8fb..5f7b2cf5f8e 100644 --- a/test/lit/passes/coalesce-locals-gc.wast +++ b/test/lit/passes/coalesce-locals-gc.wast @@ -254,7 +254,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $replace-i31-local (result i32) (local $local i31ref) @@ -277,7 +276,6 @@ ;; 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 9f5e2381773..c0733c9c087 100644 --- a/test/lit/passes/coalesce-locals-stack-switching.wast +++ b/test/lit/passes/coalesce-locals-stack-switching.wast @@ -29,7 +29,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return_call $resume @@ -39,7 +38,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $1) @@ -88,7 +86,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return_call $resume @@ -98,7 +95,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $1) @@ -144,7 +140,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $0) @@ -178,7 +173,6 @@ ;; 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 8bcab4099ad..422c06a818f 100644 --- a/test/lit/passes/coalesce-locals.wast +++ b/test/lit/passes/coalesce-locals.wast @@ -1766,7 +1766,6 @@ ;; 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) @@ -2327,7 +2326,6 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (local.get $0) @@ -2372,7 +2370,6 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (local.get $0) @@ -2510,7 +2507,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2546,7 +2542,6 @@ ;; 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 d25be7e2d5c..b256b236cfe 100644 --- a/test/lit/passes/code-folding.wast +++ b/test/lit/passes/code-folding.wast @@ -37,14 +37,12 @@ ;; 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: ) @@ -402,16 +400,12 @@ ;; 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: (drop - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $leave-inner-block-type @@ -629,25 +623,19 @@ ) ;; CHECK: (func $br-and-fallthrough-with-value (type $2) (result i32) - ;; CHECK-NEXT: (block $l (result i32) + ;; CHECK-NEXT: (block $l ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (br $l - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $l) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (br $l - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $l) ;; 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) @@ -710,31 +698,23 @@ ) ;; CHECK: (func $br-and-fallthrough-with-value-and-more (type $2) (result i32) - ;; CHECK-NEXT: (block $l (result i32) + ;; CHECK-NEXT: (block $l ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (br $l - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $l) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (br $l - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $l) ;; 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) @@ -868,7 +848,6 @@ ;; 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 8792c46c419..f19a746beaa 100644 --- a/test/lit/passes/code-pushing-eh.wast +++ b/test/lit/passes/code-pushing-eh.wast @@ -134,7 +134,6 @@ ;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $tryend) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -186,7 +185,6 @@ ;; 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 9be86a431ca..206597a28df 100644 --- a/test/lit/passes/constraint-analysis-cont.wast +++ b/test/lit/passes/constraint-analysis-cont.wast @@ -23,7 +23,6 @@ ;; 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 9e3656b888f..2dd26b27779 100644 --- a/test/lit/passes/constraint-analysis.wast +++ b/test/lit/passes/constraint-analysis.wast @@ -1822,7 +1822,6 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -1844,7 +1843,6 @@ ;; OPTIN-NEXT: (i32.const 1) ;; OPTIN-NEXT: ) ;; OPTIN-NEXT: (return) - ;; OPTIN-NEXT: (unreachable) ;; OPTIN-NEXT: ) ;; OPTIN-NEXT: ) ;; OPTIN-NEXT: (drop @@ -4557,4 +4555,98 @@ ) ) ) + + ;; CHECK: (func $tee (type $1) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (local.tee $y + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; OPTIN: (func $tee (type $1) + ;; OPTIN-NEXT: (local $x i32) + ;; OPTIN-NEXT: (local $y i32) + ;; OPTIN-NEXT: (local.set $x + ;; OPTIN-NEXT: (local.tee $y + ;; OPTIN-NEXT: (i32.const 10) + ;; OPTIN-NEXT: ) + ;; OPTIN-NEXT: ) + ;; OPTIN-NEXT: (drop + ;; OPTIN-NEXT: (i32.const 1) + ;; OPTIN-NEXT: ) + ;; OPTIN-NEXT: (drop + ;; OPTIN-NEXT: (i32.const 1) + ;; OPTIN-NEXT: ) + ;; OPTIN-NEXT: ) + (func $tee + ;; We can read values through tees. + (local $x i32) + (local $y i32) + (local.set $x + (local.tee $y + (i32.const 10) + ) + ) + (drop + (i32.eq + (local.get $x) + (i32.const 10) + ) + ) + (drop + (i32.eq + (local.get $y) + (i32.const 10) + ) + ) + ) + + ;; CHECK: (func $fallthrough (type $1) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (call $fallthrough) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; OPTIN: (func $fallthrough (type $1) + ;; OPTIN-NEXT: (local $x i32) + ;; OPTIN-NEXT: (local.set $x + ;; OPTIN-NEXT: (block (result i32) + ;; OPTIN-NEXT: (call $fallthrough) + ;; OPTIN-NEXT: (i32.const 10) + ;; OPTIN-NEXT: ) + ;; OPTIN-NEXT: ) + ;; OPTIN-NEXT: (drop + ;; OPTIN-NEXT: (i32.const 1) + ;; OPTIN-NEXT: ) + ;; OPTIN-NEXT: ) + (func $fallthrough + ;; We can read values through a fallthrough. + (local $x i32) + (local.set $x + (block (result i32) + (call $fallthrough) + (i32.const 10) + ) + ) + (drop + (i32.eq + (local.get $x) + (i32.const 10) + ) + ) + ) ) diff --git a/test/lit/passes/dae-typessa-repeat-types.wast b/test/lit/passes/dae-typessa-repeat-types.wast index 9b891869715..7072d215cac 100644 --- a/test/lit/passes/dae-typessa-repeat-types.wast +++ b/test/lit/passes/dae-typessa-repeat-types.wast @@ -68,13 +68,7 @@ ) ;; CHECK: (func $other (type $5) (result i32 (ref $struct)) - ;; 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: ) (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 ca9561f000d..66dadf17303 100644 --- a/test/lit/passes/dae2-results-indirect.wast +++ b/test/lit/passes/dae2-results-indirect.wast @@ -523,13 +523,8 @@ ) ;; CHECK: (func $caller (type $caller) (param $callee (ref $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: (return_call_ref $callee + ;; CHECK-NEXT: (local.get $callee) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $caller (type $caller) (param $callee (ref $callee)) (result i32) @@ -569,7 +564,6 @@ ;; 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 bd71fb96b7e..58e3ddb428f 100644 --- a/test/lit/passes/dae2-results-returns.wast +++ b/test/lit/passes/dae2-results-returns.wast @@ -12,16 +12,9 @@ ) ;; CHECK: (func $explicit (type $0) ;; CHECK-NEXT: (drop - ;; 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: (i32.const 2) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) (func $explicit (result i32) (return (i32.const 2)) @@ -50,7 +43,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $explicit (result i32) (return (i32.const 2)) @@ -85,7 +77,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -118,7 +109,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -152,12 +142,7 @@ (i32.const 42) ) ;; CHECK: (func $a (type $0) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (return_call $b) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return_call $b) ;; CHECK-NEXT: ) (func $a (result i32) (return_call $b) @@ -182,7 +167,6 @@ ) ;; CHECK: (func $a (type $0) (result i32) ;; CHECK-NEXT: (return_call $b) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $a (result i32) (return_call $b) @@ -226,7 +210,6 @@ ;; 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)) @@ -269,7 +252,6 @@ ;; 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)) @@ -312,7 +294,6 @@ ;; 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 @@ -336,7 +317,6 @@ ;; 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. @@ -364,12 +344,7 @@ ) ;; CHECK: (func $callee (type $0) ;; CHECK-NEXT: (local $0 f64) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result f64) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (param f64) (result f64) (unreachable) @@ -392,7 +367,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -407,12 +381,7 @@ ) ;; CHECK: (func $callee (type $0) ;; CHECK-NEXT: (local $0 f64) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result f64) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (param f64) (result f64) (unreachable) diff --git a/test/lit/passes/dae2.wast b/test/lit/passes/dae2.wast index 654da8bccb9..a74e9709612 100644 --- a/test/lit/passes/dae2.wast +++ b/test/lit/passes/dae2.wast @@ -2922,7 +2922,6 @@ ;; 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 98681dc9a1d..145ae1ff032 100644 --- a/test/lit/passes/dae_all-features.wast +++ b/test/lit/passes/dae_all-features.wast @@ -345,28 +345,16 @@ (local.get $x) ) ;; CHECK: (func $c6 (type $0) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $c6 (result i32) (unreachable) ) ;; CHECK: (func $c7 (type $0) ;; CHECK-NEXT: (drop - ;; 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: (i32.const 4) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) (func $c7 (result i32) (return (i32.const 4)) @@ -451,13 +439,10 @@ ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) - ;; 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: (drop + ;; CHECK-NEXT: (return_call_indirect $0 (type $T) + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $foo (param $x i32) (result i32) @@ -492,7 +477,6 @@ ;; 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) @@ -688,23 +672,18 @@ ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block - ;; 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: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) ;; 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) @@ -749,7 +728,6 @@ ;; 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 @@ -860,14 +838,11 @@ ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block (result f32) + ;; CHECK-NEXT: (block ;; CHECK-NEXT: (local.set $1 ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block (result f32) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $target (param $0 i64) (param $1 v128) (param $2 i64) (result f32) @@ -951,7 +926,6 @@ ;; 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 3a2016dea8c..6e78283fdce 100644 --- a/test/lit/passes/dae_tnh.wast +++ b/test/lit/passes/dae_tnh.wast @@ -69,9 +69,6 @@ ;; 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 1b315fbc0b2..0077c27bef3 100644 --- a/test/lit/passes/enclose-world.wast +++ b/test/lit/passes/enclose-world.wast @@ -5,19 +5,18 @@ (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))) - (type $C (struct (field i32 f64))) + ;; CHECK: (type $2 (func (param externref))) - ;; CHECK: (type $3 (func (param externref))) + ;; CHECK: (type $3 (func (result externref))) - ;; CHECK: (type $4 (func (result externref))) + ;; CHECK: (type $4 (func (param anyref) (result anyref))) - ;; CHECK: (type $5 (func (param anyref) (result anyref))) + ;; CHECK: (type $5 (func (param externref) (result externref))) - ;; CHECK: (type $6 (func (param externref) (result externref))) + ;; CHECK: (type $C (struct (field i32) (field f64))) + (type $C (struct (field i32 f64))) ;; CHECK: (type $7 (func (param i32) (result f64))) @@ -59,14 +58,13 @@ (f64.const 3.14159) ) - ;; CHECK: (func $externref-param (type $3) (param $x externref) + ;; CHECK: (func $externref-param (type $2) (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 $4) (result externref) - ;; CHECK-NEXT: (unreachable) + ;; CHECK: (func $externref-result (type $3) (result externref) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $externref-result (export "externref-result") (result externref) @@ -83,15 +81,13 @@ ;; 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 $5) (param $x anyref) (result anyref) - ;; CHECK-NEXT: (unreachable) + ;; CHECK: (func $anyref-both (type $4) (param $x anyref) (result anyref) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $anyref-both (export "anyref-both") (param $x anyref) (result anyref) @@ -99,8 +95,7 @@ (unreachable) ) - ;; CHECK: (func $anyref-both-dupe (type $5) (param $x anyref) (result anyref) - ;; CHECK-NEXT: (unreachable) + ;; CHECK: (func $anyref-both-dupe (type $4) (param $x anyref) (result anyref) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $anyref-both-dupe (export "anyref-both-dupe") (param $x anyref) (result anyref) @@ -112,7 +107,6 @@ ;; 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. @@ -127,7 +121,7 @@ ) ) -;; CHECK: (func $stub$anyref-param (type $3) (param $0 externref) +;; CHECK: (func $stub$anyref-param (type $2) (param $0 externref) ;; CHECK-NEXT: (call $anyref-param ;; CHECK-NEXT: (ref.cast anyref ;; CHECK-NEXT: (any.convert_extern @@ -137,13 +131,13 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $stub$anyref-result (type $4) (result externref) +;; CHECK: (func $stub$anyref-result (type $3) (result externref) ;; CHECK-NEXT: (extern.convert_any ;; CHECK-NEXT: (call $anyref-result) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $stub$anyref-both (type $6) (param $0 externref) (result externref) +;; CHECK: (func $stub$anyref-both (type $5) (param $0 externref) (result externref) ;; CHECK-NEXT: (extern.convert_any ;; CHECK-NEXT: (call $anyref-both ;; CHECK-NEXT: (ref.cast anyref @@ -155,7 +149,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $stub$anyref-both-dupe (type $6) (param $0 externref) (result externref) +;; CHECK: (func $stub$anyref-both-dupe (type $5) (param $0 externref) (result externref) ;; CHECK-NEXT: (extern.convert_any ;; CHECK-NEXT: (call $anyref-both-dupe ;; CHECK-NEXT: (ref.cast anyref @@ -213,7 +207,6 @@ ;; 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 86167650f86..3d22b41a4e5 100644 --- a/test/lit/passes/flatten-eh-legacy.wast +++ b/test/lit/passes/flatten-eh-legacy.wast @@ -141,37 +141,25 @@ ;; 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: (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: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (catch $e-i32 - ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (pop i32) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $3 - ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $try_unreachable (result i32) @@ -212,8 +200,6 @@ ;; 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 d564db02081..b601b8a1295 100644 --- a/test/lit/passes/flatten_all-features.wast +++ b/test/lit/passes/flatten_all-features.wast @@ -547,8 +547,6 @@ ;; 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) @@ -689,8 +687,6 @@ ;; 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) @@ -726,8 +722,6 @@ ;; 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) @@ -901,8 +895,6 @@ ;; 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) @@ -924,37 +916,25 @@ ) ) ;; CHECK: (func $a19 (type $5) (result f32) - ;; 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: (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: (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: (i32.const 65535) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop ;; 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 @@ -1095,8 +1075,6 @@ ;; 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) @@ -1118,8 +1096,6 @@ ;; 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) @@ -1142,8 +1118,6 @@ ;; 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) @@ -2019,8 +1993,6 @@ ;; 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) @@ -2080,8 +2052,6 @@ ;; 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) @@ -2176,8 +2146,6 @@ ;; 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) @@ -2468,8 +2436,6 @@ ;; 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) @@ -2640,8 +2606,6 @@ ;; 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) @@ -3592,28 +3556,16 @@ ) ;; CHECK: (func $return (type $3) (param $x i32) (result i32) ;; CHECK-NEXT: (local $1 i32) - ;; 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: (local.set $1 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) ;; 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 $3) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return (param $x i32) (result i32) (return (i32.sub (i32.const 1) (i32.const 2))) @@ -3701,27 +3653,15 @@ (nop) ) ;; CHECK: (func $test (type $1) (result i32) - ;; 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: (return + ;; CHECK-NEXT: (i32.const -111) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $0 ;; 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 $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 fde3d764ea6..beb15b2e46d 100644 --- a/test/lit/passes/flatten_i64-to-i32-lowering.wast +++ b/test/lit/passes/flatten_i64-to-i32-lowering.wast @@ -100,62 +100,23 @@ (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: (local $i64toi32_i32$1 i32) - ;; CHECK-NEXT: (local $i64toi32_i32$2 i32) - ;; CHECK-NEXT: (block - ;; 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: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 2) - ;; 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$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: (unreachable) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (local.set $i64toi32_i32$1 - ;; CHECK-NEXT: (local.get $1$hi) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (i32.const 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: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-select-i64 (result i64) (select @@ -165,62 +126,23 @@ ) ) ;; 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: (local $i64toi32_i32$1 i32) - ;; CHECK-NEXT: (local $i64toi32_i32$2 i32) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (block ;; CHECK-NEXT: (unreachable) - ;; 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$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: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (local.set $i64toi32_i32$1 - ;; CHECK-NEXT: (local.get $1$hi) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (i32.const 3) ;; 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: (drop + ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-select-i64-b (result i64) (select @@ -230,68 +152,29 @@ ) ) ;; 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: (local $i64toi32_i32$2 i32) - ;; CHECK-NEXT: (local $i64toi32_i32$3 i32) - ;; CHECK-NEXT: (block - ;; 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: (unreachable) ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (local.set $i64toi32_i32$2 - ;; CHECK-NEXT: (local.get $0$hi) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; 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: (drop ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (local.set $i64toi32_i32$2 - ;; CHECK-NEXT: (local.get $1$hi) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (i32.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; 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: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-select-i64-c (result i64) (select @@ -652,8 +535,6 @@ ;; 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 @@ -800,47 +681,8 @@ ;; CHECK: (elem $0 (i32.const 0) $f) ;; CHECK: (func $f (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: (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: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; 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 d2a47c4ae76..f71970035af 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,8 +84,6 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -134,71 +132,61 @@ ;; 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: (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: (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: (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: (local.set $16 - ;; CHECK-NEXT: (i64.ne - ;; CHECK-NEXT: (local.get $a) - ;; CHECK-NEXT: (local.get $y) - ;; 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: ) - ;; 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: (local.set $16 + ;; CHECK-NEXT: (i64.ne + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $y) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $18) + ;; 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: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $18) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; 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) @@ -293,8 +281,6 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -769,8 +755,6 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -987,27 +971,17 @@ ) ;; CHECK: (func $select (param $x i32) (result i32) ;; CHECK-NEXT: (local $1 i32) - ;; 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: (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: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $select (param $x i32) (result i32) (return @@ -1027,49 +1001,39 @@ ;; 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: (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: (nop) - ;; CHECK-NEXT: (local.set $6 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) + ;; 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: (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: (nop) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) ;; 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: ) + ;; 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: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $9) + ;; 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: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $select-2 (param $x i32) (param $y i32) (result i32) (return @@ -1370,47 +1334,37 @@ ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) ;; CHECK-NEXT: (local $5 i32) - ;; 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: (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: ) - ;; 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: (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: ) - ;; 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: (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: (return - ;; CHECK-NEXT: (local.get $5) + ;; 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: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $5) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $call (result i32) (return @@ -1462,8 +1416,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1524,8 +1476,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1594,8 +1544,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1671,8 +1619,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1746,8 +1692,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2458,8 +2402,6 @@ ;; CHECK-NEXT: (local.get $t) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2548,8 +2490,6 @@ ;; CHECK-NEXT: (local.get $4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2611,8 +2551,6 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2681,8 +2619,6 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2742,8 +2678,6 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2805,8 +2739,6 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2869,8 +2801,6 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2933,8 +2863,6 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3020,8 +2948,6 @@ ;; CHECK-NEXT: (local.get $13) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3104,8 +3030,6 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3173,8 +3097,6 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3247,8 +3169,6 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3343,8 +3263,6 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3443,8 +3361,6 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3550,8 +3466,6 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3719,8 +3633,6 @@ ;; 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 @@ -3790,21 +3702,19 @@ ;; CHECK-NEXT: (local $var$2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) - ;; CHECK-NEXT: (local $5 f32) - ;; CHECK-NEXT: (local $6 f32) + ;; CHECK-NEXT: (local $5 i32) + ;; CHECK-NEXT: (local $6 i32) ;; 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 i32) - ;; CHECK-NEXT: (local $13 i32) + ;; CHECK-NEXT: (local $12 f32) + ;; CHECK-NEXT: (local $13 f32) ;; CHECK-NEXT: (local $14 f32) ;; CHECK-NEXT: (local $15 f32) - ;; CHECK-NEXT: (local $16 f32) - ;; CHECK-NEXT: (local $17 f32) - ;; CHECK-NEXT: (local $18 f64) - ;; CHECK-NEXT: (local $19 f64) + ;; CHECK-NEXT: (local $16 f64) + ;; CHECK-NEXT: (local $17 f64) ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block ;; CHECK-NEXT: (nop) @@ -3818,16 +3728,8 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: (then - ;; 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: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (block @@ -3835,7 +3737,7 @@ ;; CHECK-NEXT: (loop $label$3 ;; CHECK-NEXT: (block $label$4 ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.set $6 ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br_if $label$4 @@ -3843,7 +3745,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.set $6 ;; CHECK-NEXT: (i32.clz ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) @@ -3854,7 +3756,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (local.get $6) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) @@ -3863,7 +3765,7 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (local.set $14 ;; CHECK-NEXT: (f32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3873,12 +3775,10 @@ ;; 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 $18) + ;; CHECK-NEXT: (local.get $16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $phi-value-turns-bad (result f64) @@ -4015,50 +3915,40 @@ ;; CHECK-NEXT: (local $5 i32) ;; CHECK-NEXT: (local $6 i32) ;; CHECK-NEXT: (local $7 i32) - ;; 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: (nop) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (i32.ctz - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: ) + ;; 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: (local.set $5 - ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $4) - ;; CHECK-NEXT: (i32.const 20) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.ctz + ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) - ;; 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: (local.set $5 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $7 - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (local.get $6) - ;; 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: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $6) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $many-single-uses-with-param (param $x i32) (result i32) (return @@ -4657,8 +4547,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -4820,8 +4708,6 @@ ;; 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 02340deafa4..d57df657913 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,8 +84,6 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -134,71 +132,61 @@ ;; 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: (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: (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: (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: (local.set $16 - ;; CHECK-NEXT: (i64.ne - ;; CHECK-NEXT: (local.get $a) - ;; CHECK-NEXT: (local.get $y) - ;; 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: ) - ;; 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: (local.set $16 + ;; CHECK-NEXT: (i64.ne + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $y) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $18) + ;; 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: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $18) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; 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) @@ -293,8 +281,6 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -836,8 +822,6 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1054,27 +1038,17 @@ ) ;; CHECK: (func $select (param $x i32) (result i32) ;; CHECK-NEXT: (local $1 i32) - ;; 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: (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: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $select (param $x i32) (result i32) (return @@ -1094,49 +1068,39 @@ ;; 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: (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: (nop) - ;; CHECK-NEXT: (local.set $6 - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) + ;; 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: (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: (nop) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) ;; 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: ) + ;; 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: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $9) + ;; 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: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $select-2 (param $x i32) (param $y i32) (result i32) (return @@ -1437,47 +1401,37 @@ ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) ;; CHECK-NEXT: (local $5 i32) - ;; 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: (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: ) - ;; 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: (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: ) - ;; 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: (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: (return - ;; CHECK-NEXT: (local.get $5) + ;; 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: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (local.get $5) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $call (result i32) (return @@ -1529,8 +1483,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1591,8 +1543,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1661,8 +1611,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1738,8 +1686,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -1813,8 +1759,6 @@ ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2525,8 +2469,6 @@ ;; CHECK-NEXT: (local.get $t) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2615,8 +2557,6 @@ ;; CHECK-NEXT: (local.get $4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2678,8 +2618,6 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2748,8 +2686,6 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2809,8 +2745,6 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2872,8 +2806,6 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -2936,8 +2868,6 @@ ;; CHECK-NEXT: (local.get $8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3000,8 +2930,6 @@ ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3087,8 +3015,6 @@ ;; CHECK-NEXT: (local.get $13) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3171,8 +3097,6 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3240,8 +3164,6 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3314,8 +3236,6 @@ ;; CHECK-NEXT: (local.get $9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3410,8 +3330,6 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3510,8 +3428,6 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3617,8 +3533,6 @@ ;; CHECK-NEXT: (local.get $15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -3786,8 +3700,6 @@ ;; 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 @@ -3857,21 +3769,19 @@ ;; CHECK-NEXT: (local $var$2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local $4 i32) - ;; CHECK-NEXT: (local $5 f32) - ;; CHECK-NEXT: (local $6 f32) + ;; CHECK-NEXT: (local $5 i32) + ;; CHECK-NEXT: (local $6 i32) ;; 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 i32) - ;; CHECK-NEXT: (local $13 i32) + ;; CHECK-NEXT: (local $12 f32) + ;; CHECK-NEXT: (local $13 f32) ;; CHECK-NEXT: (local $14 f32) ;; CHECK-NEXT: (local $15 f32) - ;; CHECK-NEXT: (local $16 f32) - ;; CHECK-NEXT: (local $17 f32) - ;; CHECK-NEXT: (local $18 f64) - ;; CHECK-NEXT: (local $19 f64) + ;; CHECK-NEXT: (local $16 f64) + ;; CHECK-NEXT: (local $17 f64) ;; CHECK-NEXT: (block ;; CHECK-NEXT: (block ;; CHECK-NEXT: (nop) @@ -3885,16 +3795,8 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: (then - ;; 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: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (block @@ -3902,7 +3804,7 @@ ;; CHECK-NEXT: (loop $label$3 ;; CHECK-NEXT: (block $label$4 ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.set $6 ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br_if $label$4 @@ -3910,7 +3812,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.set $6 ;; CHECK-NEXT: (i32.clz ;; CHECK-NEXT: (local.get $var$0) ;; CHECK-NEXT: ) @@ -3921,7 +3823,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (local.get $6) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) @@ -3930,7 +3832,7 @@ ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (local.set $14 ;; CHECK-NEXT: (f32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3940,12 +3842,10 @@ ;; 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 $18) + ;; CHECK-NEXT: (local.get $16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $phi-value-turns-bad (result f64) @@ -4082,50 +3982,40 @@ ;; CHECK-NEXT: (local $5 i32) ;; CHECK-NEXT: (local $6 i32) ;; CHECK-NEXT: (local $7 i32) - ;; 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: (nop) - ;; CHECK-NEXT: (local.set $4 - ;; CHECK-NEXT: (i32.ctz - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: ) + ;; 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: (local.set $5 - ;; CHECK-NEXT: (i32.sub - ;; CHECK-NEXT: (local.get $4) - ;; CHECK-NEXT: (i32.const 20) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.ctz + ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) - ;; 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: (local.set $5 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.set $7 - ;; CHECK-NEXT: (i32.eqz - ;; CHECK-NEXT: (local.get $6) - ;; 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: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $6) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (local.get $7) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $many-single-uses-with-param (param $x i32) (result i32) (return @@ -4724,8 +4614,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (return @@ -4887,8 +4775,6 @@ ;; 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 51e173299ac..ef2cf62e06c 100644 --- a/test/lit/passes/global-effects-O.wast +++ b/test/lit/passes/global-effects-O.wast @@ -65,49 +65,16 @@ ;; CHECK_0-NEXT: ) ;; CHECK_0-NEXT: ) ;; CHECK_1: (func $main (type $0) - ;; 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: (nop) ;; 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: (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: (nop) ;; CHECK_s-NEXT: ) ;; CHECK_O: (func $main (type $0) - ;; 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: (nop) ;; CHECK_O-NEXT: ) (func $main ;; This calls a function that does pointless work. After generating global @@ -238,7 +205,6 @@ ;; 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) @@ -371,7 +337,6 @@ ;; 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 f64f99de44d..dae61274e10 100644 --- a/test/lit/passes/global-effects-eh-legacy.wast +++ b/test/lit/passes/global-effects-eh-legacy.wast @@ -51,9 +51,6 @@ ;; 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 4d0f1d6c578..86e4988e92c 100644 --- a/test/lit/passes/global-effects.wast +++ b/test/lit/passes/global-effects.wast @@ -59,9 +59,6 @@ ;; 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 cbf0203fd1f..acbe4d9c562 100644 --- a/test/lit/passes/gufa-cast-all.wast +++ b/test/lit/passes/gufa-cast-all.wast @@ -169,7 +169,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -219,13 +218,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -269,7 +262,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -322,7 +314,6 @@ ;; CHECK-NEXT: (ref.null nofunc) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.func $test) @@ -486,7 +477,6 @@ ;; 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 80eb13b3473..d35e77a60ef 100644 --- a/test/lit/passes/gufa-cont.wast +++ b/test/lit/passes/gufa-cont.wast @@ -70,7 +70,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -83,7 +82,6 @@ ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: (return) - ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -111,7 +109,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -124,7 +121,6 @@ ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: (return) - ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -146,13 +142,11 @@ ;; 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. @@ -170,13 +164,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -190,13 +178,7 @@ ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) - ;; 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: (return) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -274,7 +256,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -288,7 +269,6 @@ ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: (return) - ;; OPEN_WORLD-NEXT: (unreachable) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) @@ -371,14 +351,8 @@ ;; CHECK-NEXT: (ref.func $cont) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; 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: (return + ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -392,14 +366,8 @@ ;; OPEN_WORLD-NEXT: (ref.func $cont) ;; OPEN_WORLD-NEXT: ) ;; OPEN_WORLD-NEXT: ) - ;; 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: (return + ;; OPEN_WORLD-NEXT: (i32.const 42) ;; 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 c00963bcec0..4cccd1bac43 100644 --- a/test/lit/passes/gufa-eh-null-type.wast +++ b/test/lit/passes/gufa-eh-null-type.wast @@ -23,7 +23,6 @@ ;; 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 d9afbb84935..c7211e531b1 100644 --- a/test/lit/passes/gufa-eh.wast +++ b/test/lit/passes/gufa-eh.wast @@ -95,7 +95,6 @@ ;; 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 91cbd4ec443..173d086e918 100644 --- a/test/lit/passes/gufa-refs.wast +++ b/test/lit/passes/gufa-refs.wast @@ -85,26 +85,10 @@ ;; CHECK-NEXT: (br $block ;; CHECK-NEXT: (struct.new_default $struct) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; 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: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $breaks @@ -131,8 +115,6 @@ ;; 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 @@ -300,8 +282,6 @@ ;; 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. @@ -1016,7 +996,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -1100,7 +1079,6 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.null none) @@ -1114,7 +1092,6 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.null none) @@ -1135,7 +1112,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (ref.null none) @@ -2242,7 +2218,6 @@ ;; CHECK-NEXT: (ref.null none) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -3266,8 +3241,6 @@ ;; 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) @@ -3902,7 +3875,6 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) @@ -5385,7 +5357,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -5403,7 +5374,6 @@ ;; 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 4f8a02bfce5..b4601d47661 100644 --- a/test/lit/passes/gufa-tnh.wast +++ b/test/lit/passes/gufa-tnh.wast @@ -1080,7 +1080,6 @@ ;; 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 32d07be37ce..bbd834e62d6 100644 --- a/test/lit/passes/gufa-vs-cfp.wast +++ b/test/lit/passes/gufa-vs-cfp.wast @@ -383,8 +383,6 @@ ;; 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 95ac4c39027..c62078f7cba 100644 --- a/test/lit/passes/heap-store-optimization.wast +++ b/test/lit/passes/heap-store-optimization.wast @@ -842,7 +842,6 @@ ;; 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) @@ -979,7 +978,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 42) @@ -1122,7 +1120,6 @@ ;; 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) @@ -1185,7 +1182,6 @@ ;; 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 64d0f8660e3..11d9659db5f 100644 --- a/test/lit/passes/heap2local.wast +++ b/test/lit/passes/heap2local.wast @@ -1049,7 +1049,6 @@ ;; 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)) @@ -1576,7 +1575,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $2) @@ -1625,7 +1623,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1677,7 +1674,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1724,7 +1720,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1877,7 +1872,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (f64.const 2.1828) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.get $2) @@ -2239,7 +2233,6 @@ ;; 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 @@ -2276,7 +2269,6 @@ ;; 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. @@ -4853,7 +4845,6 @@ ;; 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 23fe71025b7..d723212fc4b 100644 --- a/test/lit/passes/inlining-unreachable.wast +++ b/test/lit/passes/inlining-unreachable.wast @@ -32,10 +32,7 @@ ;; CHECK: (func $call-trap-result (type $1) (result i32) ;; CHECK-NEXT: (block $__inlined_func$trap-result$1 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $call-trap-result (result i32) @@ -79,10 +76,7 @@ ;; CHECK: (func $caller (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$callee - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (call $imported - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $imported ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -182,15 +176,11 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return ;; CHECK-NEXT: (block $__inlined_func$1 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (block $block0 - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block0 ;; 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 f370035f3ef..52687ee0fd8 100644 --- a/test/lit/passes/inlining_enable-tail-call.wast +++ b/test/lit/passes/inlining_enable-tail-call.wast @@ -79,11 +79,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$return$11 (result i32) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $__inlined_func$return$11 - ;; CHECK-NEXT: (i32.const 5) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $__inlined_func$return$11 + ;; CHECK-NEXT: (i32.const 5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -221,7 +218,6 @@ ;; CHECK-NEXT: (call $child ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $parent (result i32) (call $child @@ -298,7 +294,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $label$0) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 0) @@ -307,7 +302,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -388,11 +382,9 @@ ;; 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) @@ -495,7 +487,6 @@ ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $caller (result i32) (return_call $callee) @@ -596,7 +587,6 @@ ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $caller (result i32) (return_call $callee @@ -825,31 +815,27 @@ ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (local.get $y) ;; CHECK-NEXT: ) - ;; 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: (local.set $5 - ;; CHECK-NEXT: (local.get $3) + ;; 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: ) - ;; 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: (drop + ;; CHECK-NEXT: (local.get $5) ;; 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) @@ -972,13 +958,10 @@ ;; CHECK: (func $first ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$second (result i32) - ;; 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: (br $__inlined_func$second + ;; CHECK-NEXT: (block $__inlined_func$third$2 (result i32) + ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1175,7 +1158,6 @@ ;; 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) @@ -1196,7 +1178,6 @@ ;; 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) @@ -1259,14 +1240,11 @@ ;; CHECK: (func $caller ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $__inlined_func$callee (result i32) - ;; 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: (br $__inlined_func$callee + ;; CHECK-NEXT: (call_indirect (type $T) + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1556,12 +1534,10 @@ ;; 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 a008c6454a7..dc35fb10b23 100644 --- a/test/lit/passes/inlining_optimize-level=3.wast +++ b/test/lit/passes/inlining_optimize-level=3.wast @@ -381,7 +381,6 @@ ;; 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: ) @@ -409,10 +408,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -461,10 +457,7 @@ ;; CHECK-NEXT: (block $__inlined_func$C$2 (result f32) ;; CHECK-NEXT: (local.set $0 ;; CHECK-NEXT: (block $__inlined_func$D$1 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; 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 adc6a73b3dd..f8a52502d99 100644 --- a/test/lit/passes/inlining_tnh.wat +++ b/test/lit/passes/inlining_tnh.wat @@ -9,8 +9,6 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (type $1 (func (result i32))) - ;; CHECK: (func $call-trap ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.const 42) @@ -45,13 +43,17 @@ ;; CHECK: (func $call-trap-value ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (call $trap-value) + ;; CHECK-NEXT: (block $__inlined_func$trap-value$2 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (call $trap-value) + ;; CHECK-NEXT: (block $__inlined_func$trap-value$3 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -70,10 +72,6 @@ ) ) - ;; 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 36dbcf5da4c..3ab387393ce 100644 --- a/test/lit/passes/legalize-and-prune-js-interface.wast +++ b/test/lit/passes/legalize-and-prune-js-interface.wast @@ -177,7 +177,6 @@ ;; 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. @@ -194,7 +193,6 @@ ;; 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. @@ -202,13 +200,7 @@ ) ;; CHECK: (func $export-mv (type $5) (result i32 i32) - ;; 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: ) (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 0fda406ea92..a3343911cb9 100644 --- a/test/lit/passes/make-shared-objects.wast +++ b/test/lit/passes/make-shared-objects.wast @@ -433,10 +433,7 @@ ) ;; CHECK: (func $unreachable-call-ref (type $0) (result i32) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-call-ref (result i32) @@ -444,14 +441,11 @@ ) ;; CHECK: (func $unreachable-call-ref-effect (type $0) (result i32) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $effect) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $effect) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $unreachable-call-ref-effect (result i32) (call_ref $sig (call $effect) (unreachable)) @@ -487,10 +481,7 @@ ) ;; CHECK: (func $shared-unreachable-call-ref (type $0) (result i32) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $shared-unreachable-call-ref (result i32) @@ -498,14 +489,11 @@ ) ;; CHECK: (func $shared-unreachable-call-ref-effect (type $0) (result i32) - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $effect) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $effect) ;; 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)) @@ -535,7 +523,6 @@ ;; 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)) @@ -566,7 +553,6 @@ ;; 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)) @@ -597,7 +583,6 @@ ;; 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)) @@ -909,7 +894,6 @@ ;; 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)) @@ -1294,7 +1278,6 @@ ;; 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)) @@ -1441,3 +1424,23 @@ ;; CHECK: (import "" "" (global $g-sig (ref null (shared i31)))) (import "" "" (global $g-sig (ref null $sig))) ) + +(module + ;; Struct gets of signature fields must be properly refinalized to shared + ;; i31 after rewriteTypes rewrites the struct types to shared. + (type $sig (func)) + ;; CHECK: (type $struct (shared (struct (field (ref (shared i31)))))) + (type $struct (struct (field (ref $sig)))) + ;; CHECK: (type $1 (func (param (ref $struct)) (result (ref (shared i31))))) + + ;; CHECK: (func $struct-get (type $1) (param $0 (ref $struct)) (result (ref (shared i31))) + ;; CHECK-NEXT: (struct.get $struct 0 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $struct-get (param (ref $struct)) (result (ref $sig)) + (struct.get $struct 0 + (local.get 0) + ) + ) +) diff --git a/test/lit/passes/merge-blocks-eh.wast b/test/lit/passes/merge-blocks-eh.wast index b7b48501b03..df1ba0c826d 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 $2) (param i32)) + ;; CHECK: (tag $i32 (type $1) (param i32)) (tag $i32 (param i32)) - ;; CHECK: (tag $exnref (type $3) (param exnref)) + ;; CHECK: (tag $exnref (type $2) (param exnref)) (tag $exnref (param exnref)) ;; CHECK: (func $drop-block-try_catch_all_ref (type $0) @@ -20,7 +20,6 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $drop-block-try_catch_all_ref @@ -42,7 +41,6 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $drop-block-try_catch_ref @@ -64,7 +62,6 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $drop-block-try_catch_multi @@ -81,16 +78,10 @@ ;; CHECK: (func $drop-block-try_catch_all_i32 (type $0) ;; CHECK-NEXT: (tuple.drop 2 - ;; 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: (block $catch (type $3) (result i32 exnref) + ;; CHECK-NEXT: (try_table (catch_ref $i32 $catch) + ;; CHECK-NEXT: (call $import) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -109,21 +100,14 @@ ;; CHECK: (func $drop-block-try_catch_multi_partial (type $0) ;; CHECK-NEXT: (tuple.drop 2 - ;; CHECK-NEXT: (block $outer (type $1) (result i32 (ref exn)) + ;; CHECK-NEXT: (block $outer (type $4) (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: ) @@ -151,7 +135,6 @@ ;; CHECK-NEXT: (call $import) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -213,7 +196,6 @@ ;; 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 f18ebfe9543..02245696839 100644 --- a/test/lit/passes/minimize-rec-groups-no-cd.wast +++ b/test/lit/passes/minimize-rec-groups-no-cd.wast @@ -26,13 +26,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (ref.func $referenced) ;; 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: ) (func $referenced (type $exact) (drop (ref.func $referenced)) @@ -42,13 +36,7 @@ ;; CHECK: (func $control-flow-type (type $2) ;; CHECK-NEXT: (tuple.drop 2 ;; CHECK-NEXT: (block $l (type $3) (result (ref $struct) i32) - ;; 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/monomorphize-context.wast b/test/lit/passes/monomorphize-context.wast index c2656729980..7f9cb2f566e 100644 --- a/test/lit/passes/monomorphize-context.wast +++ b/test/lit/passes/monomorphize-context.wast @@ -1101,7 +1101,6 @@ ;; 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) @@ -1115,49 +1114,35 @@ ;; ALWAYS: (func $target_3 (type $1) ;; ALWAYS-NEXT: (local $0 anyref) ;; ALWAYS-NEXT: (local $1 anyref) -;; 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: (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: (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: (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: (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: (unreachable) ;; ALWAYS-NEXT: ) ;; CAREFUL: (func $target_3 (type $0) @@ -1207,7 +1192,6 @@ ;; 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) @@ -1234,10 +1218,7 @@ ;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) ;; ALWAYS-NEXT: ) -;; ALWAYS-NEXT: (block (result anyref) -;; ALWAYS-NEXT: (unreachable) -;; ALWAYS-NEXT: (unreachable) -;; ALWAYS-NEXT: ) +;; ALWAYS-NEXT: (unreachable) ;; 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 1685fd001f4..151f9e9d32b 100644 --- a/test/lit/passes/optimize-instructions-desc.wast +++ b/test/lit/passes/optimize-instructions-desc.wast @@ -1186,7 +1186,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1200,7 +1199,6 @@ ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (return) - ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) @@ -1229,7 +1227,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1243,7 +1240,6 @@ ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (return) - ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) @@ -1284,7 +1280,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1310,7 +1305,6 @@ ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (return) - ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) @@ -1350,7 +1344,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1376,7 +1369,6 @@ ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: (return) - ;; NTRAP-NEXT: (unreachable) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) ;; NTRAP-NEXT: ) @@ -1403,7 +1395,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block (result (ref null $desc)) ;; CHECK-NEXT: (return) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1428,7 +1419,6 @@ ;; 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 060d5ba2fde..8eb66fcf5c5 100644 --- a/test/lit/passes/optimize-instructions-gc-tnh.wast +++ b/test/lit/passes/optimize-instructions-gc-tnh.wast @@ -673,7 +673,6 @@ ;; 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) @@ -711,7 +710,6 @@ ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: (else ;; NO_TNH-NEXT: (unreachable) - ;; NO_TNH-NEXT: (unreachable) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) ;; NO_TNH-NEXT: ) @@ -925,12 +923,12 @@ ;; TNH-NEXT: (drop ;; TNH-NEXT: (block ;; TNH-NEXT: (drop - ;; TNH-NEXT: (block - ;; TNH-NEXT: (drop - ;; TNH-NEXT: (i32.const 1) - ;; TNH-NEXT: ) - ;; TNH-NEXT: (block + ;; TNH-NEXT: (if + ;; TNH-NEXT: (i32.const 1) + ;; TNH-NEXT: (then ;; TNH-NEXT: (return) + ;; TNH-NEXT: ) + ;; TNH-NEXT: (else ;; TNH-NEXT: (unreachable) ;; TNH-NEXT: ) ;; TNH-NEXT: ) @@ -947,11 +945,9 @@ ;; 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: ) @@ -1035,33 +1031,27 @@ ;; 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 ca0508b35ab..c231f76d059 100644 --- a/test/lit/passes/optimize-instructions-gc.wast +++ b/test/lit/passes/optimize-instructions-gc.wast @@ -411,7 +411,6 @@ ;; CHECK: (func $get-eqref (type $32) (result eqref) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $get-eqref (result eqref) (unreachable) @@ -2335,7 +2334,6 @@ ;; CHECK: (func $impossible (type $40) (result (ref none)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $impossible (result (ref none)) (unreachable) @@ -2981,8 +2979,7 @@ ;; CHECK-NEXT: (local $0 funcref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.set $0 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (loop ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3020,8 +3017,7 @@ ;; CHECK-NEXT: (local $0 funcref) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.tee $0 - ;; CHECK-NEXT: (block (result (ref nofunc)) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (loop (result (ref nofunc)) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3043,8 +3039,7 @@ ;; CHECK: (func $non-null-bottom-ref-test-notee (type $8) (result i32) ;; CHECK-NEXT: (local $0 funcref) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result (ref nofunc)) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (loop (result (ref nofunc)) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3200,7 +3195,6 @@ ;; 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) @@ -3216,7 +3210,6 @@ ;; 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 fb97090bd23..8e89f71caef 100644 --- a/test/lit/passes/optimize-instructions-ignore-traps.wast +++ b/test/lit/passes/optimize-instructions-ignore-traps.wast @@ -101,7 +101,6 @@ ;; 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) @@ -279,7 +278,6 @@ ;; 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) @@ -458,7 +456,6 @@ ;; 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) @@ -583,7 +580,6 @@ ;; 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 @@ -654,7 +650,6 @@ ;; 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 @@ -721,7 +716,6 @@ ;; 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 8d32a4f39d5..dd2d0daa4d5 100644 --- a/test/lit/passes/optimize-instructions-mvp.wast +++ b/test/lit/passes/optimize-instructions-mvp.wast @@ -2600,7 +2600,6 @@ ) ;; CHECK: (func $ne1 (result i32) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $ne1 (result i32) (unreachable) @@ -3158,7 +3157,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $sext-24-unreachable (result i32) (i32.shr_s @@ -5520,7 +5518,6 @@ ;; 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) @@ -6101,46 +6098,38 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $1) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (block ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.tee $0 ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (local.get $1) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (if ;; 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: ) @@ -6432,7 +6421,6 @@ ;; CHECK-NEXT: (i32.const -1337) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $zero-ops (result i32) (return @@ -6465,7 +6453,6 @@ ;; CHECK-NEXT: (i64.const -1337) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $zero-ops-64 (result i32) (return @@ -6497,7 +6484,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $zero-ops-64-special (result i32) (return @@ -6697,7 +6683,6 @@ ;; 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 @@ -7835,7 +7820,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $mul-32-power-2 (param $x i32) (result i32) (drop @@ -7950,7 +7934,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $mul-64-power-2 (param $x i64) (result i64) (drop @@ -8068,7 +8051,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $div-32-power-2 (param $x i32) (result i32) (drop @@ -8181,7 +8163,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $urem-32-power-2 (param $x i32) (result i32) (drop @@ -8902,7 +8883,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $andZero (param $0 i32) (param $1 i64) (result i32) (drop @@ -10924,7 +10904,6 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 3) @@ -10932,10 +10911,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.and - ;; CHECK-NEXT: (local.get $x5) - ;; CHECK-NEXT: (i32.const 7) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $x5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (local.set $x6 ;; CHECK-NEXT: (if (result i32) @@ -10945,15 +10921,11 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.and - ;; CHECK-NEXT: (local.get $x6) - ;; CHECK-NEXT: (i32.const 7) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $x6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $out (result i32) @@ -10967,7 +10939,6 @@ ;; CHECK-NEXT: (local.get $x7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -11016,7 +10987,6 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $tee-with-unreachable-value (result f64) @@ -16102,7 +16072,6 @@ ;; CHECK-NEXT: (i32.eqz ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (i32.const 0) @@ -16135,7 +16104,6 @@ ;; CHECK-NEXT: (i32.eqz ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -16622,7 +16590,6 @@ ;; 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 @@ -16707,19 +16674,15 @@ ) ) ;; CHECK: (func $if-unreachable-return-identical (param $x i32) (param $y i32) (param $z i32) (result i32) - ;; CHECK-NEXT: (if (result i32) - ;; CHECK-NEXT: (local.get $x) - ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then ;; CHECK-NEXT: (local.get $y) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (else ;; 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 7d24b5ec217..bd4fc50c5cb 100644 --- a/test/lit/passes/precompute-gc.wast +++ b/test/lit/passes/precompute-gc.wast @@ -751,7 +751,6 @@ ;; 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) @@ -868,7 +867,6 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) @@ -893,7 +891,6 @@ ;; 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 0d6a4ffe4bd..5ea442357db 100644 --- a/test/lit/passes/precompute_all-features.wast +++ b/test/lit/passes/precompute_all-features.wast @@ -71,7 +71,6 @@ ;; CHECK-NEXT: (br $val ;; CHECK-NEXT: (i32.const 102) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (nop) @@ -377,7 +376,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (block $label$3 ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -528,7 +526,6 @@ ;; 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 0c880f16fe5..ca492d4d0ff 100644 --- a/test/lit/passes/remove-unused-brs-eh.wast +++ b/test/lit/passes/remove-unused-brs-eh.wast @@ -221,7 +221,6 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $throw-caught-ref-later-all (result exnref) @@ -446,7 +445,6 @@ ;; 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 21af5291598..fad136272ef 100644 --- a/test/lit/passes/remove-unused-brs.wast +++ b/test/lit/passes/remove-unused-brs.wast @@ -6,22 +6,13 @@ (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: (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: (select (result i31ref) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: (ref.i31 + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $selectify-fresh-lub (param $x i32) (result anyref) (if @@ -872,7 +863,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (br $block) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -900,7 +890,6 @@ ;; 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 8f5df5360c4..87c1b2ae197 100644 --- a/test/lit/passes/remove-unused-brs_all-features.wast +++ b/test/lit/passes/remove-unused-brs_all-features.wast @@ -74,13 +74,11 @@ ;; CHECK-NEXT: (else ;; CHECK-NEXT: (block $block (result f64) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br_if $loop + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $loop) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -114,7 +112,6 @@ ;; CHECK: (func $none_=>_i32 (type $5) (result i32) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $none_=>_i32 (result i32) (unreachable) @@ -232,7 +229,6 @@ ;; 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) @@ -270,7 +266,6 @@ ;; 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 725413fdf8a..321fbab8146 100644 --- a/test/lit/passes/remove-unused-brs_branch-hints.wast +++ b/test/lit/passes/remove-unused-brs_branch-hints.wast @@ -634,7 +634,6 @@ ;; CHECK-NEXT: (block $value (result i32) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -657,17 +656,13 @@ ;; CHECK: (func $set-if-br-arm (type $0) (param $x i32) ;; CHECK-NEXT: (local $temp i32) ;; CHECK-NEXT: (block $out - ;; CHECK-NEXT: (local.set $temp + ;; CHECK-NEXT: (block ;; CHECK-NEXT: (@metadata.code.branch_hint "\00") - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (br_if $out ;; CHECK-NEXT: (local.get $x) - ;; 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: (local.set $temp + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -694,18 +689,16 @@ ;; CHECK: (func $set-if-br-arm-flip (type $0) (param $x i32) ;; CHECK-NEXT: (local $temp i32) ;; CHECK-NEXT: (block $out - ;; 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: (block + ;; CHECK-NEXT: (@metadata.code.branch_hint "\01") + ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $x) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $temp + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; 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 73b043ec08c..f8d5143fce5 100644 --- a/test/lit/passes/remove-unused-brs_enable-multivalue.wast +++ b/test/lit/passes/remove-unused-brs_enable-multivalue.wast @@ -1,7 +1,7 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. ;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. -;; RUN: foreach %s %t wasm-opt --remove-unused-brs --enable-multivalue -S -o - | filecheck %s +;; RUN: foreach %s %t wasm-opt --remove-unused-brs --enable-multivalue --no-validation -S -o - | filecheck %s (module (memory 256 256) @@ -816,10 +816,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (block $a0 (result i32) - ;; CHECK-NEXT: (br $a0 - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (block $a1 @@ -1288,10 +1285,7 @@ ;; CHECK-NEXT: (call $loops) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block $out20 (result i32) - ;; CHECK-NEXT: (br $out20 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $in16) @@ -1630,17 +1624,10 @@ ;; CHECK-NEXT: (i32.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: (i32.const 8) ;; 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: ) @@ -1754,7 +1741,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1810,7 +1796,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1865,7 +1850,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2065,20 +2049,18 @@ ;; CHECK: (func $loop-if (result i32) ;; CHECK-NEXT: (loop $typed (result i32) ;; CHECK-NEXT: (block $outer (result i32) - ;; 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: (block (result i32) + ;; CHECK-NEXT: (br_if $typed + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (br $typed) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $loop-if) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2285,7 +2267,6 @@ ;; CHECK-NEXT: (i32.const 103) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2340,7 +2321,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (br $label$3) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2373,7 +2353,6 @@ ;; 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) @@ -3622,10 +3601,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) (func $simple-switch (result i32) (block $A @@ -3661,10 +3637,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) (func $simple-switch-2 (result i32) (block $A @@ -3700,10 +3673,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) (func $simple-switch-3 (result i32) (block $A @@ -3751,10 +3721,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) (func $simple-switch43 (result i32) (block $A @@ -3790,10 +3757,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) (func $simple-switch-5 (result i32) (block $A @@ -3813,40 +3777,32 @@ ;; CHECK: (func $undo-if-return (param $p i32) (result i32) ;; CHECK-NEXT: (local $x i32) ;; CHECK-NEXT: (block $out - ;; CHECK-NEXT: (local.set $x - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_if $out ;; CHECK-NEXT: (local.get $p) - ;; 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: (local.set $x + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; 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: (block + ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $p) ;; 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 (result i32) + ;; CHECK-NEXT: (if ;; 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: ) @@ -3907,7 +3863,6 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (br $label$5) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (f64.const 1) @@ -3957,20 +3912,11 @@ (i32.const 0) ) ;; CHECK: (func $if-flow-1 (result i32) - ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) ;; 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 @@ -3984,18 +3930,15 @@ ) ) ;; CHECK: (func $if-flow-2 (result i32) - ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 2) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $if-flow-2 (result i32) (if @@ -4009,18 +3952,15 @@ ) ) ;; CHECK: (func $if-flow-3 (result i32) - ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (if (result i32) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (then - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $if-flow-3 (result i32) (if @@ -4049,7 +3989,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $if-flow-4 (result i32) (if @@ -4112,23 +4051,23 @@ ;; CHECK: (func $fuzz-block-unreachable-brs-with-values (result i32) ;; CHECK-NEXT: (local $0 i32) ;; CHECK-NEXT: (loop $label$1 - ;; CHECK-NEXT: (block $label$2 - ;; CHECK-NEXT: (if - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label$2 ;; 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: (br $label$1) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $label$1) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4190,7 +4129,6 @@ ;; CHECK-NEXT: (block $label$2 (result i32) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4562,17 +4500,14 @@ ;; CHECK-NEXT: (else ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (loop $label$3 (result i64) - ;; 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: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label$4 + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4646,7 +4581,6 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4693,7 +4627,6 @@ ;; 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 @@ -5261,10 +5194,7 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (local.set $x - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5298,7 +5228,6 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (local.get $y) @@ -5392,16 +5321,10 @@ ;; CHECK: (func $loop-end-value (param $x i32) (result i32) ;; CHECK-NEXT: (loop $loop (result i32) ;; CHECK-NEXT: (nop) - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (br_if $loop ;; 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) @@ -5619,7 +5542,6 @@ ;; CHECK-NEXT: (i32.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $unswitch-reordering (param $x i32) (result i32) @@ -5660,7 +5582,6 @@ ;; 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 253b134c686..3917c981c26 100644 --- a/test/lit/passes/remove-unused-brs_shrink-level=1.wast +++ b/test/lit/passes/remove-unused-brs_shrink-level=1.wast @@ -330,10 +330,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) (func $simple-switch (result i32) (block $A @@ -382,10 +379,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) (func $simple-switch-2 (result i32) (block $A @@ -433,10 +427,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) (func $simple-switch-3 (result i32) (block $A @@ -472,10 +463,7 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 3) ;; 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 00244a417b8..5bf47201b35 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: (br $trap) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (return @@ -31,7 +31,6 @@ ;; 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 c9d6af968b5..bd4940037c8 100644 --- a/test/lit/passes/remove-unused-module-elements-refs.wast +++ b/test/lit/passes/remove-unused-module-elements-refs.wast @@ -1395,7 +1395,6 @@ ;; CHECK-NEXT: (struct.get $substruct 0 ;; CHECK-NEXT: (block (result (ref $substruct)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1421,7 +1420,6 @@ ;; 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: ) @@ -1624,7 +1622,6 @@ ;; CHECK-NEXT: (struct.get $A 0 ;; CHECK-NEXT: (block (result (ref $A)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1646,7 +1643,6 @@ ;; 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: ) @@ -1732,7 +1728,6 @@ ;; CHECK-NEXT: (struct.get $A 0 ;; CHECK-NEXT: (block (result (ref $A)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1740,7 +1735,6 @@ ;; CHECK-NEXT: (struct.get $B 0 ;; CHECK-NEXT: (block (result (ref $B)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1762,7 +1756,6 @@ ;; 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: ) @@ -1770,7 +1763,6 @@ ;; 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 2fce33d9caf..c5b8a13ef9e 100644 --- a/test/lit/passes/reorder-types.wast +++ b/test/lit/passes/reorder-types.wast @@ -408,13 +408,7 @@ (type $B (sub $A (struct))) ) ;; CHECK: (func $test (type $3) (param $0 i32) (result (ref $A) (ref $B)) - ;; 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: ) (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 7b5e67ee830..5ef0cb72c82 100644 --- a/test/lit/passes/rse-eh.wast +++ b/test/lit/passes/rse-eh.wast @@ -261,13 +261,7 @@ ;; CHECK-NEXT: (try_table (catch_ref $e-i32 $catch1) ;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (br $outer1) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $outer1) ;; 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 f789993eb73..03742cae6da 100644 --- a/test/lit/passes/signature-refining.wast +++ b/test/lit/passes/signature-refining.wast @@ -546,7 +546,6 @@ ;; 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) @@ -561,7 +560,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -575,7 +573,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (else ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -653,7 +650,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $func-4 (type $sig) (result anyref) (if @@ -731,7 +727,6 @@ ;; 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 90e1a9efa50..e113fcde922 100644 --- a/test/lit/passes/simplify-locals-eh-legacy.wast +++ b/test/lit/passes/simplify-locals-eh-legacy.wast @@ -159,7 +159,6 @@ ;; 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 2e375c528e8..b65b5ba4613 100644 --- a/test/lit/passes/simplify-locals-eh.wast +++ b/test/lit/passes/simplify-locals-eh.wast @@ -24,7 +24,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $tryend) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -59,7 +58,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $tryend) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -92,7 +90,6 @@ ;; 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 ac395606622..24afb48401c 100644 --- a/test/lit/passes/stack-ir-dce.wast +++ b/test/lit/passes/stack-ir-dce.wast @@ -14,7 +14,6 @@ ;; 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. @@ -29,7 +28,6 @@ ;; 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. @@ -73,14 +71,12 @@ ;; 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: ) @@ -88,7 +84,6 @@ ;; 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 862f59b2cee..781d60f6ddc 100644 --- a/test/lit/passes/strip-eh-legacy.wast +++ b/test/lit/passes/strip-eh-legacy.wast @@ -95,10 +95,7 @@ ;; CHECK: (func $try-unreachable-body (type $1) (result i32) ;; CHECK-NEXT: (i32.add - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; 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 19c43c26ed0..b4168505256 100644 --- a/test/lit/passes/translate-to-exnref.wast +++ b/test/lit/passes/translate-to-exnref.wast @@ -508,21 +508,13 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; 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: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -646,16 +638,12 @@ ;; CHECK-NEXT: (throw_ref ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -810,16 +798,12 @@ ;; CHECK-NEXT: (throw_ref ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (block (result i32) - ;; CHECK-NEXT: (throw_ref - ;; CHECK-NEXT: (local.get $0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -964,25 +948,13 @@ ;; 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: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1135,27 +1107,15 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.get $1) ;; 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: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; 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: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -1321,27 +1281,15 @@ ;; CHECK-NEXT: (tuple.drop 2 ;; CHECK-NEXT: (local.get $1) ;; 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: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; 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: (throw_ref + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2183,12 +2131,9 @@ ;; CHECK-NEXT: (throw_ref ;; CHECK-NEXT: (block $__binaryen_delegate_caller_target0 (result exnref) ;; CHECK-NEXT: (return - ;; 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: (block + ;; CHECK-NEXT: (try_table (catch_all_ref $__binaryen_delegate_caller_target0) + ;; CHECK-NEXT: (call $foo) ;; 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 656e59b4591..ebb2f98b79f 100644 --- a/test/lit/passes/type-merging-tnh.wast +++ b/test/lit/passes/type-merging-tnh.wast @@ -67,11 +67,9 @@ ;; 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 f3ee5a12593..5a5d6a2c004 100644 --- a/test/lit/passes/type-merging.wast +++ b/test/lit/passes/type-merging.wast @@ -789,7 +789,6 @@ ;; 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) @@ -892,13 +891,7 @@ ;; CHECK: (func $test (type $D) (result (ref any) (ref $B)) ;; CHECK-NEXT: (block $l - ;; 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: ) (func $test (type $D) (result (ref any) (ref $C)) @@ -1099,11 +1092,9 @@ ;; 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 be1149137be..4c0261620d0 100644 --- a/test/lit/passes/type-refining.wast +++ b/test/lit/passes/type-refining.wast @@ -1005,10 +1005,11 @@ ) (module - ;; CHECK: (type $A (sub (struct (field (mut (ref null $A)))))) + ;; CHECK: (rec + ;; CHECK-NEXT: (type $A (sub (struct (field (mut (ref $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 @@ -1017,7 +1018,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (struct.set $A 0 ;; CHECK-NEXT: (local.get $A) - ;; CHECK-NEXT: (if (result (ref null $A)) + ;; CHECK-NEXT: (if (result (ref $A)) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (struct.get $A 0 @@ -1026,13 +1027,12 @@ ;; 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 null $A)) + ;; CHECK-NEXT: (if (result (ref $A)) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (struct.get $A 0 @@ -1041,7 +1041,6 @@ ;; 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 da86da58235..3d9d1d6205b 100644 --- a/test/lit/passes/type-ssa-exact.wast +++ b/test/lit/passes/type-ssa-exact.wast @@ -445,7 +445,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -622,7 +621,6 @@ ;; CHECK-NEXT: (local.get $used) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -657,7 +655,6 @@ ;; 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 2644c3f8db6..016b2534f9b 100644 --- a/test/lit/passes/unsubtyping-open-world.wast +++ b/test/lit/passes/unsubtyping-open-world.wast @@ -815,13 +815,7 @@ ;; 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: (tuple.make 2 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) ;; 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 1477c0f4ab5..6ed6039ca24 100644 --- a/test/lit/passes/unsubtyping-stack-switching.wast +++ b/test/lit/passes/unsubtyping-stack-switching.wast @@ -466,13 +466,7 @@ ;; CHECK-NEXT: (resume $cont (on $send-sub $l) ;; CHECK-NEXT: (local.get $cont) ;; 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: ) @@ -519,13 +513,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; 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: ) @@ -879,13 +867,7 @@ ;; CHECK-NEXT: (resume_throw $cont $e (on $send-sub $l) ;; CHECK-NEXT: (local.get $cont) ;; 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: ) @@ -935,13 +917,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; 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: ) @@ -987,13 +963,7 @@ ;; CHECK-NEXT: (local.get $exn) ;; CHECK-NEXT: (local.get $cont) ;; 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: ) @@ -1046,13 +1016,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; 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: ) @@ -1798,23 +1762,10 @@ ;; 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 45d43189438..bbbeb8e7252 100644 --- a/test/lit/passes/unsubtyping.wast +++ b/test/lit/passes/unsubtyping.wast @@ -179,7 +179,6 @@ ;; 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) @@ -246,7 +245,6 @@ ;; 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) @@ -356,11 +354,9 @@ ;; 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: ) @@ -400,11 +396,9 @@ ;; 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: ) @@ -461,7 +455,6 @@ ;; 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 @@ -470,7 +463,6 @@ ;; CHECK: (func $callee (type $3) (result (ref $sub)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (result (ref $sub)) (unreachable) @@ -522,7 +514,6 @@ ;; 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. @@ -679,7 +670,6 @@ ;; CHECK-NEXT: (return ;; CHECK-NEXT: (struct.new_default $sub) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $return (result (ref $super)) (return @@ -727,17 +717,11 @@ ;; CHECK: (type $4 (func (result (ref $super1) (ref $super2)))) ;; CHECK: (func $return-many (type $4) (result (ref $super1) (ref $super2)) - ;; 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: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (struct.new_default $sub1) + ;; CHECK-NEXT: (struct.new_default $sub2) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-many (result (ref $super1) (ref $super2)) @@ -1043,7 +1027,6 @@ ;; 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. @@ -1054,7 +1037,6 @@ ;; CHECK: (func $callee (type $f) (result (ref $sub)) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $callee (result (ref $sub)) (unreachable) @@ -1829,7 +1811,6 @@ ;; CHECK-NEXT: (try_table (catch $tag $label) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $test (result (ref $super)) @@ -2049,22 +2030,16 @@ ;; 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: (tuple.make 2 + ;; CHECK-NEXT: (local.set $Bs ;; CHECK-NEXT: (block - ;; 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: (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: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/validation/unreachable-concrete-block-end-invalid.wast b/test/lit/validation/unreachable-concrete-block-end-invalid.wast new file mode 100644 index 00000000000..06062e5e534 --- /dev/null +++ b/test/lit/validation/unreachable-concrete-block-end-invalid.wast @@ -0,0 +1,13 @@ +;; RUN: not wasm-opt %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: not wasm-as %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: wasm-opt %s -all --no-validation -o /dev/null + +;; CHECK: popping from empty stack + +(module + (func (result i32) + (block + (unreachable) + ) + ) +) diff --git a/test/lit/validation/unreachable-concrete-block-end-valid.wast b/test/lit/validation/unreachable-concrete-block-end-valid.wast deleted file mode 100644 index fd9afbf657f..00000000000 --- a/test/lit/validation/unreachable-concrete-block-end-valid.wast +++ /dev/null @@ -1,13 +0,0 @@ -;; 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-if-double-drop-invalid.wast b/test/lit/validation/unreachable-if-double-drop-invalid.wast index cfeace07628..fd11368abf2 100644 --- a/test/lit/validation/unreachable-if-double-drop-invalid.wast +++ b/test/lit/validation/unreachable-if-double-drop-invalid.wast @@ -1,13 +1,12 @@ -;; RUN: not wasm-as %s -o /dev/null 2>&1 | filecheck %s +;; RUN: not wasm-as %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: not wasm-opt %s -all -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)) + (func + (block (result i32) + (unreachable) ) (drop) (drop) diff --git a/test/lit/validation/unreachable-loop-drop-invalid.wast b/test/lit/validation/unreachable-loop-drop-invalid.wast index d88ca6fd150..6c296c12d31 100644 --- a/test/lit/validation/unreachable-loop-drop-invalid.wast +++ b/test/lit/validation/unreachable-loop-drop-invalid.wast @@ -1,7 +1,8 @@ -;; RUN: wasm-opt %s -all -o /dev/null -;; RUN: wasm-as %s -all -o /dev/null +;; RUN: not wasm-opt %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: not wasm-as %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: wasm-opt %s -all --no-validation -o /dev/null +;; RUN: wasm-as %s -all --no-validation -o /dev/null -;; Parser accepts this IR (same as baseline). Wasm validation of the resulting -;; module is not checked here. +;; CHECK: popping from empty stack (module (func (loop (unreachable)) (drop))) diff --git a/test/lit/validation/unreachable-multivalue-drop-invalid.wast b/test/lit/validation/unreachable-multivalue-drop-invalid.wast new file mode 100644 index 00000000000..50bd9702e29 --- /dev/null +++ b/test/lit/validation/unreachable-multivalue-drop-invalid.wast @@ -0,0 +1,15 @@ +;; RUN: not wasm-opt %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: not wasm-as %s -all -o /dev/null 2>&1 | filecheck %s + +;; CHECK: popping from empty stack + +(module + (func + (block (result i32 i64) + (unreachable) + ) + (drop) + (drop) + (drop) + ) +) diff --git a/test/lit/validation/unreachable-multivalue-drop-valid.wast b/test/lit/validation/unreachable-multivalue-drop-valid.wast new file mode 100644 index 00000000000..42fded3d972 --- /dev/null +++ b/test/lit/validation/unreachable-multivalue-drop-valid.wast @@ -0,0 +1,12 @@ +;; RUN: wasm-opt %s -all -o /dev/null +;; RUN: wasm-as %s -all -o /dev/null + +(module + (func + (block (result i32 i64) + (unreachable) + ) + (drop) + (drop) + ) +) diff --git a/test/lit/validation/unreachable-stack-isolation-invalid.wast b/test/lit/validation/unreachable-stack-isolation-invalid.wast new file mode 100644 index 00000000000..8ae500de075 --- /dev/null +++ b/test/lit/validation/unreachable-stack-isolation-invalid.wast @@ -0,0 +1,13 @@ +;; RUN: not wasm-opt %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: not wasm-as %s -all -o /dev/null 2>&1 | filecheck %s + +;; CHECK: popping from empty stack + +(module + (func + (i32.const 1) + (block + (drop) + ) + ) +) diff --git a/test/lit/validation/unreachable-try-return-call-valid.wast b/test/lit/validation/unreachable-try-return-call-valid.wast index 9dd8a7bad96..702bcdfac96 100644 --- a/test/lit/validation/unreachable-try-return-call-valid.wast +++ b/test/lit/validation/unreachable-try-return-call-valid.wast @@ -1,8 +1,8 @@ -;; RUN: wasm-as %s -all -o /dev/null -;; RUN: wasm-opt %s -all -o /dev/null +;; RUN: wasm-as %s -all --no-validation -o /dev/null +;; RUN: wasm-opt %s -all --no-validation -o /dev/null -;; Void unreachable try with return_call must remain parseable in functions -;; with concrete result types (see inlining-unreachable.wast module 2). +;; Void unreachable try with return_call is valid Binaryen IR for inlining +;; tests but not valid Wasm at function end; parse with --no-validation. (module (import "env" "imported" (func $imported (param i32) (result i32))) diff --git a/test/lit/validation/unreachable-void-block-drop-folded-invalid.wast b/test/lit/validation/unreachable-void-block-drop-folded-invalid.wast new file mode 100644 index 00000000000..e45e39c5b9b --- /dev/null +++ b/test/lit/validation/unreachable-void-block-drop-folded-invalid.wast @@ -0,0 +1,6 @@ +;; RUN: not wasm-opt %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: wasm-opt %s -all --no-validation -o /dev/null + +;; CHECK: popping from empty stack + +(module (func (drop (block (unreachable))))) diff --git a/test/lit/validation/unreachable-void-block-drop-invalid.wast b/test/lit/validation/unreachable-void-block-drop-invalid.wast index b64011e2dfb..e195b5e291e 100644 --- a/test/lit/validation/unreachable-void-block-drop-invalid.wast +++ b/test/lit/validation/unreachable-void-block-drop-invalid.wast @@ -1,7 +1,8 @@ -;; RUN: wasm-opt %s -all -o /dev/null -;; RUN: wasm-as %s -all -o /dev/null +;; RUN: not wasm-opt %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: not wasm-as %s -all -o /dev/null 2>&1 | filecheck %s +;; RUN: wasm-opt %s -all --no-validation -o /dev/null +;; RUN: wasm-as %s -all --no-validation -o /dev/null -;; Parser accepts this IR (same as baseline). Wasm validation of the resulting -;; module is not checked here. +;; CHECK: popping from empty stack (module (func (block (unreachable)) (drop))) diff --git a/test/lit/wasm-split/split-module-items.wast b/test/lit/wasm-split/split-module-items.wast index 3816b50ce9b..6180be550f2 100644 --- a/test/lit/wasm-split/split-module-items.wast +++ b/test/lit/wasm-split/split-module-items.wast @@ -1,4 +1,4 @@ -;; RUN: wasm-split %s -all -g -o1 %t.1.wasm -o2 %t.2.wasm --keep-funcs=keep +;; RUN: wasm-split %s -all -g --no-validation -o1 %t.1.wasm -o2 %t.2.wasm --keep-funcs=keep ;; RUN: wasm-dis %t.1.wasm | filecheck %s --check-prefix PRIMARY ;; RUN: wasm-dis %t.2.wasm | filecheck %s --check-prefix SECONDARY diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast index a120fd004ee..0b04d385961 100644 --- a/test/lit/wat-kitchen-sink.wast +++ b/test/lit/wat-kitchen-sink.wast @@ -672,7 +672,6 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $add-unreachable (result i32) unreachable @@ -685,7 +684,6 @@ ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $add-unreachable-2 (result i32) i32.const 1 @@ -701,7 +699,6 @@ ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) (func $add-unreachable-3 (result i32) i32.const 1 @@ -843,13 +840,7 @@ ;; CHECK-NEXT: (i32.const 4) ;; 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: ) (func $add-twice-unreachable-3 (type $ret2) i32.const 1 @@ -1004,13 +995,7 @@ ;; CHECK-NEXT: (block $l (type $ret2) (result i32 i32) ;; CHECK-NEXT: (nop) ;; CHECK-NEXT: (nop) - ;; 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: (unreachable) @@ -1669,19 +1654,17 @@ ;; CHECK: (func $if-else-brs-i32 (type $1) (result i32) ;; CHECK-NEXT: (block $label (result i32) - ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (if ;; 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: ) @@ -2465,7 +2448,6 @@ ;; 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: ) @@ -2492,7 +2474,6 @@ ;; 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: ) @@ -2515,12 +2496,10 @@ ;; 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: ) @@ -2692,7 +2671,6 @@ ;; CHECK-NEXT: (br $label ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br-value (result i32) @@ -2708,7 +2686,6 @@ ;; CHECK-NEXT: (br $label ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br-value-drop (result i32) @@ -2719,17 +2696,11 @@ ;; CHECK: (func $br-multivalue (type $5) (result i32 i64) ;; CHECK-NEXT: (block $label (type $5) (result i32 i64) - ;; 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: (br $label + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2744,17 +2715,11 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (f32.const 0) ;; CHECK-NEXT: ) - ;; 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: (br $label + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2773,7 +2738,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br-mismatch-after (result i32) @@ -2793,7 +2757,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $br-mismatch-after-extra (result i32) @@ -2970,7 +2933,6 @@ ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2987,18 +2949,12 @@ ;; 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: (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: (br_table $a $b + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i64.const 42) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3016,28 +2972,16 @@ ;; CHECK: (func $br-table-multivalue-glb (type $48) (result anyref anyref) ;; CHECK-NEXT: (block $a (type $95) (result arrayref structref) - ;; 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: (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: ) + ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3063,7 +3007,6 @@ ;; CHECK-NEXT: (br_table $a $b ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3687,7 +3630,6 @@ ;; 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 @@ -3695,17 +3637,11 @@ ) ;; CHECK: (func $return-two (type $21) (param $0 i32) (param $1 i64) (result i32 i64) - ;; 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: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-two (param i32 i64) (result i32 i64) @@ -3715,17 +3651,11 @@ ) ;; CHECK: (func $return-two-first-unreachable (type $55) (param $0 i64) (result i32 i64) - ;; 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: (return + ;; CHECK-NEXT: (tuple.make 2 ;; 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) @@ -3738,13 +3668,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (tuple.make 2 - ;; CHECK-NEXT: (block - ;; CHECK-NEXT: (return - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -3755,17 +3679,11 @@ ) ;; CHECK: (func $return-two-second-unreachable-tuple (type $28) (param $0 i32) (result i32 i64) - ;; 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: (return + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-two-second-unreachable-tuple (param i32) (result i32 i64) @@ -3776,14 +3694,8 @@ ) ;; CHECK: (func $return-multivalue (type $5) (result i32 i64) - ;; 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: (return + ;; CHECK-NEXT: (call $return-multivalue) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $return-multivalue (result i32 i64) @@ -4179,7 +4091,6 @@ ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4203,7 +4114,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4226,11 +4136,9 @@ ;; 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: ) @@ -4256,7 +4164,6 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4279,11 +4186,9 @@ ;; 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: ) @@ -4754,7 +4659,6 @@ ;; 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 @@ -5039,18 +4943,10 @@ ;; CHECK-NEXT: (local.get $ct) ;; CHECK-NEXT: ) ;; 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: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (br $label) @@ -5131,8 +5027,6 @@ ;; 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: )