summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2021-09-15 17:47:58 -0700
committerGitHub <noreply@github.com>2021-09-16 00:47:58 +0000
commite5b5f83aa6b1859a214a0eae0ee92efab8ce329a (patch)
tree041c642c62baf22a8ee6bb309964ef4b766a25ad
parent1ec93d2ed521431ffea3152759a5b693e085d7a1 (diff)
downloadbinaryen-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.cpp10
-rw-r--r--test/lit/passes/optimize-instructions-bulk-memory.wast212
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)
+ )
)
)