diff options
-rw-r--r-- | src/passes/MemoryPacking.cpp | 10 | ||||
-rw-r--r-- | src/wasm-binary.h | 2 | ||||
-rw-r--r-- | test/passes/memory-packing_all-features.txt | 576 | ||||
-rw-r--r-- | test/passes/memory-packing_all-features.wast | 14 |
4 files changed, 600 insertions, 2 deletions
diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp index d8e59cae6..640207fc7 100644 --- a/src/passes/MemoryPacking.cpp +++ b/src/passes/MemoryPacking.cpp @@ -87,6 +87,11 @@ Expression* makeShiftedMemorySize(Builder& builder) { struct MemoryPacking : public Pass { size_t dropStateGlobalCount = 0; + // FIXME: Chrome has a bug decoding section indices that prevents it from + // using more than 63. Just use WebLimitations::MaxDataSegments once this is + // fixed. See https://bugs.chromium.org/p/v8/issues/detail?id=10151. + uint32_t maxSegments; + void run(PassRunner* runner, Module* module) override; void optimizeBulkMemoryOps(PassRunner* runner, Module* module); void getSegmentReferrers(Module* module, std::vector<Referrers>& referrers); @@ -116,6 +121,9 @@ void MemoryPacking::run(PassRunner* runner, Module* module) { return; } + maxSegments = module->features.hasBulkMemory() + ? 63 + : uint32_t(WebLimitations::MaxDataSegments); auto& segments = module->memory.segments; // For each segment, a list of bulk memory instructions that refer to it @@ -436,7 +444,7 @@ void MemoryPacking::createSplitSegments(Builder& builder, offset = segment.offset; } } - if (WebLimitations::MaxDataSegments <= packed.size() + segmentsRemaining) { + if (maxSegments <= packed.size() + segmentsRemaining) { // Give up splitting and merge all remaining ranges except end zeroes auto lastNonzero = ranges.end() - 1; if (lastNonzero->isZero) { diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 5cfafb509..0dd8be61a 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -47,7 +47,7 @@ enum { // wasm VMs on the web have decided to impose some limits on what they // accept -enum WebLimitations { +enum WebLimitations : uint32_t { MaxDataSegments = 100 * 1000, MaxFunctionBodySize = 128 * 1024, MaxFunctionLocals = 50 * 1000 diff --git a/test/passes/memory-packing_all-features.txt b/test/passes/memory-packing_all-features.txt index e74fb3c9b..1c46995b6 100644 --- a/test/passes/memory-packing_all-features.txt +++ b/test/passes/memory-packing_all-features.txt @@ -929,3 +929,579 @@ ) ) ) +(module + (type $none_=>_none (func)) + (import "env" "memory" (memory $0 2048 2048)) + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a") + (data passive "a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a") + (func $init-lots (; 0 ;) + (block + (memory.init 0 + (i32.const 0) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1) + (i32.const 0) + (i32.const 30) + ) + (memory.init 1 + (i32.const 31) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 32) + (i32.const 0) + (i32.const 30) + ) + (memory.init 2 + (i32.const 62) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 63) + (i32.const 0) + (i32.const 30) + ) + (memory.init 3 + (i32.const 93) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 94) + (i32.const 0) + (i32.const 30) + ) + (memory.init 4 + (i32.const 124) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 125) + (i32.const 0) + (i32.const 30) + ) + (memory.init 5 + (i32.const 155) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 156) + (i32.const 0) + (i32.const 30) + ) + (memory.init 6 + (i32.const 186) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 187) + (i32.const 0) + (i32.const 30) + ) + (memory.init 7 + (i32.const 217) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 218) + (i32.const 0) + (i32.const 30) + ) + (memory.init 8 + (i32.const 248) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 249) + (i32.const 0) + (i32.const 30) + ) + (memory.init 9 + (i32.const 279) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 280) + (i32.const 0) + (i32.const 30) + ) + (memory.init 10 + (i32.const 310) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 311) + (i32.const 0) + (i32.const 30) + ) + (memory.init 11 + (i32.const 341) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 342) + (i32.const 0) + (i32.const 30) + ) + (memory.init 12 + (i32.const 372) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 373) + (i32.const 0) + (i32.const 30) + ) + (memory.init 13 + (i32.const 403) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 404) + (i32.const 0) + (i32.const 30) + ) + (memory.init 14 + (i32.const 434) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 435) + (i32.const 0) + (i32.const 30) + ) + (memory.init 15 + (i32.const 465) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 466) + (i32.const 0) + (i32.const 30) + ) + (memory.init 16 + (i32.const 496) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 497) + (i32.const 0) + (i32.const 30) + ) + (memory.init 17 + (i32.const 527) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 528) + (i32.const 0) + (i32.const 30) + ) + (memory.init 18 + (i32.const 558) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 559) + (i32.const 0) + (i32.const 30) + ) + (memory.init 19 + (i32.const 589) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 590) + (i32.const 0) + (i32.const 30) + ) + (memory.init 20 + (i32.const 620) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 621) + (i32.const 0) + (i32.const 30) + ) + (memory.init 21 + (i32.const 651) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 652) + (i32.const 0) + (i32.const 30) + ) + (memory.init 22 + (i32.const 682) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 683) + (i32.const 0) + (i32.const 30) + ) + (memory.init 23 + (i32.const 713) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 714) + (i32.const 0) + (i32.const 30) + ) + (memory.init 24 + (i32.const 744) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 745) + (i32.const 0) + (i32.const 30) + ) + (memory.init 25 + (i32.const 775) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 776) + (i32.const 0) + (i32.const 30) + ) + (memory.init 26 + (i32.const 806) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 807) + (i32.const 0) + (i32.const 30) + ) + (memory.init 27 + (i32.const 837) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 838) + (i32.const 0) + (i32.const 30) + ) + (memory.init 28 + (i32.const 868) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 869) + (i32.const 0) + (i32.const 30) + ) + (memory.init 29 + (i32.const 899) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 900) + (i32.const 0) + (i32.const 30) + ) + (memory.init 30 + (i32.const 930) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 931) + (i32.const 0) + (i32.const 30) + ) + (memory.init 31 + (i32.const 961) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 962) + (i32.const 0) + (i32.const 30) + ) + (memory.init 32 + (i32.const 992) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 993) + (i32.const 0) + (i32.const 30) + ) + (memory.init 33 + (i32.const 1023) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1024) + (i32.const 0) + (i32.const 30) + ) + (memory.init 34 + (i32.const 1054) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1055) + (i32.const 0) + (i32.const 30) + ) + (memory.init 35 + (i32.const 1085) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1086) + (i32.const 0) + (i32.const 30) + ) + (memory.init 36 + (i32.const 1116) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1117) + (i32.const 0) + (i32.const 30) + ) + (memory.init 37 + (i32.const 1147) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1148) + (i32.const 0) + (i32.const 30) + ) + (memory.init 38 + (i32.const 1178) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1179) + (i32.const 0) + (i32.const 30) + ) + (memory.init 39 + (i32.const 1209) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1210) + (i32.const 0) + (i32.const 30) + ) + (memory.init 40 + (i32.const 1240) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1241) + (i32.const 0) + (i32.const 30) + ) + (memory.init 41 + (i32.const 1271) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1272) + (i32.const 0) + (i32.const 30) + ) + (memory.init 42 + (i32.const 1302) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1303) + (i32.const 0) + (i32.const 30) + ) + (memory.init 43 + (i32.const 1333) + (i32.const 0) + (i32.const 1) + ) + (memory.fill + (i32.const 1334) + (i32.const 0) + (i32.const 11) + ) + ) + (block + (data.drop 0) + (data.drop 1) + (data.drop 2) + (data.drop 3) + (data.drop 4) + (data.drop 5) + (data.drop 6) + (data.drop 7) + (data.drop 8) + (data.drop 9) + (data.drop 10) + (data.drop 11) + (data.drop 12) + (data.drop 13) + (data.drop 14) + (data.drop 15) + (data.drop 16) + (data.drop 17) + (data.drop 18) + (data.drop 19) + (data.drop 20) + (data.drop 21) + (data.drop 22) + (data.drop 23) + (data.drop 24) + (data.drop 25) + (data.drop 26) + (data.drop 27) + (data.drop 28) + (data.drop 29) + (data.drop 30) + (data.drop 31) + (data.drop 32) + (data.drop 33) + (data.drop 34) + (data.drop 35) + (data.drop 36) + (data.drop 37) + (data.drop 38) + (data.drop 39) + (data.drop 40) + (data.drop 41) + (data.drop 42) + (data.drop 43) + (data.drop 44) + (data.drop 45) + (data.drop 46) + (data.drop 47) + (data.drop 48) + (data.drop 49) + (data.drop 50) + (data.drop 51) + (data.drop 52) + (data.drop 53) + (data.drop 54) + (data.drop 55) + (data.drop 56) + (data.drop 57) + (data.drop 58) + (data.drop 59) + (data.drop 60) + (data.drop 61) + (data.drop 62) + ) + ) +) diff --git a/test/passes/memory-packing_all-features.wast b/test/passes/memory-packing_all-features.wast index ea1ea19f7..309ee79ad 100644 --- a/test/passes/memory-packing_all-features.wast +++ b/test/passes/memory-packing_all-features.wast @@ -481,3 +481,17 @@ (data.drop 3) ) ) + +(module + (import "env" "memory" (memory $0 2048 2048)) + (data passive "a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00a") ;; 64 ranges of zeroes + + (func $init-lots + (memory.init 0 + (i32.const 0) + (i32.const 0) + (i32.const 1345) + ) + (data.drop 0) + ) +)
\ No newline at end of file |