diff options
author | Alon Zakai <azakai@google.com> | 2021-09-15 17:47:58 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-16 00:47:58 +0000 |
commit | e5b5f83aa6b1859a214a0eae0ee92efab8ce329a (patch) | |
tree | 041c642c62baf22a8ee6bb309964ef4b766a25ad | |
parent | 1ec93d2ed521431ffea3152759a5b693e085d7a1 (diff) | |
download | binaryen-e5b5f83aa6b1859a214a0eae0ee92efab8ce329a.tar.gz binaryen-e5b5f83aa6b1859a214a0eae0ee92efab8ce329a.tar.bz2 binaryen-e5b5f83aa6b1859a214a0eae0ee92efab8ce329a.zip |
Fix regression from #4130 (#4158)
That PR reused the same node twice in the output, which fails on the
assertion in BINARYEN_PASS_DEBUG=1 mode.
No new test is needed because the existing test suite fails already
in that mode. That the PR managed to land seems to say that we are
not testing pass-debug mode on our lit tests, which we need to
investigate.
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 10 | ||||
-rw-r--r-- | test/lit/passes/optimize-instructions-bulk-memory.wast | 212 |
2 files changed, 219 insertions, 3 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp index e48eecb72..c9e4d7ff5 100644 --- a/src/passes/OptimizeInstructions.cpp +++ b/src/passes/OptimizeInstructions.cpp @@ -2934,6 +2934,10 @@ private: } Expression* optimizeMemoryFill(MemoryFill* memFill) { + if (memFill->type == Type::unreachable) { + return nullptr; + } + if (!memFill->size->is<Const>()) { return nullptr; } @@ -3015,19 +3019,21 @@ private: Type::v128); } else { // { i64.store(d, C', 0), i64.store(d, C', 8) } + auto destType = memFill->dest->type; + Index tempLocal = builder.addVar(getFunction(), destType); return builder.makeBlock({ builder.makeStore( 8, offset, align, - memFill->dest, + builder.makeLocalTee(tempLocal, memFill->dest, destType), builder.makeConst<uint64_t>(value * 0x0101010101010101ULL), Type::i64), builder.makeStore( 8, offset + 8, align, - memFill->dest, + builder.makeLocalGet(tempLocal, destType), builder.makeConst<uint64_t>(value * 0x0101010101010101ULL), Type::i64), }); diff --git a/test/lit/passes/optimize-instructions-bulk-memory.wast b/test/lit/passes/optimize-instructions-bulk-memory.wast index 5c9efc893..4f30e3e9a 100644 --- a/test/lit/passes/optimize-instructions-bulk-memory.wast +++ b/test/lit/passes/optimize-instructions-bulk-memory.wast @@ -1,5 +1,6 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. -;; RUN: wasm-opt %s --all-features --optimize-instructions --enable-bulk-memory -S -o - | filecheck %s +;; RUN: wasm-opt %s --optimize-instructions --enable-bulk-memory --enable-simd -S -o - | filecheck %s +;; RUN: wasm-opt %s --optimize-instructions --enable-bulk-memory -S -o - | filecheck %s --check-prefix NOSIMD (module (memory 0) @@ -77,6 +78,79 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; NOSIMD: (func $optimize-bulk-memory-copy (param $dst i32) (param $src i32) (param $sz i32) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $sz) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store8 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.load8_u + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store16 align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.load16_u align=1 + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: (i32.const 3) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.load align=1 + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: (i32.const 5) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: (i32.const 6) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: (i32.const 7) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.store align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i64.load align=1 + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: (i32.const 16) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $src) + ;; NOSIMD-NEXT: (local.get $sz) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.copy + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: (i32.load + ;; NOSIMD-NEXT: (i32.const 3) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) (func $optimize-bulk-memory-copy (param $dst i32) (param $src i32) (param $sz i32) (memory.copy ;; skip (local.get $dst) @@ -251,7 +325,137 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 17) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (memory.fill + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; NOSIMD: (func $optimize-bulk-memory-fill (param $dst i32) (param $val i32) (param $sz i32) + ;; NOSIMD-NEXT: (local $3 i32) + ;; NOSIMD-NEXT: (local $4 i32) + ;; NOSIMD-NEXT: (local $5 i32) + ;; NOSIMD-NEXT: (memory.fill + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store8 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store8 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $val) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store8 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 1) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store8 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 255) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store16 align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store16 align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 257) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store16 align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 65535) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.store align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i64.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (block + ;; NOSIMD-NEXT: (i64.store align=1 + ;; NOSIMD-NEXT: (local.tee $3 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.store offset=8 align=1 + ;; NOSIMD-NEXT: (local.get $3) + ;; NOSIMD-NEXT: (i64.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i32.store align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 16843009) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.store align=1 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i64.const 72340172838076673) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (block + ;; NOSIMD-NEXT: (i64.store align=1 + ;; NOSIMD-NEXT: (local.tee $4 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.const 72340172838076673) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.store offset=8 align=1 + ;; NOSIMD-NEXT: (local.get $4) + ;; NOSIMD-NEXT: (i64.const 72340172838076673) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (block + ;; NOSIMD-NEXT: (i64.store align=1 + ;; NOSIMD-NEXT: (local.tee $5 + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.const -1) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (i64.store offset=8 align=1 + ;; NOSIMD-NEXT: (local.get $5) + ;; NOSIMD-NEXT: (i64.const -1) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.fill + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $val) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.fill + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: (local.get $sz) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.fill + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (local.get $val) + ;; NOSIMD-NEXT: (local.get $sz) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.fill + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: (i32.const 3) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.fill + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 1) + ;; NOSIMD-NEXT: (i32.const 3) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.fill + ;; NOSIMD-NEXT: (local.get $dst) + ;; NOSIMD-NEXT: (i32.const 0) + ;; NOSIMD-NEXT: (i32.const 17) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: (memory.fill + ;; NOSIMD-NEXT: (unreachable) + ;; NOSIMD-NEXT: (i32.const 1) + ;; NOSIMD-NEXT: (i32.const 16) + ;; NOSIMD-NEXT: ) + ;; NOSIMD-NEXT: ) (func $optimize-bulk-memory-fill (param $dst i32) (param $val i32) (param $sz i32) (memory.fill (local.get $dst) @@ -378,5 +582,11 @@ (i32.const 0) (i32.const 17) ) + + (memory.fill ;; skip + (unreachable) + (i32.const 1) + (i32.const 16) + ) ) ) |