diff --git a/NOTICE b/NOTICE index 14d821345c..cd28e9fd96 100644 --- a/NOTICE +++ b/NOTICE @@ -62,6 +62,7 @@ under the licensing terms detailed in LICENSE: * Kam Chehresa * Mopsgamer <79159094+Mopsgamer@users.noreply.github.com> * EDM115 +* Geraint Luff Portions of this software are derived from third-party works licensed under the following terms: diff --git a/src/compiler.ts b/src/compiler.ts index 36f09ab8aa..8e4550cf18 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -831,6 +831,11 @@ export class Compiler extends DiagnosticEmitter { } } + if (options.willOptimize) { + // Binaryen will split this up more efficiently + memorySegments = module.combineMemorySegments(memorySegments); + } + // Setup internal memory with default name "0" module.setMemory( initialPages, diff --git a/src/module.ts b/src/module.ts index 2719f60c50..3ff484946d 100644 --- a/src/module.ts +++ b/src/module.ts @@ -2337,6 +2337,22 @@ export class Module { /** Unlimited memory constant. */ static readonly UNLIMITED_MEMORY: Index = -1; + combineMemorySegments( + segments: MemorySegment[] + ) : MemorySegment[] { + if (!segments.length) return segments; + segments = segments.slice(0); + let lastSegment = segments[segments.length - 1]; + let length = u32(lastSegment.offset) + lastSegment.buffer.length; + let newBuffer = new Uint8Array(u32(length)); + let k = segments.length; + for (let i = 0; i < k; ++i) { + let segment = unchecked(segments[i]); + newBuffer.set(segment.buffer, u32(segment.offset)); + } + return [new MemorySegment(newBuffer, i64_new(0))]; + } + setMemory( initial: Index, maximum: Index,