diff options
author | Alon Zakai <azakai@google.com> | 2019-05-02 13:09:18 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-02 13:09:18 -0700 |
commit | b394fcc887dbb2e02b5ff5b307004e4dc7ec2baf (patch) | |
tree | 0610ee3fea56d492adef79345bae271e8be3b334 | |
parent | 01a4bfdb5c28d54fd480d603cba2d35c943a0bf5 (diff) | |
download | binaryen-b394fcc887dbb2e02b5ff5b307004e4dc7ec2baf.tar.gz binaryen-b394fcc887dbb2e02b5ff5b307004e4dc7ec2baf.tar.bz2 binaryen-b394fcc887dbb2e02b5ff5b307004e4dc7ec2baf.zip |
Optimize mutable globals (#2066)
If a global is marked mutable but not assigned to, make it immutable.
If an immutable global is a copy of another, use the original, so we can remove the duplicates.
Fixes #2011
-rwxr-xr-x | build-js.sh | 1 | ||||
-rw-r--r-- | src/passes/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/passes/SimplifyGlobals.cpp | 143 | ||||
-rw-r--r-- | src/passes/pass.cpp | 4 | ||||
-rw-r--r-- | src/passes/passes.h | 1 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 4 | ||||
-rw-r--r-- | test/dynamicLibrary.fromasm | 7 | ||||
-rw-r--r-- | test/dynamicLibrary.fromasm.clamp | 7 | ||||
-rw-r--r-- | test/dynamicLibrary.fromasm.imprecise | 7 | ||||
-rw-r--r-- | test/emcc_hello_world.fromasm | 25 | ||||
-rw-r--r-- | test/emcc_hello_world.fromasm.clamp | 25 | ||||
-rw-r--r-- | test/emcc_hello_world.fromasm.imprecise | 21 | ||||
-rw-r--r-- | test/min.fromasm | 2 | ||||
-rw-r--r-- | test/min.fromasm.clamp | 2 | ||||
-rw-r--r-- | test/min.fromasm.imprecise | 2 | ||||
-rw-r--r-- | test/passes/func-metrics.txt | 2 | ||||
-rw-r--r-- | test/passes/simplify-globals_enable-mutable-globals.txt | 53 | ||||
-rw-r--r-- | test/passes/simplify-globals_enable-mutable-globals.wast | 37 | ||||
-rw-r--r-- | test/unit.fromasm | 7 | ||||
-rw-r--r-- | test/unit.fromasm.clamp | 7 | ||||
-rw-r--r-- | test/unit.fromasm.imprecise | 7 |
21 files changed, 296 insertions, 69 deletions
diff --git a/build-js.sh b/build-js.sh index b6c86a36b..1606e037e 100755 --- a/build-js.sh +++ b/build-js.sh @@ -140,6 +140,7 @@ echo "building shared bitcode" $BINARYEN_SRC/passes/ReorderLocals.cpp \ $BINARYEN_SRC/passes/ReReloop.cpp \ $BINARYEN_SRC/passes/SafeHeap.cpp \ + $BINARYEN_SRC/passes/SimplifyGlobals.cpp \ $BINARYEN_SRC/passes/SimplifyLocals.cpp \ $BINARYEN_SRC/passes/Souperify.cpp \ $BINARYEN_SRC/passes/SpillPointers.cpp \ diff --git a/src/passes/CMakeLists.txt b/src/passes/CMakeLists.txt index 935c3bec8..9d98930ed 100644 --- a/src/passes/CMakeLists.txt +++ b/src/passes/CMakeLists.txt @@ -58,6 +58,7 @@ SET(passes_SOURCES ReorderFunctions.cpp TrapMode.cpp SafeHeap.cpp + SimplifyGlobals.cpp SimplifyLocals.cpp Souperify.cpp SpillPointers.cpp diff --git a/src/passes/SimplifyGlobals.cpp b/src/passes/SimplifyGlobals.cpp new file mode 100644 index 000000000..12c59fefc --- /dev/null +++ b/src/passes/SimplifyGlobals.cpp @@ -0,0 +1,143 @@ +/* + * Copyright 2019 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// +// Simplify and optimize globals and their use. +// +// * Turns never-written and unwritable (not imported or exported) +// globals immutable. +// * If an immutable global is a copy of another, use the earlier one, +// to allow removal of the copies later. +// + +#include <atomic> + +#include "pass.h" +#include "wasm.h" + +namespace wasm { + +namespace { + +struct GlobalInfo { + bool imported = false; + bool exported = false; + std::atomic<bool> written; +}; + +using GlobalInfoMap = std::map<Name, GlobalInfo>; + +struct GlobalUseScanner : public WalkerPass<PostWalker<GlobalUseScanner>> { + bool isFunctionParallel() override { return true; } + + GlobalUseScanner(GlobalInfoMap* infos) : infos(infos) {} + + GlobalUseScanner* create() override { return new GlobalUseScanner(infos); } + + void visitSetGlobal(SetGlobal* curr) { (*infos)[curr->name].written = true; } + +private: + GlobalInfoMap* infos; +}; + +using NameNameMap = std::map<Name, Name>; + +struct GlobalUseModifier : public WalkerPass<PostWalker<GlobalUseModifier>> { + bool isFunctionParallel() override { return true; } + + GlobalUseModifier(NameNameMap* copiedParentMap) + : copiedParentMap(copiedParentMap) {} + + GlobalUseModifier* create() override { + return new GlobalUseModifier(copiedParentMap); + } + + void visitGetGlobal(GetGlobal* curr) { + auto iter = copiedParentMap->find(curr->name); + if (iter != copiedParentMap->end()) { + curr->name = iter->second; + } + } + +private: + NameNameMap* copiedParentMap; +}; + +} // anonymous namespace + +struct SimplifyGlobals : public Pass { + void run(PassRunner* runner, Module* module) override { + // First, find out all the relevant info. + GlobalInfoMap map; + for (auto& global : module->globals) { + auto& info = map[global->name]; + if (global->imported()) { + info.imported = true; + } + } + for (auto& ex : module->exports) { + if (ex->kind == ExternalKind::Global) { + map[ex->value].exported = true; + } + } + { + PassRunner subRunner(module, runner->options); + subRunner.add<GlobalUseScanner>(&map); + subRunner.run(); + } + // We now know which are immutable in practice. + for (auto& global : module->globals) { + auto& info = map[global->name]; + if (global->mutable_ && !info.imported && !info.exported && + !info.written) { + global->mutable_ = false; + } + } + // Optimize uses of immutable globals, prefer the earlier import when + // there is a copy. + NameNameMap copiedParentMap; + for (auto& global : module->globals) { + auto child = global->name; + if (!global->mutable_ && !global->imported()) { + if (auto* get = global->init->dynCast<GetGlobal>()) { + auto parent = get->name; + if (!module->getGlobal(get->name)->mutable_) { + copiedParentMap[child] = parent; + } + } + } + } + if (!copiedParentMap.empty()) { + // Go all the way back. + for (auto& global : module->globals) { + auto child = global->name; + if (copiedParentMap.count(child)) { + while (copiedParentMap.count(copiedParentMap[child])) { + copiedParentMap[child] = copiedParentMap[copiedParentMap[child]]; + } + } + } + // Apply to the gets. + PassRunner subRunner(module, runner->options); + subRunner.add<GlobalUseModifier>(&copiedParentMap); + subRunner.run(); + } + } +}; + +Pass* createSimplifyGlobalsPass() { return new SimplifyGlobals(); } + +} // namespace wasm diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index e4fbc5343..eb49072ba 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -244,6 +244,9 @@ void PassRegistry::registerPasses() { registerPass("safe-heap", "instrument loads and stores to check for invalid behavior", createSafeHeapPass); + registerPass("simplify-globals", + "miscellaneous globals-related optimizations", + createSimplifyGlobalsPass); registerPass("simplify-locals", "miscellaneous locals-related optimizations", createSimplifyLocalsPass); @@ -392,6 +395,7 @@ void PassRunner::addDefaultGlobalOptimizationPostPasses() { } // optimizations show more functions as duplicate add("duplicate-function-elimination"); + add("simplify-globals"); add("remove-unused-module-elements"); add("memory-packing"); // may allow more inlining/dae/etc., need --converge for that diff --git a/src/passes/passes.h b/src/passes/passes.h index e562f4a42..cb2950bd4 100644 --- a/src/passes/passes.h +++ b/src/passes/passes.h @@ -86,6 +86,7 @@ Pass* createReReloopPass(); Pass* createRedundantSetEliminationPass(); Pass* createSafeHeapPass(); Pass* createSimplifyLocalsPass(); +Pass* createSimplifyGlobalsPass(); Pass* createSimplifyLocalsNoNestingPass(); Pass* createSimplifyLocalsNoTeePass(); Pass* createSimplifyLocalsNoStructurePass(); diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index cd9eb690a..a869aa08a 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -1813,10 +1813,6 @@ void SExpressionWasmBuilder::parseExport(Element& s) { ex->kind = ExternalKind::Table; } else if (inner[0]->str() == GLOBAL) { ex->kind = ExternalKind::Global; - if (wasm.getGlobalOrNull(ex->value) && - wasm.getGlobal(ex->value)->mutable_) { - throw ParseException("cannot export a mutable global", s.line, s.col); - } } else { throw ParseException("invalid export"); } diff --git a/test/dynamicLibrary.fromasm b/test/dynamicLibrary.fromasm index 8bc46560c..b5238fcab 100644 --- a/test/dynamicLibrary.fromasm +++ b/test/dynamicLibrary.fromasm @@ -7,7 +7,6 @@ (import "env" "memoryBase" (global $memoryBase$asm2wasm$import i32)) (import "env" "abortStackOverflow" (func $abortStackOverflow (param i32))) (import "env" "_puts" (func $_puts (param i32) (result i32))) - (global $memoryBase (mut i32) (global.get $memoryBase$asm2wasm$import)) (global $STACKTOP (mut i32) (i32.const 0)) (global $STACK_MAX (mut i32) (i32.const 0)) (global $_global i32 (i32.const 5242912)) @@ -36,7 +35,7 @@ ) (drop (call $_puts - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) ) ) (global.set $STACKTOP @@ -49,7 +48,7 @@ (func $__post_instantiate (; 4 ;) (; has Stack IR ;) (global.set $STACKTOP (i32.add - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) (i32.const 32) ) ) @@ -61,7 +60,7 @@ ) (call $__ZN3FooC2Ev (i32.add - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) (i32.const 5242912) ) ) diff --git a/test/dynamicLibrary.fromasm.clamp b/test/dynamicLibrary.fromasm.clamp index 8bc46560c..b5238fcab 100644 --- a/test/dynamicLibrary.fromasm.clamp +++ b/test/dynamicLibrary.fromasm.clamp @@ -7,7 +7,6 @@ (import "env" "memoryBase" (global $memoryBase$asm2wasm$import i32)) (import "env" "abortStackOverflow" (func $abortStackOverflow (param i32))) (import "env" "_puts" (func $_puts (param i32) (result i32))) - (global $memoryBase (mut i32) (global.get $memoryBase$asm2wasm$import)) (global $STACKTOP (mut i32) (i32.const 0)) (global $STACK_MAX (mut i32) (i32.const 0)) (global $_global i32 (i32.const 5242912)) @@ -36,7 +35,7 @@ ) (drop (call $_puts - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) ) ) (global.set $STACKTOP @@ -49,7 +48,7 @@ (func $__post_instantiate (; 4 ;) (; has Stack IR ;) (global.set $STACKTOP (i32.add - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) (i32.const 32) ) ) @@ -61,7 +60,7 @@ ) (call $__ZN3FooC2Ev (i32.add - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) (i32.const 5242912) ) ) diff --git a/test/dynamicLibrary.fromasm.imprecise b/test/dynamicLibrary.fromasm.imprecise index 9c5b5c7c3..146ff741b 100644 --- a/test/dynamicLibrary.fromasm.imprecise +++ b/test/dynamicLibrary.fromasm.imprecise @@ -4,7 +4,6 @@ (import "env" "memoryBase" (global $memoryBase$asm2wasm$import i32)) (import "env" "abortStackOverflow" (func $abortStackOverflow (param i32))) (import "env" "_puts" (func $_puts (param i32) (result i32))) - (global $memoryBase (mut i32) (global.get $memoryBase$asm2wasm$import)) (global $STACKTOP (mut i32) (i32.const 0)) (global $STACK_MAX (mut i32) (i32.const 0)) (global $_global i32 (i32.const 5242912)) @@ -33,7 +32,7 @@ ) (drop (call $_puts - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) ) ) (global.set $STACKTOP @@ -46,7 +45,7 @@ (func $__post_instantiate (; 4 ;) (; has Stack IR ;) (global.set $STACKTOP (i32.add - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) (i32.const 32) ) ) @@ -58,7 +57,7 @@ ) (call $__ZN3FooC2Ev (i32.add - (global.get $memoryBase) + (global.get $memoryBase$asm2wasm$import) (i32.const 5242912) ) ) diff --git a/test/emcc_hello_world.fromasm b/test/emcc_hello_world.fromasm index f97fe05cd..a9b17068e 100644 --- a/test/emcc_hello_world.fromasm +++ b/test/emcc_hello_world.fromasm @@ -36,7 +36,6 @@ (import "asm2wasm" "f64-to-int" (func $f64-to-int (param f64) (result i32))) (global $STACKTOP (mut i32) (global.get $STACKTOP$asm2wasm$import)) (global $STACK_MAX (mut i32) (global.get $STACK_MAX$asm2wasm$import)) - (global $tempDoublePtr (mut i32) (global.get $tempDoublePtr$asm2wasm$import)) (global $__THREW__ (mut i32) (i32.const 0)) (global $threwValue (mut i32) (i32.const 0)) (global $tempRet0 (mut i32) (i32.const 0)) @@ -163,7 +162,7 @@ (local $4 i32) (local $5 i32) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $0) ) (block $switch @@ -175,12 +174,12 @@ (call $_bitshift64Lshr (local.tee $2 (i32.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (local.tee $3 (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (i32.const 52) @@ -235,11 +234,11 @@ ) ) (i32.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $2) ) (i32.store offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (i32.or (i32.and (local.get $3) @@ -250,7 +249,7 @@ ) (local.set $0 (f64.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) ) @@ -3690,19 +3689,19 @@ (i32.const 0) ) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $14) ) (drop (i32.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (local.set $32 (if (result i32) (i32.lt_s (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) (i32.const 0) ) @@ -3747,12 +3746,12 @@ ) ) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $14) ) (drop (i32.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (local.set $5 @@ -3760,7 +3759,7 @@ (i32.lt_u (i32.and (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) (i32.const 2146435072) ) diff --git a/test/emcc_hello_world.fromasm.clamp b/test/emcc_hello_world.fromasm.clamp index 1a2992ad1..212e5e8d3 100644 --- a/test/emcc_hello_world.fromasm.clamp +++ b/test/emcc_hello_world.fromasm.clamp @@ -34,7 +34,6 @@ (import "env" "___syscall146" (func $___syscall146 (param i32 i32) (result i32))) (global $STACKTOP (mut i32) (global.get $STACKTOP$asm2wasm$import)) (global $STACK_MAX (mut i32) (global.get $STACK_MAX$asm2wasm$import)) - (global $tempDoublePtr (mut i32) (global.get $tempDoublePtr$asm2wasm$import)) (global $__THREW__ (mut i32) (i32.const 0)) (global $threwValue (mut i32) (i32.const 0)) (global $tempRet0 (mut i32) (i32.const 0)) @@ -161,7 +160,7 @@ (local $4 i32) (local $5 i32) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $0) ) (block $switch @@ -173,12 +172,12 @@ (call $_bitshift64Lshr (local.tee $2 (i32.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (local.tee $3 (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (i32.const 52) @@ -233,11 +232,11 @@ ) ) (i32.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $2) ) (i32.store offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (i32.or (i32.and (local.get $3) @@ -248,7 +247,7 @@ ) (local.set $0 (f64.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) ) @@ -3740,19 +3739,19 @@ (i32.const 0) ) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $14) ) (drop (i32.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (local.set $32 (if (result i32) (i32.lt_s (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) (i32.const 0) ) @@ -3797,12 +3796,12 @@ ) ) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $14) ) (drop (i32.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (local.set $5 @@ -3810,7 +3809,7 @@ (i32.lt_u (i32.and (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) (i32.const 2146435072) ) diff --git a/test/emcc_hello_world.fromasm.imprecise b/test/emcc_hello_world.fromasm.imprecise index c93a14f80..f6fe8aca1 100644 --- a/test/emcc_hello_world.fromasm.imprecise +++ b/test/emcc_hello_world.fromasm.imprecise @@ -33,7 +33,6 @@ (import "env" "___syscall146" (func $___syscall146 (param i32 i32) (result i32))) (global $STACKTOP (mut i32) (global.get $STACKTOP$asm2wasm$import)) (global $STACK_MAX (mut i32) (global.get $STACK_MAX$asm2wasm$import)) - (global $tempDoublePtr (mut i32) (global.get $tempDoublePtr$asm2wasm$import)) (global $__THREW__ (mut i32) (i32.const 0)) (global $threwValue (mut i32) (i32.const 0)) (global $tempRet0 (mut i32) (i32.const 0)) @@ -160,7 +159,7 @@ (local $4 i32) (local $5 i32) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $0) ) (block $switch @@ -172,12 +171,12 @@ (call $_bitshift64Lshr (local.tee $2 (i32.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (local.tee $3 (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) (i32.const 52) @@ -232,11 +231,11 @@ ) ) (i32.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $2) ) (i32.store offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (i32.or (i32.and (local.get $3) @@ -247,7 +246,7 @@ ) (local.set $0 (f64.load - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) ) ) @@ -3602,14 +3601,14 @@ (i32.const 0) ) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $14) ) (local.set $32 (if (result i32) (i32.lt_s (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) (i32.const 0) ) @@ -3654,7 +3653,7 @@ ) ) (f64.store - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) (local.get $14) ) (local.set $5 @@ -3662,7 +3661,7 @@ (i32.lt_u (i32.and (i32.load offset=4 - (global.get $tempDoublePtr) + (global.get $tempDoublePtr$asm2wasm$import) ) (i32.const 2146435072) ) diff --git a/test/min.fromasm b/test/min.fromasm index 386520834..8f99f21e8 100644 --- a/test/min.fromasm +++ b/test/min.fromasm @@ -2,7 +2,7 @@ (import "env" "memory" (memory $memory 256 256)) (data (global.get $__memory_base) "min.asm.js") (import "env" "__memory_base" (global $__memory_base i32)) - (global $M (mut i32) (i32.const 0)) + (global $M i32 (i32.const 0)) (export "floats" (func $floats)) (export "getTempRet0" (func $ub)) (export "neg" (func $neg)) diff --git a/test/min.fromasm.clamp b/test/min.fromasm.clamp index 386520834..8f99f21e8 100644 --- a/test/min.fromasm.clamp +++ b/test/min.fromasm.clamp @@ -2,7 +2,7 @@ (import "env" "memory" (memory $memory 256 256)) (data (global.get $__memory_base) "min.asm.js") (import "env" "__memory_base" (global $__memory_base i32)) - (global $M (mut i32) (i32.const 0)) + (global $M i32 (i32.const 0)) (export "floats" (func $floats)) (export "getTempRet0" (func $ub)) (export "neg" (func $neg)) diff --git a/test/min.fromasm.imprecise b/test/min.fromasm.imprecise index 6d7516136..b87a0b27f 100644 --- a/test/min.fromasm.imprecise +++ b/test/min.fromasm.imprecise @@ -1,6 +1,6 @@ (module (import "env" "memory" (memory $memory 256 256)) - (global $M (mut i32) (i32.const 0)) + (global $M i32 (i32.const 0)) (export "floats" (func $floats)) (export "getTempRet0" (func $ub)) (export "neg" (func $neg)) diff --git a/test/passes/func-metrics.txt b/test/passes/func-metrics.txt index fd8d949bd..fa4857b56 100644 --- a/test/passes/func-metrics.txt +++ b/test/passes/func-metrics.txt @@ -235,7 +235,7 @@ func: 0 [vars] : 0 global.get : 1 export: stackSave (0) - [removable-bytes-without-it]: 74 + [removable-bytes-without-it]: 66 [total] : 0 (module (type $0 (func (result i32))) diff --git a/test/passes/simplify-globals_enable-mutable-globals.txt b/test/passes/simplify-globals_enable-mutable-globals.txt new file mode 100644 index 000000000..0b3ce2201 --- /dev/null +++ b/test/passes/simplify-globals_enable-mutable-globals.txt @@ -0,0 +1,53 @@ +(module + (type $0 (func)) + (import "env" "global-1" (global $g1 i32)) + (global $g2 i32 (global.get $g1)) + (func $foo (; 0 ;) (type $0) + (drop + (global.get $g1) + ) + (drop + (global.get $g1) + ) + ) +) +(module + (type $0 (func)) + (import "env" "global-1" (global $g1 i32)) + (global $g2 i32 (global.get $g1)) + (global $g3 i32 (global.get $g2)) + (global $g4 i32 (global.get $g3)) + (func $foo (; 0 ;) (type $0) + (drop + (global.get $g1) + ) + (drop + (global.get $g1) + ) + (drop + (global.get $g1) + ) + (drop + (global.get $g1) + ) + ) +) +(module + (import "env" "global-1" (global $g1 (mut i32))) + (global $g2 i32 (global.get $g1)) +) +(module + (type $0 (func)) + (import "env" "global-1" (global $g1 i32)) + (global $g2 (mut i32) (global.get $g1)) + (func $foo (; 0 ;) (type $0) + (global.set $g2 + (unreachable) + ) + ) +) +(module + (import "env" "global-1" (global $g1 (mut i32))) + (global $g2 (mut i32) (global.get $g1)) + (export "global-2" (global $g2)) +) diff --git a/test/passes/simplify-globals_enable-mutable-globals.wast b/test/passes/simplify-globals_enable-mutable-globals.wast new file mode 100644 index 000000000..599f7e6ff --- /dev/null +++ b/test/passes/simplify-globals_enable-mutable-globals.wast @@ -0,0 +1,37 @@ +(module + (import "env" "global-1" (global $g1 i32)) + (global $g2 (mut i32) (global.get $g1)) + (func $foo + (drop (global.get $g1)) + (drop (global.get $g2)) + ) +) +(module + (import "env" "global-1" (global $g1 i32)) + (global $g2 (mut i32) (global.get $g1)) + (global $g3 (mut i32) (global.get $g2)) + (global $g4 (mut i32) (global.get $g3)) + (func $foo + (drop (global.get $g1)) + (drop (global.get $g2)) + (drop (global.get $g3)) + (drop (global.get $g4)) + ) +) +(module + (import "env" "global-1" (global $g1 (mut i32))) + (global $g2 (mut i32) (global.get $g1)) +) +(module + (import "env" "global-1" (global $g1 i32)) + (global $g2 (mut i32) (global.get $g1)) + (func $foo + (global.set $g2 (unreachable)) + ) +) +(module + (import "env" "global-1" (global $g1 (mut i32))) + (global $g2 (mut i32) (global.get $g1)) + (export "global-2" (global $g2)) +) + diff --git a/test/unit.fromasm b/test/unit.fromasm index 8ca8266e2..1bc96b1cf 100644 --- a/test/unit.fromasm +++ b/test/unit.fromasm @@ -24,8 +24,7 @@ (import "asm2wasm" "f64-to-int" (func $f64-to-int (param f64) (result i32))) (import "asm2wasm" "f64-rem" (func $f64-rem (param f64 f64) (result f64))) (global $Int (mut i32) (i32.const 0)) - (global $Double (mut f64) (f64.const 0)) - (global $n (mut i32) (global.get $n$asm2wasm$import)) + (global $Double f64 (f64.const 0)) (global $nonZero (mut i32) (i32.const 1337)) (global $exportedNumber i32 (i32.const 42)) (export "big_negative" (func $big_negative)) @@ -123,7 +122,7 @@ ) (if (i32.gt_s - (global.get $n) + (global.get $n$asm2wasm$import) (i32.const 0) ) (return @@ -445,7 +444,7 @@ (i32.store (local.get $0) (i32.add - (global.get $n) + (global.get $n$asm2wasm$import) (i32.const 144) ) ) diff --git a/test/unit.fromasm.clamp b/test/unit.fromasm.clamp index c6c967925..147913b80 100644 --- a/test/unit.fromasm.clamp +++ b/test/unit.fromasm.clamp @@ -22,8 +22,7 @@ (import "env" "emscripten_log" (func $emscripten_log)) (import "asm2wasm" "f64-rem" (func $f64-rem (param f64 f64) (result f64))) (global $Int (mut i32) (i32.const 0)) - (global $Double (mut f64) (f64.const 0)) - (global $n (mut i32) (global.get $n$asm2wasm$import)) + (global $Double f64 (f64.const 0)) (global $nonZero (mut i32) (i32.const 1337)) (global $exportedNumber i32 (i32.const 42)) (export "big_negative" (func $big_negative)) @@ -121,7 +120,7 @@ ) (if (i32.gt_s - (global.get $n) + (global.get $n$asm2wasm$import) (i32.const 0) ) (return @@ -493,7 +492,7 @@ (i32.store (local.get $0) (i32.add - (global.get $n) + (global.get $n$asm2wasm$import) (i32.const 144) ) ) diff --git a/test/unit.fromasm.imprecise b/test/unit.fromasm.imprecise index b40a5bd06..62b517f87 100644 --- a/test/unit.fromasm.imprecise +++ b/test/unit.fromasm.imprecise @@ -20,8 +20,7 @@ (import "env" "emscripten_log" (func $emscripten_log)) (import "asm2wasm" "f64-rem" (func $f64-rem (param f64 f64) (result f64))) (global $Int (mut i32) (i32.const 0)) - (global $Double (mut f64) (f64.const 0)) - (global $n (mut i32) (global.get $n$asm2wasm$import)) + (global $Double f64 (f64.const 0)) (global $nonZero (mut i32) (i32.const 1337)) (global $exportedNumber i32 (i32.const 42)) (export "big_negative" (func $big_negative)) @@ -119,7 +118,7 @@ ) (if (i32.gt_s - (global.get $n) + (global.get $n$asm2wasm$import) (i32.const 0) ) (return @@ -433,7 +432,7 @@ (i32.store (local.get $0) (i32.add - (global.get $n) + (global.get $n$asm2wasm$import) (i32.const 144) ) ) |