diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/OptimizeInstructions.cpp | 10 |
1 files changed, 8 insertions, 2 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), }); |