diff --git a/src/passes/InstrumentMemory.cpp b/src/passes/InstrumentMemory.cpp index 9bba5f537c3..d3b9f80f298 100644 --- a/src/passes/InstrumentMemory.cpp +++ b/src/passes/InstrumentMemory.cpp @@ -59,6 +59,7 @@ #include "asmjs/shared-constants.h" #include "shared-constants.h" +#include "support/string.h" #include #include #include @@ -93,14 +94,26 @@ static Name array_set_val_f32("array_set_val_f32"); static Name array_set_val_f64("array_set_val_f64"); static Name array_get_index("array_get_index"); static Name array_set_index("array_set_index"); +static Name memory_grow_pre("memory_grow_pre"); +static Name memory_grow_post("memory_grow_post"); // TODO: Add support for atomicRMW/cmpxchg -struct InstrumentMemory : public WalkerPass> { - // Adds calls to new imports. - bool addsEffects() override { return true; } +using InstructionFilter = std::optional>; + +#define CHECK_EXPRESSION(expr) \ + do { \ + if (filter && !filter->count(expr)) { \ + return; \ + } \ + } while (false) +struct AddInstrumentation : public WalkerPass> { + explicit AddInstrumentation(InstructionFilter filter) + : filter(std::move(filter)) {} void visitLoad(Load* curr) { + CHECK_EXPRESSION("load"); + id++; Builder builder(*getModule()); auto mem = getModule()->getMemory(curr->memory); @@ -134,6 +147,8 @@ struct InstrumentMemory : public WalkerPass> { } void visitStore(Store* curr) { + CHECK_EXPRESSION("store"); + id++; Builder builder(*getModule()); auto mem = getModule()->getMemory(curr->memory); @@ -167,6 +182,8 @@ struct InstrumentMemory : public WalkerPass> { } void visitStructGet(StructGet* curr) { + CHECK_EXPRESSION("struct.get"); + Builder builder(*getModule()); Name target; if (curr->type == Type::i32) { @@ -185,6 +202,8 @@ struct InstrumentMemory : public WalkerPass> { } void visitStructSet(StructSet* curr) { + CHECK_EXPRESSION("struct.set"); + Builder builder(*getModule()); Name target; if (curr->value->type == Type::i32) { @@ -205,6 +224,8 @@ struct InstrumentMemory : public WalkerPass> { } void visitArrayGet(ArrayGet* curr) { + CHECK_EXPRESSION("array.get"); + Builder builder(*getModule()); curr->index = builder.makeCall(array_get_index, @@ -227,6 +248,8 @@ struct InstrumentMemory : public WalkerPass> { } void visitArraySet(ArraySet* curr) { + CHECK_EXPRESSION("array.set"); + Builder builder(*getModule()); curr->index = builder.makeCall(array_set_index, @@ -250,10 +273,28 @@ struct InstrumentMemory : public WalkerPass> { curr->value->type); } + void visitMemoryGrow(MemoryGrow* curr) { + CHECK_EXPRESSION("memory.grow"); + + id++; + Builder builder(*getModule()); + auto addressType = getModule()->getMemory(curr->memory)->addressType; + curr->delta = + builder.makeCall(memory_grow_pre, + {builder.makeConst(int32_t(id)), curr->delta}, + addressType); + replaceCurrent(builder.makeCall( + memory_grow_post, {builder.makeConst(int32_t(id)), curr}, addressType)); + } + void visitModule(Module* curr) { auto addressType = curr->memories.empty() ? Type::i32 : curr->memories[0]->addressType; + // Grow. + addImport(curr, memory_grow_pre, {Type::i32, addressType}, addressType); + addImport(curr, memory_grow_post, {Type::i32, addressType}, addressType); + // Load. addImport(curr, load_ptr, @@ -300,7 +341,8 @@ struct InstrumentMemory : public WalkerPass> { } private: - Index id; + Index id = 0; + InstructionFilter filter; void addImport(Module* curr, Name name, Type params, Type results) { auto import = Builder::makeFunction(name, Signature(params, results), {}); @@ -310,6 +352,21 @@ struct InstrumentMemory : public WalkerPass> { } }; +struct InstrumentMemory : Pass { + // Adds calls to new imports. + bool addsEffects() override { return true; } + + void run(Module* module) override { + auto arg = getArgumentOrDefault("instrument-memory", ""); + InstructionFilter instructions; + if (arg.size() > 0) { + String::Split s(arg, ","); + instructions = std::unordered_set{s.begin(), s.end()}; + } + AddInstrumentation(std::move(instructions)).run(getPassRunner(), module); + } +}; + Pass* createInstrumentMemoryPass() { return new InstrumentMemory(); } } // namespace wasm diff --git a/test/lit/passes/instrument-memory-filter.wast b/test/lit/passes/instrument-memory-filter.wast new file mode 100644 index 00000000000..5dd1aa190dd --- /dev/null +++ b/test/lit/passes/instrument-memory-filter.wast @@ -0,0 +1,154 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. + +;; RUN: foreach %s %t wasm-opt --instrument-memory="load,memory.grow" -S -o - | filecheck %s + +;; The test validates the instruction filter used in this pass. +(module + (memory 256 256) + ;; CHECK: (type $0 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $1 (func)) + (type $1 (func)) + ;; CHECK: (type $2 (func (param i32 i32 i32 i32) (result i32))) + + ;; CHECK: (type $3 (func (param i32 i64) (result i64))) + + ;; CHECK: (type $4 (func (param i32 f32) (result f32))) + + ;; CHECK: (type $5 (func (param i32 f64) (result f64))) + + ;; CHECK: (import "env" "memory_grow_pre" (func $memory_grow_pre (param i32 i32) (result i32))) + + ;; CHECK: (import "env" "memory_grow_post" (func $memory_grow_post (param i32 i32) (result i32))) + + ;; CHECK: (import "env" "load_ptr" (func $load_ptr (param i32 i32 i32 i32) (result i32))) + + ;; CHECK: (import "env" "load_val_i32" (func $load_val_i32 (param i32 i32) (result i32))) + + ;; CHECK: (import "env" "load_val_i64" (func $load_val_i64 (param i32 i64) (result i64))) + + ;; CHECK: (import "env" "load_val_f32" (func $load_val_f32 (param i32 f32) (result f32))) + + ;; CHECK: (import "env" "load_val_f64" (func $load_val_f64 (param i32 f64) (result f64))) + + ;; CHECK: (import "env" "store_ptr" (func $store_ptr (param i32 i32 i32 i32) (result i32))) + + ;; CHECK: (import "env" "store_val_i32" (func $store_val_i32 (param i32 i32) (result i32))) + + ;; CHECK: (import "env" "store_val_i64" (func $store_val_i64 (param i32 i64) (result i64))) + + ;; CHECK: (import "env" "store_val_f32" (func $store_val_f32 (param i32 f32) (result f32))) + + ;; CHECK: (import "env" "store_val_f64" (func $store_val_f64 (param i32 f64) (result f64))) + + ;; CHECK: (memory $0 256 256) + + ;; CHECK: (func $A + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $load_val_i32 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.load8_s + ;; CHECK-NEXT: (call $load_ptr + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $load_val_i32 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.load8_u + ;; CHECK-NEXT: (call $load_ptr + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $load_val_i64 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i64.load16_s offset=8 align=1 + ;; CHECK-NEXT: (call $load_ptr + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $load_val_i64 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i64.load32_s offset=10 align=2 + ;; CHECK-NEXT: (call $load_ptr + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $A (type $1) + ;; "*.load*" instructions in this function are instrumented because of the + ;; "load" filter included in the command. + (drop (i32.load8_s (i32.const 0))) + (drop (i32.load8_u (i32.const 0))) + (drop (i64.load16_s offset=8 align=1 (i32.const 0))) + (drop (i64.load32_s offset=10 align=2 (i32.const 0))) + ) + + ;; CHECK: (func $B + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $memory_grow_post + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (memory.grow + ;; CHECK-NEXT: (call $memory_grow_pre + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $B (type $1) + ;; "memory.grow" instructions in this function are instrumented because of the + ;; "memory.grow" filter included in the command. + (drop (memory.grow (i32.const 4))) + ) + + ;; CHECK: (func $C + ;; CHECK-NEXT: (i32.store8 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store16 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i64.store16 offset=5 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (f64.store offset=9 align=2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (f64.const 9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $C (type $1) + ;; "*.store*" instructions in this function are not instrumented because the + ;; filter is non-empty and doesn't specify "store" instructions. + (i32.store8 (i32.const 0) (i32.const 1)) + (i32.store16 (i32.const 0) (i32.const 2)) + (i64.store16 offset=5 align=2 (i32.const 0) (i64.const 5)) + (f64.store offset=9 align=2 (i32.const 0) (f64.const 9)) + ) +) diff --git a/test/lit/passes/instrument-memory-gc.wast b/test/lit/passes/instrument-memory-gc.wast index 2e824b2abc5..6cc6ef0112c 100644 --- a/test/lit/passes/instrument-memory-gc.wast +++ b/test/lit/passes/instrument-memory-gc.wast @@ -26,6 +26,10 @@ ;; CHECK: (type $8 (func (param (ref $array)))) + ;; CHECK: (import "env" "memory_grow_pre" (func $memory_grow_pre (type $0) (param i32 i32) (result i32))) + + ;; CHECK: (import "env" "memory_grow_post" (func $memory_grow_post (type $0) (param i32 i32) (result i32))) + ;; CHECK: (import "env" "load_ptr" (func $load_ptr (type $6) (param i32 i32 i32 i32) (result i32))) ;; CHECK: (import "env" "load_val_i32" (func $load_val_i32 (type $0) (param i32 i32) (result i32))) diff --git a/test/lit/passes/instrument-memory.wast b/test/lit/passes/instrument-memory.wast index f776d2af13f..3ed9a31d72d 100644 --- a/test/lit/passes/instrument-memory.wast +++ b/test/lit/passes/instrument-memory.wast @@ -5,17 +5,21 @@ (module (memory 256 256) + ;; CHECK: (type $0 (func (param i32 i32) (result i32))) + ;; CHECK: (type $1 (func)) (type $1 (func)) ;; CHECK: (type $2 (func (param i32 i32 i32 i32) (result i32))) - ;; CHECK: (type $3 (func (param i32 i32) (result i32))) + ;; CHECK: (type $3 (func (param i32 i64) (result i64))) + + ;; CHECK: (type $4 (func (param i32 f32) (result f32))) - ;; CHECK: (type $4 (func (param i32 i64) (result i64))) + ;; CHECK: (type $5 (func (param i32 f64) (result f64))) - ;; CHECK: (type $5 (func (param i32 f32) (result f32))) + ;; CHECK: (import "env" "memory_grow_pre" (func $memory_grow_pre (param i32 i32) (result i32))) - ;; CHECK: (type $6 (func (param i32 f64) (result f64))) + ;; CHECK: (import "env" "memory_grow_post" (func $memory_grow_post (param i32 i32) (result i32))) ;; CHECK: (import "env" "load_ptr" (func $load_ptr (param i32 i32 i32 i32) (result i32))) @@ -41,14 +45,12 @@ ;; CHECK: (func $A ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $load_val_i32 + ;; CHECK-NEXT: (call $memory_grow_post ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.load8_s - ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (memory.grow + ;; CHECK-NEXT: (call $memory_grow_pre ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -56,7 +58,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 2) - ;; CHECK-NEXT: (i32.load8_u + ;; CHECK-NEXT: (i32.load8_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 1) @@ -69,10 +71,10 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: (i32.load16_s + ;; CHECK-NEXT: (i32.load8_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -82,7 +84,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 4) - ;; CHECK-NEXT: (i32.load16_u + ;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 2) @@ -95,10 +97,10 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 5) - ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 5) - ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -106,12 +108,12 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $load_val_i64 + ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 6) - ;; CHECK-NEXT: (i64.load8_s + ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 6) - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -121,7 +123,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 7) - ;; CHECK-NEXT: (i64.load8_u + ;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: (i32.const 1) @@ -134,10 +136,10 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 8) - ;; CHECK-NEXT: (i64.load16_s + ;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 8) - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -147,7 +149,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 9) - ;; CHECK-NEXT: (i64.load16_u + ;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 9) ;; CHECK-NEXT: (i32.const 2) @@ -160,10 +162,10 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 10) - ;; CHECK-NEXT: (i64.load32_s + ;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 10) - ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -173,7 +175,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 11) - ;; CHECK-NEXT: (i64.load32_u + ;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 11) ;; CHECK-NEXT: (i32.const 4) @@ -186,9 +188,22 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 12) - ;; CHECK-NEXT: (i64.load + ;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $load_val_i64 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i64.load + ;; CHECK-NEXT: (call $load_ptr + ;; CHECK-NEXT: (i32.const 13) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) @@ -198,10 +213,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_f32 - ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i32.const 14) ;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i32.const 14) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) @@ -211,10 +226,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_f64 - ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) @@ -224,10 +239,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: (i32.load8_s offset=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) @@ -237,10 +252,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: (i32.const 17) ;; CHECK-NEXT: (i32.load8_u offset=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: (i32.const 17) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 0) @@ -250,10 +265,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 17) + ;; CHECK-NEXT: (i32.const 18) ;; CHECK-NEXT: (i32.load16_s offset=3 align=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 17) + ;; CHECK-NEXT: (i32.const 18) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: (i32.const 0) @@ -263,10 +278,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 18) + ;; CHECK-NEXT: (i32.const 19) ;; CHECK-NEXT: (i32.load16_u offset=4 align=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 18) + ;; CHECK-NEXT: (i32.const 19) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 0) @@ -276,10 +291,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 19) + ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: (i32.load offset=5 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 19) + ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 5) ;; CHECK-NEXT: (i32.const 0) @@ -289,10 +304,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: (i32.const 21) ;; CHECK-NEXT: (i64.load8_s offset=6 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: (i32.const 21) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 6) ;; CHECK-NEXT: (i32.const 0) @@ -302,10 +317,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 21) + ;; CHECK-NEXT: (i32.const 22) ;; CHECK-NEXT: (i64.load8_u offset=7 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 21) + ;; CHECK-NEXT: (i32.const 22) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: (i32.const 0) @@ -315,10 +330,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 22) + ;; CHECK-NEXT: (i32.const 23) ;; CHECK-NEXT: (i64.load16_s offset=8 align=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 22) + ;; CHECK-NEXT: (i32.const 23) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 0) @@ -328,10 +343,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 23) + ;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: (i64.load16_u offset=9 align=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 23) + ;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 9) ;; CHECK-NEXT: (i32.const 0) @@ -341,10 +356,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 24) + ;; CHECK-NEXT: (i32.const 25) ;; CHECK-NEXT: (i64.load32_s offset=10 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 24) + ;; CHECK-NEXT: (i32.const 25) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 10) ;; CHECK-NEXT: (i32.const 0) @@ -354,10 +369,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 25) + ;; CHECK-NEXT: (i32.const 26) ;; CHECK-NEXT: (i64.load32_u offset=11 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 25) + ;; CHECK-NEXT: (i32.const 26) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 11) ;; CHECK-NEXT: (i32.const 0) @@ -367,10 +382,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 26) + ;; CHECK-NEXT: (i32.const 27) ;; CHECK-NEXT: (i64.load offset=12 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 26) + ;; CHECK-NEXT: (i32.const 27) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 12) ;; CHECK-NEXT: (i32.const 0) @@ -380,10 +395,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_f32 - ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: (i32.const 28) ;; CHECK-NEXT: (f32.load offset=13 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: (i32.const 28) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 13) ;; CHECK-NEXT: (i32.const 0) @@ -393,10 +408,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_f64 - ;; CHECK-NEXT: (i32.const 28) + ;; CHECK-NEXT: (i32.const 29) ;; CHECK-NEXT: (f64.load offset=14 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 28) + ;; CHECK-NEXT: (i32.const 29) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 14) ;; CHECK-NEXT: (i32.const 0) @@ -406,6 +421,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $A (type $1) + (drop (memory.grow (i32.const 4))) + (drop (i32.load8_s (i32.const 0))) (drop (i32.load8_u (i32.const 0))) (drop (i32.load16_s (i32.const 0))) @@ -440,217 +457,217 @@ ;; CHECK: (func $B ;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 29) + ;; CHECK-NEXT: (i32.const 30) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 29) + ;; CHECK-NEXT: (i32.const 30) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 30) + ;; CHECK-NEXT: (i32.const 31) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 30) + ;; CHECK-NEXT: (i32.const 31) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 31) + ;; CHECK-NEXT: (i32.const 32) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 31) + ;; CHECK-NEXT: (i32.const 32) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 32) + ;; CHECK-NEXT: (i32.const 33) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 32) + ;; CHECK-NEXT: (i32.const 33) ;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 33) + ;; CHECK-NEXT: (i32.const 34) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 33) + ;; CHECK-NEXT: (i32.const 34) ;; CHECK-NEXT: (i64.const 5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 34) + ;; CHECK-NEXT: (i32.const 35) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 34) + ;; CHECK-NEXT: (i32.const 35) ;; CHECK-NEXT: (i64.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 35) + ;; CHECK-NEXT: (i32.const 36) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 35) + ;; CHECK-NEXT: (i32.const 36) ;; CHECK-NEXT: (i64.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 36) + ;; CHECK-NEXT: (i32.const 37) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_f32 - ;; CHECK-NEXT: (i32.const 36) + ;; CHECK-NEXT: (i32.const 37) ;; CHECK-NEXT: (f32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f64.store ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 37) + ;; CHECK-NEXT: (i32.const 38) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_f64 - ;; CHECK-NEXT: (i32.const 37) + ;; CHECK-NEXT: (i32.const 38) ;; CHECK-NEXT: (f64.const 9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store8 offset=1 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 38) + ;; CHECK-NEXT: (i32.const 39) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 38) + ;; CHECK-NEXT: (i32.const 39) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store16 offset=2 align=1 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 39) + ;; CHECK-NEXT: (i32.const 40) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 39) + ;; CHECK-NEXT: (i32.const 40) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store offset=3 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 40) + ;; CHECK-NEXT: (i32.const 41) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 40) + ;; CHECK-NEXT: (i32.const 41) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store8 offset=4 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 41) + ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 41) + ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store16 offset=5 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i32.const 43) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 5) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i32.const 43) ;; CHECK-NEXT: (i64.const 5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store32 offset=6 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 43) + ;; CHECK-NEXT: (i32.const 44) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 6) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 43) + ;; CHECK-NEXT: (i32.const 44) ;; CHECK-NEXT: (i64.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store offset=7 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 44) + ;; CHECK-NEXT: (i32.const 45) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 44) + ;; CHECK-NEXT: (i32.const 45) ;; CHECK-NEXT: (i64.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f32.store offset=8 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 45) + ;; CHECK-NEXT: (i32.const 46) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_f32 - ;; CHECK-NEXT: (i32.const 45) + ;; CHECK-NEXT: (i32.const 46) ;; CHECK-NEXT: (f32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f64.store offset=9 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 46) + ;; CHECK-NEXT: (i32.const 47) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i32.const 9) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_f64 - ;; CHECK-NEXT: (i32.const 46) + ;; CHECK-NEXT: (i32.const 47) ;; CHECK-NEXT: (f64.const 9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/instrument-memory64.wast b/test/lit/passes/instrument-memory64.wast index 5ceb37fe22c..ec7ed8628f6 100644 --- a/test/lit/passes/instrument-memory64.wast +++ b/test/lit/passes/instrument-memory64.wast @@ -5,17 +5,21 @@ (module (memory i64 256 256) + ;; CHECK: (type $0 (func (param i32 i64) (result i64))) + ;; CHECK: (type $1 (func)) (type $1 (func)) ;; CHECK: (type $2 (func (param i32 i32 i64 i64) (result i64))) ;; CHECK: (type $3 (func (param i32 i32) (result i32))) - ;; CHECK: (type $4 (func (param i32 i64) (result i64))) + ;; CHECK: (type $4 (func (param i32 f32) (result f32))) + + ;; CHECK: (type $5 (func (param i32 f64) (result f64))) - ;; CHECK: (type $5 (func (param i32 f32) (result f32))) + ;; CHECK: (import "env" "memory_grow_pre" (func $memory_grow_pre (param i32 i64) (result i64))) - ;; CHECK: (type $6 (func (param i32 f64) (result f64))) + ;; CHECK: (import "env" "memory_grow_post" (func $memory_grow_post (param i32 i64) (result i64))) ;; CHECK: (import "env" "load_ptr" (func $load_ptr (param i32 i32 i64 i64) (result i64))) @@ -41,14 +45,12 @@ ;; CHECK: (func $A ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $load_val_i32 + ;; CHECK-NEXT: (call $memory_grow_post ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.load8_s - ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (memory.grow + ;; CHECK-NEXT: (call $memory_grow_pre ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i64.const 0) - ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -56,7 +58,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 2) - ;; CHECK-NEXT: (i32.load8_u + ;; CHECK-NEXT: (i32.load8_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i32.const 1) @@ -69,10 +71,10 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: (i32.load16_s + ;; CHECK-NEXT: (i32.load8_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 3) - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) @@ -82,7 +84,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 4) - ;; CHECK-NEXT: (i32.load16_u + ;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i32.const 2) @@ -95,10 +97,10 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 5) - ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 5) - ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) @@ -106,12 +108,12 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $load_val_i64 + ;; CHECK-NEXT: (call $load_val_i32 ;; CHECK-NEXT: (i32.const 6) - ;; CHECK-NEXT: (i64.load8_s + ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 6) - ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) @@ -121,7 +123,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 7) - ;; CHECK-NEXT: (i64.load8_u + ;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: (i32.const 1) @@ -134,10 +136,10 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 8) - ;; CHECK-NEXT: (i64.load16_s + ;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 8) - ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) @@ -147,7 +149,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 9) - ;; CHECK-NEXT: (i64.load16_u + ;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 9) ;; CHECK-NEXT: (i32.const 2) @@ -160,10 +162,10 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 10) - ;; CHECK-NEXT: (i64.load32_s + ;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 10) - ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) @@ -173,7 +175,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 11) - ;; CHECK-NEXT: (i64.load32_u + ;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 11) ;; CHECK-NEXT: (i32.const 4) @@ -186,9 +188,22 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 ;; CHECK-NEXT: (i32.const 12) - ;; CHECK-NEXT: (i64.load + ;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (call $load_ptr ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $load_val_i64 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i64.load + ;; CHECK-NEXT: (call $load_ptr + ;; CHECK-NEXT: (i32.const 13) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) @@ -198,10 +213,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_f32 - ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i32.const 14) ;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i32.const 14) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) @@ -211,10 +226,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_f64 - ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) @@ -224,10 +239,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: (i32.load8_s offset=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (i64.const 0) @@ -237,10 +252,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: (i32.const 17) ;; CHECK-NEXT: (i32.load8_u offset=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: (i32.const 17) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: (i64.const 0) @@ -250,10 +265,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 17) + ;; CHECK-NEXT: (i32.const 18) ;; CHECK-NEXT: (i32.load16_s offset=3 align=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 17) + ;; CHECK-NEXT: (i32.const 18) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 3) ;; CHECK-NEXT: (i64.const 0) @@ -263,10 +278,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 18) + ;; CHECK-NEXT: (i32.const 19) ;; CHECK-NEXT: (i32.load16_u offset=4 align=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 18) + ;; CHECK-NEXT: (i32.const 19) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: (i64.const 0) @@ -276,10 +291,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i32 - ;; CHECK-NEXT: (i32.const 19) + ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: (i32.load offset=5 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 19) + ;; CHECK-NEXT: (i32.const 20) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 5) ;; CHECK-NEXT: (i64.const 0) @@ -289,10 +304,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: (i32.const 21) ;; CHECK-NEXT: (i64.load8_s offset=6 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: (i32.const 21) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 6) ;; CHECK-NEXT: (i64.const 0) @@ -302,10 +317,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 21) + ;; CHECK-NEXT: (i32.const 22) ;; CHECK-NEXT: (i64.load8_u offset=7 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 21) + ;; CHECK-NEXT: (i32.const 22) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 7) ;; CHECK-NEXT: (i64.const 0) @@ -315,10 +330,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 22) + ;; CHECK-NEXT: (i32.const 23) ;; CHECK-NEXT: (i64.load16_s offset=8 align=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 22) + ;; CHECK-NEXT: (i32.const 23) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: (i64.const 0) @@ -328,10 +343,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 23) + ;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: (i64.load16_u offset=9 align=1 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 23) + ;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 9) ;; CHECK-NEXT: (i64.const 0) @@ -341,10 +356,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 24) + ;; CHECK-NEXT: (i32.const 25) ;; CHECK-NEXT: (i64.load32_s offset=10 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 24) + ;; CHECK-NEXT: (i32.const 25) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 10) ;; CHECK-NEXT: (i64.const 0) @@ -354,10 +369,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 25) + ;; CHECK-NEXT: (i32.const 26) ;; CHECK-NEXT: (i64.load32_u offset=11 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 25) + ;; CHECK-NEXT: (i32.const 26) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 11) ;; CHECK-NEXT: (i64.const 0) @@ -367,10 +382,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_i64 - ;; CHECK-NEXT: (i32.const 26) + ;; CHECK-NEXT: (i32.const 27) ;; CHECK-NEXT: (i64.load offset=12 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 26) + ;; CHECK-NEXT: (i32.const 27) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i64.const 12) ;; CHECK-NEXT: (i64.const 0) @@ -380,10 +395,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_f32 - ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: (i32.const 28) ;; CHECK-NEXT: (f32.load offset=13 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: (i32.const 28) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 13) ;; CHECK-NEXT: (i64.const 0) @@ -393,10 +408,10 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $load_val_f64 - ;; CHECK-NEXT: (i32.const 28) + ;; CHECK-NEXT: (i32.const 29) ;; CHECK-NEXT: (f64.load offset=14 align=2 ;; CHECK-NEXT: (call $load_ptr - ;; CHECK-NEXT: (i32.const 28) + ;; CHECK-NEXT: (i32.const 29) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i64.const 14) ;; CHECK-NEXT: (i64.const 0) @@ -406,6 +421,8 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $A (type $1) + (drop (memory.grow (i64.const 4))) + (drop (i32.load8_s (i64.const 0))) (drop (i32.load8_u (i64.const 0))) (drop (i32.load16_s (i64.const 0))) @@ -440,217 +457,217 @@ ;; CHECK: (func $B ;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 29) + ;; CHECK-NEXT: (i32.const 30) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 29) + ;; CHECK-NEXT: (i32.const 30) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 30) + ;; CHECK-NEXT: (i32.const 31) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 30) + ;; CHECK-NEXT: (i32.const 31) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 31) + ;; CHECK-NEXT: (i32.const 32) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 31) + ;; CHECK-NEXT: (i32.const 32) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 32) + ;; CHECK-NEXT: (i32.const 33) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 32) + ;; CHECK-NEXT: (i32.const 33) ;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 33) + ;; CHECK-NEXT: (i32.const 34) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 33) + ;; CHECK-NEXT: (i32.const 34) ;; CHECK-NEXT: (i64.const 5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 34) + ;; CHECK-NEXT: (i32.const 35) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 34) + ;; CHECK-NEXT: (i32.const 35) ;; CHECK-NEXT: (i64.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 35) + ;; CHECK-NEXT: (i32.const 36) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 35) + ;; CHECK-NEXT: (i32.const 36) ;; CHECK-NEXT: (i64.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 36) + ;; CHECK-NEXT: (i32.const 37) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_f32 - ;; CHECK-NEXT: (i32.const 36) + ;; CHECK-NEXT: (i32.const 37) ;; CHECK-NEXT: (f32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f64.store ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 37) + ;; CHECK-NEXT: (i32.const 38) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_f64 - ;; CHECK-NEXT: (i32.const 37) + ;; CHECK-NEXT: (i32.const 38) ;; CHECK-NEXT: (f64.const 9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store8 offset=1 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 38) + ;; CHECK-NEXT: (i32.const 39) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 38) + ;; CHECK-NEXT: (i32.const 39) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store16 offset=2 align=1 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 39) + ;; CHECK-NEXT: (i32.const 40) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 39) + ;; CHECK-NEXT: (i32.const 40) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.store offset=3 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 40) + ;; CHECK-NEXT: (i32.const 41) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i32 - ;; CHECK-NEXT: (i32.const 40) + ;; CHECK-NEXT: (i32.const 41) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store8 offset=4 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 41) + ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 41) + ;; CHECK-NEXT: (i32.const 42) ;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store16 offset=5 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i32.const 43) ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: (i64.const 5) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: (i32.const 43) ;; CHECK-NEXT: (i64.const 5) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store32 offset=6 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 43) + ;; CHECK-NEXT: (i32.const 44) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 6) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 43) + ;; CHECK-NEXT: (i32.const 44) ;; CHECK-NEXT: (i64.const 6) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.store offset=7 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 44) + ;; CHECK-NEXT: (i32.const 45) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i64.const 7) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_i64 - ;; CHECK-NEXT: (i32.const 44) + ;; CHECK-NEXT: (i32.const 45) ;; CHECK-NEXT: (i64.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f32.store offset=8 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 45) + ;; CHECK-NEXT: (i32.const 46) ;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_f32 - ;; CHECK-NEXT: (i32.const 45) + ;; CHECK-NEXT: (i32.const 46) ;; CHECK-NEXT: (f32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (f64.store offset=9 align=2 ;; CHECK-NEXT: (call $store_ptr - ;; CHECK-NEXT: (i32.const 46) + ;; CHECK-NEXT: (i32.const 47) ;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: (i64.const 9) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (call $store_val_f64 - ;; CHECK-NEXT: (i32.const 46) + ;; CHECK-NEXT: (i32.const 47) ;; CHECK-NEXT: (f64.const 9) ;; CHECK-NEXT: ) ;; CHECK-NEXT: )