summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2022-01-12 23:44:10 +0200
committerGitHub <noreply@github.com>2022-01-12 13:44:10 -0800
commit5cf3521708cfada341285414df2dc7366d7e5454 (patch)
tree9bbbe36b8f1d4a66813c937f35682ed77a63893c /src
parent29604f1a7e9ef9dcc2825f076849cd6a452a8a19 (diff)
downloadbinaryen-5cf3521708cfada341285414df2dc7366d7e5454.tar.gz
binaryen-5cf3521708cfada341285414df2dc7366d7e5454.tar.bz2
binaryen-5cf3521708cfada341285414df2dc7366d7e5454.zip
[OptimizeInstructions] Optimize zero sized bulk memory ops even without "ignoreImplicitTraps" (#4295)
Diffstat (limited to 'src')
-rw-r--r--src/passes/OptimizeInstructions.cpp26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 347ebbbe4..6187e2879 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -3406,6 +3406,16 @@ private:
// memory.copy(dst, src, 0) ==> {drop(dst), drop(src)}
return builder.makeBlock({builder.makeDrop(memCopy->dest),
builder.makeDrop(memCopy->source)});
+ } else {
+ // memory.copy(dst, src, 0) ==> {
+ // drop(i32.load8_u(dst)),
+ // drop(i32.load8_u(src))
+ // }
+ return builder.makeBlock(
+ {builder.makeDrop(
+ builder.makeLoad(1, false, 0, 1, memCopy->dest, Type::i32)),
+ builder.makeDrop(builder.makeLoad(
+ 1, false, 0, 1, memCopy->source, Type::i32))});
}
break;
}
@@ -3468,11 +3478,17 @@ private:
auto* csize = memFill->size->cast<Const>();
auto bytes = csize->value.getInteger();
- if (bytes == 0LL &&
- (options.ignoreImplicitTraps || options.trapsNeverHappen)) {
- // memory.fill(d, v, 0) ==> { drop(d), drop(v) }
- return builder.makeBlock(
- {builder.makeDrop(memFill->dest), builder.makeDrop(memFill->value)});
+ if (bytes == 0LL) {
+ if (options.ignoreImplicitTraps || options.trapsNeverHappen) {
+ // memory.fill(d, v, 0) ==> { drop(d), drop(v) }
+ return builder.makeBlock(
+ {builder.makeDrop(memFill->dest), builder.makeDrop(memFill->value)});
+ } else {
+ // memory.fill(d, v, 0) ==> { drop(i32.load8_u(d)), drop(v) }
+ return builder.makeBlock({builder.makeDrop(builder.makeLoad(
+ 1, false, 0, 1, memFill->dest, Type::i32)),
+ builder.makeDrop(memFill->value)});
+ }
}
const uint32_t offset = 0, align = 1;