summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbuild-js.sh1
-rw-r--r--src/passes/CMakeLists.txt1
-rw-r--r--src/passes/SimplifyGlobals.cpp143
-rw-r--r--src/passes/pass.cpp4
-rw-r--r--src/passes/passes.h1
-rw-r--r--src/wasm/wasm-s-parser.cpp4
-rw-r--r--test/dynamicLibrary.fromasm7
-rw-r--r--test/dynamicLibrary.fromasm.clamp7
-rw-r--r--test/dynamicLibrary.fromasm.imprecise7
-rw-r--r--test/emcc_hello_world.fromasm25
-rw-r--r--test/emcc_hello_world.fromasm.clamp25
-rw-r--r--test/emcc_hello_world.fromasm.imprecise21
-rw-r--r--test/min.fromasm2
-rw-r--r--test/min.fromasm.clamp2
-rw-r--r--test/min.fromasm.imprecise2
-rw-r--r--test/passes/func-metrics.txt2
-rw-r--r--test/passes/simplify-globals_enable-mutable-globals.txt53
-rw-r--r--test/passes/simplify-globals_enable-mutable-globals.wast37
-rw-r--r--test/unit.fromasm7
-rw-r--r--test/unit.fromasm.clamp7
-rw-r--r--test/unit.fromasm.imprecise7
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)
)
)