summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parser/context-defs.cpp3
-rw-r--r--src/parser/contexts.h5
-rw-r--r--src/parser/wat-parser.cpp3
-rw-r--r--src/wasm-ir-builder.h22
-rw-r--r--src/wasm/wasm-ir-builder.cpp66
-rw-r--r--test/lit/wat-kitchen-sink.wast155
6 files changed, 136 insertions, 118 deletions
diff --git a/src/parser/context-defs.cpp b/src/parser/context-defs.cpp
index b43b7049f..76e61d4fb 100644
--- a/src/parser/context-defs.cpp
+++ b/src/parser/context-defs.cpp
@@ -57,9 +57,6 @@ Result<> ParseDefsCtx::addFunc(Name,
std::optional<LocalsT>,
Index pos) {
CHECK_ERR(withLoc(pos, irBuilder.visitEnd()));
- auto body = irBuilder.build();
- CHECK_ERR(withLoc(pos, body));
- wasm.functions[index]->body = *body;
return Ok{};
}
diff --git a/src/parser/contexts.h b/src/parser/contexts.h
index f2aeb2489..7eedcccc2 100644
--- a/src/parser/contexts.h
+++ b/src/parser/contexts.h
@@ -816,9 +816,10 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
IRBuilder irBuilder;
- void setFunction(Function* func) {
+ Result<> visitFunctionStart(Function* func) {
this->func = func;
- irBuilder.setFunction(func);
+ CHECK_ERR(irBuilder.visitFunctionStart(func));
+ return Ok{};
}
ParseDefsCtx(std::string_view in,
diff --git a/src/parser/wat-parser.cpp b/src/parser/wat-parser.cpp
index 7b58be4d5..7e106d3b9 100644
--- a/src/parser/wat-parser.cpp
+++ b/src/parser/wat-parser.cpp
@@ -157,8 +157,7 @@ Result<> parseModule(Module& wasm, std::string_view input) {
for (Index i = 0; i < decls.funcDefs.size(); ++i) {
ctx.index = i;
- ctx.setFunction(wasm.functions[i].get());
- CHECK_ERR(ctx.irBuilder.makeBlock(Name{}, ctx.func->getResults()));
+ CHECK_ERR(ctx.visitFunctionStart(wasm.functions[i].get()));
WithPosition with(ctx, decls.funcDefs[i].pos);
auto parsed = func(ctx);
CHECK_ERR(parsed);
diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h
index a6afc63c4..2da69fff7 100644
--- a/src/wasm-ir-builder.h
+++ b/src/wasm-ir-builder.h
@@ -51,6 +51,7 @@ public:
// Handle the boundaries of control flow structures. Users may choose to use
// the corresponding `makeXYZ` function below instead of `visitXYZStart`, but
// either way must call `visitEnd` and friends at the appropriate times.
+ [[nodiscard]] Result<> visitFunctionStart(Function* func);
[[nodiscard]] Result<> visitBlockStart(Block* block);
[[nodiscard]] Result<> visitIfStart(If* iff, Name label = {});
[[nodiscard]] Result<> visitElse();
@@ -170,8 +171,6 @@ public:
// [[nodiscard]] Result<> makeStringSliceWTF();
// [[nodiscard]] Result<> makeStringSliceIter();
- void setFunction(Function* func) { this->func = func; }
-
// Private functions that must be public for technical reasons.
[[nodiscard]] Result<> visitExpression(Expression*);
[[nodiscard]] Result<> visitBlock(Block*);
@@ -189,6 +188,9 @@ private:
// to have.
struct ScopeCtx {
struct NoScope {};
+ struct FuncScope {
+ Function* func;
+ };
struct BlockScope {
Block* block;
};
@@ -203,8 +205,8 @@ private:
struct LoopScope {
Loop* loop;
};
- using Scope =
- std::variant<NoScope, BlockScope, IfScope, ElseScope, LoopScope>;
+ using Scope = std::
+ variant<NoScope, FuncScope, BlockScope, IfScope, ElseScope, LoopScope>;
// The control flow structure we are building expressions for.
Scope scope;
@@ -217,6 +219,9 @@ private:
ScopeCtx() : scope(NoScope{}) {}
ScopeCtx(Scope scope) : scope(scope) {}
+ static ScopeCtx makeFunc(Function* func) {
+ return ScopeCtx(FuncScope{func});
+ }
static ScopeCtx makeBlock(Block* block) {
return ScopeCtx(BlockScope{block});
}
@@ -229,6 +234,12 @@ private:
static ScopeCtx makeLoop(Loop* loop) { return ScopeCtx(LoopScope{loop}); }
bool isNone() { return std::get_if<NoScope>(&scope); }
+ Function* getFunction() {
+ if (auto* funcScope = std::get_if<FuncScope>(&scope)) {
+ return funcScope->func;
+ }
+ return nullptr;
+ }
Block* getBlock() {
if (auto* blockScope = std::get_if<BlockScope>(&scope)) {
return blockScope->block;
@@ -254,6 +265,9 @@ private:
return nullptr;
}
Type getResultType() {
+ if (auto* func = getFunction()) {
+ return func->type.getSignature().results;
+ }
if (auto* block = getBlock()) {
return block->type;
}
diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp
index 585f9be49..4312fefe3 100644
--- a/src/wasm/wasm-ir-builder.cpp
+++ b/src/wasm/wasm-ir-builder.cpp
@@ -281,6 +281,15 @@ Result<> IRBuilder::visitArrayNew(ArrayNew* curr) {
return Ok{};
}
+Result<> IRBuilder::visitFunctionStart(Function* func) {
+ if (!scopeStack.empty()) {
+ return Err{"unexpected start of function"};
+ }
+ scopeStack.push_back(ScopeCtx::makeFunc(func));
+ this->func = func;
+ return Ok{};
+}
+
Result<> IRBuilder::visitBlockStart(Block* curr) {
scopeStack.push_back(ScopeCtx::makeBlock(curr));
return Ok{};
@@ -327,12 +336,12 @@ Result<Expression*> IRBuilder::finishScope(Block* block) {
auto hoisted = hoistLastValue();
CHECK_ERR(hoisted);
auto hoistedType = scope.exprStack.back()->type;
- if (hoistedType.size() != block->type.size()) {
+ if (hoistedType.size() != type.size()) {
// We cannot propagate the hoisted value directly because it does not
// have the correct number of elements. Break it up if necessary and
// construct our returned tuple from parts.
CHECK_ERR(packageHoistedValue(*hoisted));
- std::vector<Expression*> elems(block->type.size());
+ std::vector<Expression*> elems(type.size());
for (size_t i = 0; i < elems.size(); ++i) {
auto elem = pop();
CHECK_ERR(elem);
@@ -369,11 +378,11 @@ Result<Expression*> IRBuilder::finishScope(Block* block) {
} else {
// More than one expression, so we need a block. Allocate one if we weren't
// already given one.
- if (!block) {
- block = wasm.allocator.alloc<Block>();
- block->type = type;
+ if (block) {
+ block->list.set(scope.exprStack);
+ } else {
+ block = builder.makeBlock(scope.exprStack, type);
}
- block->list.set(scope.exprStack);
ret = block;
}
scopeStack.pop_back();
@@ -395,50 +404,45 @@ Result<> IRBuilder::visitElse() {
}
Result<> IRBuilder::visitEnd() {
- auto& scope = getScope();
+ auto scope = getScope();
if (scope.isNone()) {
return Err{"unexpected end"};
}
- if (auto* block = scope.getBlock()) {
- auto expr = finishScope(block);
- CHECK_ERR(expr);
+ auto expr = finishScope(scope.getBlock());
+ CHECK_ERR(expr);
+
+ // If the scope expression cannot be directly labeled, we may need to wrap it
+ // in a block.
+ auto maybeWrapForLabel = [&](Expression* curr) -> Expression* {
+ if (auto label = scope.getLabel()) {
+ return builder.makeBlock(label, {curr}, curr->type);
+ }
+ return curr;
+ };
+
+ if (auto* func = scope.getFunction()) {
+ func->body = *expr;
+ } else if (auto* block = scope.getBlock()) {
assert(*expr == block);
// TODO: Track branches so we can know whether this block is a target and
// finalize more efficiently.
block->finalize(block->type);
push(block);
- return Ok{};
} else if (auto* loop = scope.getLoop()) {
- auto expr = finishScope();
- CHECK_ERR(expr);
loop->body = *expr;
loop->finalize(loop->type);
push(loop);
- return Ok{};
- }
- auto label = scope.getLabel();
- Expression* scopeExpr = nullptr;
- if (auto* iff = scope.getIf()) {
- auto expr = finishScope();
- CHECK_ERR(expr);
+ } else if (auto* iff = scope.getIf()) {
iff->ifTrue = *expr;
iff->ifFalse = nullptr;
iff->finalize(iff->type);
- scopeExpr = iff;
+ push(maybeWrapForLabel(iff));
} else if (auto* iff = scope.getElse()) {
- auto expr = finishScope();
- CHECK_ERR(expr);
iff->ifFalse = *expr;
iff->finalize(iff->type);
- scopeExpr = iff;
- }
- assert(scopeExpr && "unexpected scope kind");
- if (label) {
- // We cannot directly name an If in Binaryen IR, so we need to wrap it in
- // a block.
- push(builder.makeBlock(label, {scopeExpr}, scopeExpr->type));
+ push(maybeWrapForLabel(iff));
} else {
- push(scopeExpr);
+ WASM_UNREACHABLE("unexpected scope kind");
}
return Ok{};
}
diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast
index 6475b7f99..a3a7a6c66 100644
--- a/test/lit/wat-kitchen-sink.wast
+++ b/test/lit/wat-kitchen-sink.wast
@@ -7,27 +7,25 @@
;; CHECK: (type $void (sub (func)))
+ ;; CHECK: (type $1 (func (result i32)))
+
;; CHECK: (type $ret2 (func (result i32 i32)))
(type $ret2 (func (result i32 i32)))
(rec
- ;; CHECK: (type $2 (func (result i32)))
-
;; CHECK: (type $pair (struct (field (mut i32)) (field (mut i64))))
- ;; CHECK: (type $a1 (array i64))
+ ;; CHECK: (type $4 (func (param i32 i64)))
- ;; CHECK: (type $5 (func (param i32 i64)))
+ ;; CHECK: (type $a1 (array i64))
;; CHECK: (type $a2 (array (mut f32)))
- ;; CHECK: (type $7 (func (result i32 i64)))
-
- ;; CHECK: (type $8 (func (param i32)))
+ ;; CHECK: (type $7 (func (param i32)))
- ;; CHECK: (type $9 (func (param i32 i32 i32)))
+ ;; CHECK: (type $8 (func (param i32 i32 i32)))
- ;; CHECK: (type $10 (func (param v128 i32) (result v128)))
+ ;; CHECK: (type $9 (func (param v128 i32) (result v128)))
;; CHECK: (type $packed-i8 (array (mut i8)))
@@ -35,29 +33,31 @@
;; CHECK: (type $many (sub (func (param i32 i64 f32 f64) (result anyref (ref func)))))
- ;; CHECK: (type $14 (func (param i32 i32)))
+ ;; CHECK: (type $13 (func (param i32 i32)))
- ;; CHECK: (type $15 (func (param i32 i32 f64 f64)))
+ ;; CHECK: (type $14 (func (param i32 i32 f64 f64)))
- ;; CHECK: (type $16 (func (param i64)))
+ ;; CHECK: (type $15 (func (param i64)))
- ;; CHECK: (type $17 (func (param v128) (result i32)))
+ ;; CHECK: (type $16 (func (param v128) (result i32)))
- ;; CHECK: (type $18 (func (param v128 v128) (result v128)))
+ ;; CHECK: (type $17 (func (param v128 v128) (result v128)))
- ;; CHECK: (type $19 (func (param v128 v128 v128) (result v128)))
+ ;; CHECK: (type $18 (func (param v128 v128 v128) (result v128)))
- ;; CHECK: (type $20 (func (param i32 i64 v128)))
+ ;; CHECK: (type $19 (func (param i32 i64 v128)))
- ;; CHECK: (type $21 (func (param i32 i32 i64 i64)))
+ ;; CHECK: (type $20 (func (param i32 i32 i64 i64)))
- ;; CHECK: (type $22 (func (param i32) (result i32)))
+ ;; CHECK: (type $21 (func (param i32) (result i32)))
- ;; CHECK: (type $23 (func (param i32 i64) (result i32 i64)))
+ ;; CHECK: (type $22 (func (param i32 i64) (result i32 i64)))
- ;; CHECK: (type $24 (func (param i64) (result i32 i64)))
+ ;; CHECK: (type $23 (func (param i64) (result i32 i64)))
- ;; CHECK: (type $25 (func (param i32) (result i32 i64)))
+ ;; CHECK: (type $24 (func (param i32) (result i32 i64)))
+
+ ;; CHECK: (type $25 (func (result i32 i64)))
;; CHECK: (type $26 (func (param anyref) (result i32)))
@@ -225,15 +225,18 @@
;; CHECK: (export "f5.1" (func $fimport$1))
;; CHECK: (func $0 (type $void)
+ ;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
- ;; CHECK: (func $f1 (type $8) (param $0 i32)
+ ;; CHECK: (func $f1 (type $7) (param $0 i32)
+ ;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $f1 (param i32))
- ;; CHECK: (func $f2 (type $8) (param $x i32)
+ ;; CHECK: (func $f2 (type $7) (param $x i32)
+ ;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $f2 (param $x i32))
- ;; CHECK: (func $f3 (type $2) (result i32)
+ ;; CHECK: (func $f3 (type $1) (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
(func $f3 (result i32)
@@ -243,6 +246,7 @@
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i64)
;; CHECK-NEXT: (local $l f32)
+ ;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $f4 (type 17) (local i32 i64) (local $l f32))
(func (export "f5.0") (export "f5.1") (import "mod" "f5"))
@@ -307,7 +311,7 @@
nop
)
- ;; CHECK: (func $add (type $2) (result i32)
+ ;; CHECK: (func $add (type $1) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
@@ -319,7 +323,7 @@
i32.add
)
- ;; CHECK: (func $add-folded (type $2) (result i32)
+ ;; CHECK: (func $add-folded (type $1) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
@@ -332,7 +336,7 @@
)
)
- ;; CHECK: (func $add-stacky (type $2) (result i32)
+ ;; CHECK: (func $add-stacky (type $1) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (block (result i32)
@@ -352,7 +356,7 @@
i32.add
)
- ;; CHECK: (func $add-stacky-2 (type $2) (result i32)
+ ;; CHECK: (func $add-stacky-2 (type $1) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
@@ -372,7 +376,7 @@
i32.add
)
- ;; CHECK: (func $add-stacky-3 (type $2) (result i32)
+ ;; CHECK: (func $add-stacky-3 (type $1) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i32.add
@@ -390,7 +394,7 @@
nop
)
- ;; CHECK: (func $add-stacky-4 (type $2) (result i32)
+ ;; CHECK: (func $add-stacky-4 (type $1) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local $scratch_1 i32)
;; CHECK-NEXT: (local $scratch_2 i32)
@@ -424,7 +428,7 @@
nop
)
- ;; CHECK: (func $add-unreachable (type $2) (result i32)
+ ;; CHECK: (func $add-unreachable (type $1) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (i32.const 1)
@@ -436,7 +440,7 @@
i32.add
)
- ;; CHECK: (func $add-unreachable-2 (type $2) (result i32)
+ ;; CHECK: (func $add-unreachable-2 (type $1) (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
@@ -451,7 +455,7 @@
i32.add
)
- ;; CHECK: (func $add-unreachable-3 (type $2) (result i32)
+ ;; CHECK: (func $add-unreachable-3 (type $1) (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
@@ -672,7 +676,7 @@
drop
)
- ;; CHECK: (func $locals (type $14) (param $0 i32) (param $x i32)
+ ;; CHECK: (func $locals (type $13) (param $0 i32) (param $x i32)
;; CHECK-NEXT: (local $2 i32)
;; CHECK-NEXT: (local $y i32)
;; CHECK-NEXT: (drop
@@ -813,21 +817,19 @@
;; CHECK: (func $multivalue-nested (type $ret2) (result i32 i32)
;; CHECK-NEXT: (local $scratch (i32 i32))
- ;; CHECK-NEXT: (block (result i32 i32)
- ;; CHECK-NEXT: (nop)
- ;; CHECK-NEXT: (local.set $scratch
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (local.set $scratch
+ ;; CHECK-NEXT: (block (result i32 i32)
;; CHECK-NEXT: (block (result i32 i32)
- ;; CHECK-NEXT: (block (result i32 i32)
- ;; CHECK-NEXT: (tuple.make
- ;; CHECK-NEXT: (i32.const 0)
- ;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (tuple.make
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
- ;; CHECK-NEXT: (nop)
- ;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
(func $multivalue-nested (type $ret2)
block (type $ret2)
@@ -973,7 +975,7 @@
end
)
- ;; CHECK: (func $if-else-result (type $2) (result i32)
+ ;; CHECK: (func $if-else-result (type $1) (result i32)
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 1)
@@ -989,7 +991,7 @@
end
)
- ;; CHECK: (func $if-else-labeled-result (type $2) (result i32)
+ ;; CHECK: (func $if-else-labeled-result (type $1) (result i32)
;; CHECK-NEXT: (block $l (result i32)
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (i32.const 0)
@@ -1135,7 +1137,7 @@
)
)
- ;; CHECK: (func $if-else-folded-result (type $2) (result i32)
+ ;; CHECK: (func $if-else-folded-result (type $1) (result i32)
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 1)
@@ -1154,7 +1156,7 @@
)
)
- ;; CHECK: (func $if-else-folded-labeled-result (type $2) (result i32)
+ ;; CHECK: (func $if-else-folded-labeled-result (type $1) (result i32)
;; CHECK-NEXT: (block $l (result i32)
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (i32.const 0)
@@ -1320,7 +1322,7 @@
end $l
)
- ;; CHECK: (func $loop-result (type $2) (result i32)
+ ;; CHECK: (func $loop-result (type $1) (result i32)
;; CHECK-NEXT: (loop (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
@@ -1331,7 +1333,7 @@
end
)
- ;; CHECK: (func $loop-labeled-result (type $2) (result i32)
+ ;; CHECK: (func $loop-labeled-result (type $1) (result i32)
;; CHECK-NEXT: (loop $l (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
@@ -1401,7 +1403,7 @@
)
)
- ;; CHECK: (func $loop-folded-result (type $2) (result i32)
+ ;; CHECK: (func $loop-folded-result (type $1) (result i32)
;; CHECK-NEXT: (loop (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
@@ -1412,7 +1414,7 @@
)
)
- ;; CHECK: (func $loop-folded-labeled-result (type $2) (result i32)
+ ;; CHECK: (func $loop-folded-labeled-result (type $1) (result i32)
;; CHECK-NEXT: (loop $l (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
@@ -1423,7 +1425,7 @@
)
)
- ;; CHECK: (func $binary (type $15) (param $0 i32) (param $1 i32) (param $2 f64) (param $3 f64)
+ ;; CHECK: (func $binary (type $14) (param $0 i32) (param $1 i32) (param $2 f64) (param $3 f64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (local.get $0)
@@ -1448,7 +1450,7 @@
drop
)
- ;; CHECK: (func $unary (type $16) (param $0 i64)
+ ;; CHECK: (func $unary (type $15) (param $0 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i64.eqz
;; CHECK-NEXT: (local.get $0)
@@ -1461,7 +1463,7 @@
drop
)
- ;; CHECK: (func $select (type $9) (param $0 i32) (param $1 i32) (param $2 i32)
+ ;; CHECK: (func $select (type $8) (param $0 i32) (param $1 i32) (param $2 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (select
;; CHECK-NEXT: (local.get $0)
@@ -1534,7 +1536,7 @@
drop
)
- ;; CHECK: (func $memory-grow (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $memory-grow (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.grow $mem
;; CHECK-NEXT: (local.get $0)
@@ -1573,7 +1575,7 @@
global.set 4
)
- ;; CHECK: (func $load (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $load (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.load $mem offset=42
;; CHECK-NEXT: (local.get $0)
@@ -1602,7 +1604,7 @@
drop
)
- ;; CHECK: (func $store (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $store (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (i32.store $mem offset=42 align=1
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 0)
@@ -1628,7 +1630,7 @@
f32.store $mem-i64
)
- ;; CHECK: (func $atomic-rmw (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $atomic-rmw (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.atomic.rmw16.add_u $mem
;; CHECK-NEXT: (local.get $0)
@@ -1653,7 +1655,7 @@
drop
)
- ;; CHECK: (func $atomic-cmpxchg (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $atomic-cmpxchg (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.atomic.rmw8.cmpxchg_u $mem
;; CHECK-NEXT: (local.get $0)
@@ -1682,7 +1684,7 @@
drop
)
- ;; CHECK: (func $atomic-wait (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $atomic-wait (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.atomic.wait32 $mem
;; CHECK-NEXT: (local.get $0)
@@ -1711,7 +1713,7 @@
drop
)
- ;; CHECK: (func $atomic-notify (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $atomic-notify (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.atomic.notify $mem offset=8
;; CHECK-NEXT: (local.get $0)
@@ -1743,7 +1745,7 @@
atomic.fence
)
- ;; CHECK: (func $simd-extract (type $17) (param $0 v128) (result i32)
+ ;; CHECK: (func $simd-extract (type $16) (param $0 v128) (result i32)
;; CHECK-NEXT: (i32x4.extract_lane 3
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
@@ -1753,7 +1755,7 @@
i32x4.extract_lane 3
)
- ;; CHECK: (func $simd-replace (type $10) (param $0 v128) (param $1 i32) (result v128)
+ ;; CHECK: (func $simd-replace (type $9) (param $0 v128) (param $1 i32) (result v128)
;; CHECK-NEXT: (i32x4.replace_lane 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
@@ -1765,7 +1767,7 @@
i32x4.replace_lane 2
)
- ;; CHECK: (func $simd-shuffle (type $18) (param $0 v128) (param $1 v128) (result v128)
+ ;; CHECK: (func $simd-shuffle (type $17) (param $0 v128) (param $1 v128) (result v128)
;; CHECK-NEXT: (i8x16.shuffle 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
@@ -1777,7 +1779,7 @@
i8x16.shuffle 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
)
- ;; CHECK: (func $simd-ternary (type $19) (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
+ ;; CHECK: (func $simd-ternary (type $18) (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
;; CHECK-NEXT: (v128.bitselect
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
@@ -1791,7 +1793,7 @@
v128.bitselect
)
- ;; CHECK: (func $simd-shift (type $10) (param $0 v128) (param $1 i32) (result v128)
+ ;; CHECK: (func $simd-shift (type $9) (param $0 v128) (param $1 i32) (result v128)
;; CHECK-NEXT: (i8x16.shl
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
@@ -1803,7 +1805,7 @@
i8x16.shl
)
- ;; CHECK: (func $simd-load (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $simd-load (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.load8x8_s $mem offset=8
;; CHECK-NEXT: (local.get $0)
@@ -1824,7 +1826,7 @@
drop
)
- ;; CHECK: (func $simd-load-store-lane (type $20) (param $0 i32) (param $1 i64) (param $2 v128)
+ ;; CHECK: (func $simd-load-store-lane (type $19) (param $0 i32) (param $1 i64) (param $2 v128)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.load16_lane $mem 7
;; CHECK-NEXT: (local.get $0)
@@ -1846,7 +1848,7 @@
v128.store64_lane 3 align=4 0
)
- ;; CHECK: (func $memory-init (type $9) (param $0 i32) (param $1 i32) (param $2 i32)
+ ;; CHECK: (func $memory-init (type $8) (param $0 i32) (param $1 i32) (param $2 i32)
;; CHECK-NEXT: (memory.init $mem-i32 $passive
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
@@ -1887,7 +1889,7 @@
data.drop $passive
)
- ;; CHECK: (func $memory-copy (type $21) (param $0 i32) (param $1 i32) (param $2 i64) (param $3 i64)
+ ;; CHECK: (func $memory-copy (type $20) (param $0 i32) (param $1 i32) (param $2 i64) (param $3 i64)
;; CHECK-NEXT: (memory.copy $mem $mem
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
@@ -1919,7 +1921,7 @@
memory.copy $mem-i64 3
)
- ;; CHECK: (func $memory-fill (type $5) (param $0 i32) (param $1 i64)
+ ;; CHECK: (func $memory-fill (type $4) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (memory.fill $mem
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
@@ -1958,7 +1960,7 @@
return
)
- ;; CHECK: (func $return-one (type $22) (param $0 i32) (result i32)
+ ;; CHECK: (func $return-one (type $21) (param $0 i32) (result i32)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
@@ -1968,7 +1970,7 @@
return
)
- ;; CHECK: (func $return-two (type $23) (param $0 i32) (param $1 i64) (result i32 i64)
+ ;; CHECK: (func $return-two (type $22) (param $0 i32) (param $1 i64) (result i32 i64)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (tuple.make
;; CHECK-NEXT: (local.get $0)
@@ -1982,7 +1984,7 @@
return
)
- ;; CHECK: (func $return-two-first-unreachable (type $24) (param $0 i64) (result i32 i64)
+ ;; CHECK: (func $return-two-first-unreachable (type $23) (param $0 i64) (result i32 i64)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (tuple.make
;; CHECK-NEXT: (unreachable)
@@ -1996,7 +1998,7 @@
return
)
- ;; CHECK: (func $return-two-second-unreachable (type $25) (param $0 i32) (result i32 i64)
+ ;; CHECK: (func $return-two-second-unreachable (type $24) (param $0 i32) (result i32 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
@@ -2258,6 +2260,7 @@
)
;; CHECK: (func $use-types (type $59) (param $0 (ref $s0)) (param $1 (ref $s1)) (param $2 (ref $s2)) (param $3 (ref $s3)) (param $4 (ref $s4)) (param $5 (ref $s5)) (param $6 (ref $s6)) (param $7 (ref $s7)) (param $8 (ref $s8)) (param $9 (ref $a0)) (param $10 (ref $a1)) (param $11 (ref $a2)) (param $12 (ref $a3)) (param $13 (ref $subvoid)) (param $14 (ref $submany))
+ ;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $use-types
(param (ref $s0))