diff --git a/cli/asc.js b/cli/asc.js index 77bd445bbd..38e8eb56fb 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -729,6 +729,13 @@ exports.main = function main(argv, options, callback) { } else { add("precompute"); } + if (module.getLowMemoryUnused()) { + if (optimizeLevel >= 3 || shrinkLevel >= 1) { + add("optimize-added-constants-propagate"); + } else { + add("optimize-added-constants"); + } + } // this will be done later (1) // if (optimizeLevel >= 2 || shrinkLevel >= 2) { // add("code-pushing"); diff --git a/src/compiler.ts b/src/compiler.ts index ea4ecb7cd3..dfbfea6c12 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -363,7 +363,7 @@ export class Compiler extends DiagnosticEmitter { this.memoryOffset = i64_new(options.memoryBase); module.setLowMemoryUnused(false); } else { - if (options.optimizeLevelHint >= 2 && !options.lowMemoryLimit) { + if (!options.lowMemoryLimit && options.optimizeLevelHint >= 2) { this.memoryOffset = i64_new(1024); module.setLowMemoryUnused(true); } else { diff --git a/tests/compiler/memcpy.optimized.wat b/tests/compiler/memcpy.optimized.wat index 6adfee8449..46917a7787 100644 --- a/tests/compiler/memcpy.optimized.wat +++ b/tests/compiler/memcpy.optimized.wat @@ -60,29 +60,17 @@ i32.load i32.store local.get $0 - i32.const 4 - i32.add local.get $1 - i32.const 4 - i32.add - i32.load - i32.store + i32.load offset=4 + i32.store offset=4 local.get $0 - i32.const 8 - i32.add local.get $1 - i32.const 8 - i32.add - i32.load - i32.store + i32.load offset=8 + i32.store offset=8 local.get $0 - i32.const 12 - i32.add local.get $1 - i32.const 12 - i32.add - i32.load - i32.store + i32.load offset=12 + i32.store offset=12 local.get $1 i32.const 16 i32.add @@ -107,13 +95,9 @@ i32.load i32.store local.get $0 - i32.const 4 - i32.add local.get $1 - i32.const 4 - i32.add - i32.load - i32.store + i32.load offset=4 + i32.store offset=4 local.get $1 i32.const 8 i32.add @@ -204,23 +188,25 @@ i32.const 1 i32.add local.tee $0 - local.get $1 i32.const 1 i32.add - local.tee $1 - i32.load8_u - i32.store8 - local.get $0 + local.set $3 + local.get $1 i32.const 1 i32.add - local.tee $3 + local.tee $1 i32.const 1 i32.add - local.set $0 + local.set $4 + local.get $0 local.get $1 + i32.load8_u + i32.store8 + local.get $3 i32.const 1 i32.add - local.tee $4 + local.set $0 + local.get $4 i32.const 1 i32.add local.set $1 @@ -239,9 +225,7 @@ if local.get $0 local.get $1 - i32.const 1 - i32.add - i32.load + i32.load offset=1 local.tee $3 i32.const 8 i32.shl @@ -251,42 +235,30 @@ i32.or i32.store local.get $0 - i32.const 4 - i32.add local.get $3 i32.const 24 i32.shr_u local.get $1 - i32.const 5 - i32.add - i32.load + i32.load offset=5 local.tee $3 i32.const 8 i32.shl i32.or - i32.store + i32.store offset=4 local.get $0 - i32.const 8 - i32.add local.get $3 i32.const 24 i32.shr_u local.get $1 - i32.const 9 - i32.add - i32.load + i32.load offset=9 local.tee $3 i32.const 8 i32.shl i32.or - i32.store + i32.store offset=8 local.get $0 - i32.const 12 - i32.add local.get $1 - i32.const 13 - i32.add - i32.load + i32.load offset=13 local.tee $6 i32.const 8 i32.shl @@ -294,7 +266,7 @@ i32.const 24 i32.shr_u i32.or - i32.store + i32.store offset=12 local.get $1 i32.const 16 i32.add @@ -348,9 +320,7 @@ if local.get $0 local.get $1 - i32.const 2 - i32.add - i32.load + i32.load offset=2 local.tee $3 i32.const 16 i32.shl @@ -360,42 +330,30 @@ i32.or i32.store local.get $0 - i32.const 4 - i32.add local.get $3 i32.const 16 i32.shr_u local.get $1 - i32.const 6 - i32.add - i32.load + i32.load offset=6 local.tee $3 i32.const 16 i32.shl i32.or - i32.store + i32.store offset=4 local.get $0 - i32.const 8 - i32.add local.get $3 i32.const 16 i32.shr_u local.get $1 - i32.const 10 - i32.add - i32.load + i32.load offset=10 local.tee $3 i32.const 16 i32.shl i32.or - i32.store + i32.store offset=8 local.get $0 - i32.const 12 - i32.add local.get $1 - i32.const 14 - i32.add - i32.load + i32.load offset=14 local.tee $6 i32.const 16 i32.shl @@ -403,7 +361,7 @@ i32.const 16 i32.shr_u i32.or - i32.store + i32.store offset=12 local.get $1 i32.const 16 i32.add @@ -449,9 +407,7 @@ if local.get $0 local.get $1 - i32.const 3 - i32.add - i32.load + i32.load offset=3 local.tee $3 i32.const 24 i32.shl @@ -461,42 +417,30 @@ i32.or i32.store local.get $0 - i32.const 4 - i32.add local.get $3 i32.const 8 i32.shr_u local.get $1 - i32.const 7 - i32.add - i32.load + i32.load offset=7 local.tee $3 i32.const 24 i32.shl i32.or - i32.store + i32.store offset=4 local.get $0 - i32.const 8 - i32.add local.get $3 i32.const 8 i32.shr_u local.get $1 - i32.const 11 - i32.add - i32.load + i32.load offset=11 local.tee $3 i32.const 24 i32.shl i32.or - i32.store + i32.store offset=8 local.get $0 - i32.const 12 - i32.add local.get $1 - i32.const 15 - i32.add - i32.load + i32.load offset=15 local.tee $6 i32.const 24 i32.shl @@ -504,7 +448,7 @@ i32.const 8 i32.shr_u i32.or - i32.store + i32.store offset=12 local.get $1 i32.const 16 i32.add @@ -533,141 +477,155 @@ local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 @@ -700,61 +658,67 @@ local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 @@ -787,21 +751,23 @@ local.get $0 i32.const 1 i32.add - local.tee $0 + local.tee $3 + i32.const 1 + i32.add + local.set $0 local.get $1 i32.const 1 i32.add - local.tee $1 + local.tee $4 + i32.const 1 + i32.add + local.set $1 + local.get $3 + local.get $4 i32.load8_u i32.store8 local.get $0 - i32.const 1 - i32.add - local.tee $0 local.get $1 - i32.const 1 - i32.add - local.tee $1 i32.load8_u i32.store8 local.get $0 diff --git a/tests/compiler/memset.optimized.wat b/tests/compiler/memset.optimized.wat index 86e2dd3c29..a218fd9f7b 100644 --- a/tests/compiler/memset.optimized.wat +++ b/tests/compiler/memset.optimized.wat @@ -227,9 +227,7 @@ unreachable end global.get $memset/dest - i32.const 15 - i32.add - i32.load8_u + i32.load8_u offset=15 i32.const 1 i32.ne if @@ -259,9 +257,7 @@ unreachable end global.get $memset/dest - i32.const 1 - i32.add - i32.load8_u + i32.load8_u offset=1 i32.const 2 i32.ne if @@ -273,9 +269,7 @@ unreachable end global.get $memset/dest - i32.const 14 - i32.add - i32.load8_u + i32.load8_u offset=14 i32.const 2 i32.ne if @@ -287,9 +281,7 @@ unreachable end global.get $memset/dest - i32.const 15 - i32.add - i32.load8_u + i32.load8_u offset=15 i32.const 1 i32.ne if