diff options
Diffstat (limited to 'src/passes/MemoryPacking.cpp')
-rw-r--r-- | src/passes/MemoryPacking.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp index eac7fb7f0..1018ce1c7 100644 --- a/src/passes/MemoryPacking.cpp +++ b/src/passes/MemoryPacking.cpp @@ -76,9 +76,14 @@ const size_t DATA_DROP_SIZE = 3; namespace { -Expression* makeShiftedMemorySize(Builder& builder) { +Expression* +makeGtShiftedMemorySize(Builder& builder, Module& module, MemoryInit* curr) { return builder.makeBinary( - ShlInt32, builder.makeMemorySize(), builder.makeConst(int32_t(16))); + module.memory.is64() ? GtUInt64 : GtUInt32, + curr->dest, + builder.makeBinary(module.memory.is64() ? ShlInt64 : ShlInt32, + builder.makeMemorySize(), + builder.makeConstPtr(16))); } } // anonymous namespace @@ -317,10 +322,9 @@ void MemoryPacking::optimizeBulkMemoryOps(PassRunner* runner, Module* module) { assert(!mustNop || !mustTrap); if (mustNop) { // Offset and size are 0, so just trap if dest > memory.size - replaceCurrent(builder.makeIf( - builder.makeBinary( - GtUInt32, curr->dest, makeShiftedMemorySize(builder)), - builder.makeUnreachable())); + replaceCurrent( + builder.makeIf(makeGtShiftedMemorySize(builder, *getModule(), curr), + builder.makeUnreachable())); } else if (mustTrap) { // Drop dest, offset, and size then trap replaceCurrent(builder.blockify(builder.makeDrop(curr->dest), @@ -333,8 +337,7 @@ void MemoryPacking::optimizeBulkMemoryOps(PassRunner* runner, Module* module) { replaceCurrent(builder.makeIf( builder.makeBinary( OrInt32, - builder.makeBinary( - GtUInt32, curr->dest, makeShiftedMemorySize(builder)), + makeGtShiftedMemorySize(builder, *getModule(), curr), builder.makeBinary(OrInt32, curr->offset, curr->size)), builder.makeUnreachable())); } @@ -527,8 +530,7 @@ void MemoryPacking::createReplacements(Module* module, Expression* result = builder.makeIf( builder.makeBinary( OrInt32, - builder.makeBinary( - GtUInt32, init->dest, makeShiftedMemorySize(builder)), + makeGtShiftedMemorySize(builder, *module, init), builder.makeGlobalGet(getDropStateGlobal(), Type::i32)), builder.makeUnreachable()); replacements[init] = [result](Function*) { return result; }; |