summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/asm2wasm.h3
-rw-r--r--src/passes/PostEmscripten.cpp68
-rw-r--r--test/emcc_O2_hello_world.fromasm731
-rw-r--r--test/emcc_hello_world.fromasm132
-rw-r--r--test/passes/post-emscripten.txt29
-rw-r--r--test/passes/post-emscripten.wast42
7 files changed, 403 insertions, 604 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7101f366f..5c5656baa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -78,6 +78,7 @@ SET(binaryen-shell_SOURCES
src/passes/LowerIfElse.cpp
src/passes/MergeBlocks.cpp
src/passes/NameManager.cpp
+ src/passes/PostEmscripten.cpp
src/passes/RemoveImports.cpp
src/passes/RemoveUnusedBrs.cpp
src/passes/RemoveUnusedNames.cpp
@@ -95,6 +96,7 @@ SET(asm2wasm_SOURCES
src/asm2wasm-main.cpp
src/pass.cpp
src/passes/MergeBlocks.cpp
+ src/passes/PostEmscripten.cpp
src/passes/RemoveUnusedBrs.cpp
src/passes/RemoveUnusedNames.cpp
src/passes/SimplifyLocals.cpp
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index 7fa252c8c..3dabdc471 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -1537,6 +1537,9 @@ void Asm2WasmBuilder::optimize() {
passRunner.add("remove-unused-names");
passRunner.add("merge-blocks");
passRunner.add("simplify-locals");
+ if (maxGlobal < 1024) {
+ passRunner.add("post-emscripten");
+ }
passRunner.run(&wasm);
}
diff --git a/src/passes/PostEmscripten.cpp b/src/passes/PostEmscripten.cpp
new file mode 100644
index 000000000..aa561baf8
--- /dev/null
+++ b/src/passes/PostEmscripten.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2015 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.
+ */
+
+//
+// Misc optimizations that are useful for and/or are only valid for
+// emscripten output.
+//
+
+#include <wasm.h>
+#include <pass.h>
+
+namespace wasm {
+
+struct PostEmscripten : public WalkerPass<WasmWalker<PostEmscripten>> {
+ // When we have a Load from a local value (typically a GetLocal) plus a constant offset,
+ // we may be able to fold it in.
+ // The semantics of the Add are to wrap, while wasm offset semantics purposefully do
+ // not wrap. So this is not always safe to do. For example, a load may depend on
+ // wrapping via
+ // (2^32 - 10) + 100 => wrap and load from address 90
+ // Without wrapping, we get something too large, and an error. *However*, for
+ // asm2wasm output coming from Emscripten, we allocate the lowest 1024 for mapped
+ // globals. Mapped globals are simple types (i32, float or double), always
+ // accessed directly by a single constant. Therefore if we see (..) + K where
+ // K is less then 1024, then if it wraps, it wraps into [0, 1024) which is at best
+ // a mapped global, but it can't be because they are accessed directly (at worst,
+ // it's 0 or an unused section of memory that was reserved for mapped globlas).
+ // Thus it is ok to optimize such small constants into Load offsets.
+ void visitLoad(Load *curr) {
+ if (curr->offset) return;
+ auto add = curr->ptr->dyn_cast<Binary>();
+ if (!add || add->op != Add) return;
+ assert(add->type == i32);
+ auto c = add->right->dyn_cast<Const>();
+ if (!c) {
+ c = add->left->dyn_cast<Const>();
+ if (c) {
+ // if one is a const, it's ok to swap
+ add->left = add->right;
+ add->right = c;
+ }
+ }
+ if (!c) return;
+ auto value = c->value.geti32();
+ if (value >= 0 && value < 1024) {
+ // foldable, by the above logic
+ curr->ptr = add->left;
+ curr->offset = value;
+ }
+ }
+};
+
+static RegisterPass<PostEmscripten> registerPass("post-emscripten", "miscellaneous optimizations for Emscripten-generated code");
+
+} // namespace wasm
diff --git a/test/emcc_O2_hello_world.fromasm b/test/emcc_O2_hello_world.fromasm
index 574759517..ab2634757 100644
--- a/test/emcc_O2_hello_world.fromasm
+++ b/test/emcc_O2_hello_world.fromasm
@@ -831,42 +831,36 @@
)
)
(set_local $i10
- (i32.load align=4
- (i32.add
- (i32.const 480)
- (i32.shl
- (i32.add
+ (i32.load offset=480 align=4
+ (i32.shl
+ (i32.add
+ (i32.or
(i32.or
(i32.or
(i32.or
- (i32.or
- (get_local $i8)
- (get_local $i4)
- )
- (get_local $i15)
+ (get_local $i8)
+ (get_local $i4)
)
- (get_local $i7)
+ (get_local $i15)
)
- (get_local $i5)
- )
- (i32.shr_u
- (get_local $i3)
- (get_local $i5)
+ (get_local $i7)
)
+ (get_local $i5)
+ )
+ (i32.shr_u
+ (get_local $i3)
+ (get_local $i5)
)
- (i32.const 2)
)
+ (i32.const 2)
)
)
)
(set_local $i5
(i32.sub
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i10)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i10)
)
(i32.const -8)
)
@@ -881,11 +875,8 @@
)
(loop $while-out$3 $while-in$4
(set_local $i10
- (i32.load align=4
- (i32.add
- (get_local $i3)
- (i32.const 16)
- )
+ (i32.load offset=16 align=4
+ (get_local $i3)
)
)
(if_else
@@ -895,11 +886,8 @@
)
(block
(set_local $i15
- (i32.load align=4
- (i32.add
- (get_local $i3)
- (i32.const 20)
- )
+ (i32.load offset=20 align=4
+ (get_local $i3)
)
)
(if_else
@@ -928,11 +916,8 @@
(set_local $i10
(i32.sub
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i23)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i23)
)
(i32.const -8)
)
@@ -990,19 +975,13 @@
(call_import $_abort)
)
(set_local $i5
- (i32.load align=4
- (i32.add
- (get_local $i22)
- (i32.const 24)
- )
+ (i32.load offset=24 align=4
+ (get_local $i22)
)
)
(set_local $i12
- (i32.load align=4
- (i32.add
- (get_local $i22)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i22)
)
)
(block $do-once$5
@@ -1150,11 +1129,8 @@
)
(block
(set_local $i14
- (i32.load align=4
- (i32.add
- (get_local $i22)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i22)
)
)
(if
@@ -1216,11 +1192,8 @@
(get_local $i5)
(block
(set_local $i12
- (i32.load align=4
- (i32.add
- (get_local $i22)
- (i32.const 28)
- )
+ (i32.load offset=28 align=4
+ (get_local $i22)
)
)
(set_local $i7
@@ -1333,11 +1306,8 @@
(get_local $i5)
)
(set_local $i7
- (i32.load align=4
- (i32.add
- (get_local $i22)
- (i32.const 16)
- )
+ (i32.load offset=16 align=4
+ (get_local $i22)
)
)
(block $do-once$9
@@ -1370,11 +1340,8 @@
)
)
(set_local $i7
- (i32.load align=4
- (i32.add
- (get_local $i22)
- (i32.const 20)
- )
+ (i32.load offset=20 align=4
+ (get_local $i22)
)
)
(if
@@ -1774,13 +1741,10 @@
)
)
(set_local $i4
- (i32.load align=4
- (i32.add
- (i32.const 480)
- (i32.shl
- (get_local $i32)
- (i32.const 2)
- )
+ (i32.load offset=480 align=4
+ (i32.shl
+ (get_local $i32)
+ (i32.const 2)
)
)
)
@@ -1839,11 +1803,8 @@
(loop $while-out$10 $while-in$11
(set_local $i16
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i17)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i17)
)
(i32.const -8)
)
@@ -1898,11 +1859,8 @@
)
)
(set_local $i9
- (i32.load align=4
- (i32.add
- (get_local $i17)
- (i32.const 20)
- )
+ (i32.load offset=20 align=4
+ (get_local $i17)
)
)
(set_local $i17
@@ -2120,31 +2078,28 @@
)
)
(set_local $i42
- (i32.load align=4
- (i32.add
- (i32.const 480)
- (i32.shl
- (i32.add
+ (i32.load offset=480 align=4
+ (i32.shl
+ (i32.add
+ (i32.or
(i32.or
(i32.or
(i32.or
- (i32.or
- (get_local $i4)
- (get_local $i14)
- )
- (get_local $i2)
+ (get_local $i4)
+ (get_local $i14)
)
- (get_local $i3)
+ (get_local $i2)
)
- (get_local $i8)
- )
- (i32.shr_u
- (get_local $i7)
- (get_local $i8)
+ (get_local $i3)
)
+ (get_local $i8)
+ )
+ (i32.shr_u
+ (get_local $i7)
+ (get_local $i8)
)
- (i32.const 2)
)
+ (i32.const 2)
)
)
)
@@ -2195,11 +2150,8 @@
(set_local $i8
(i32.sub
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i38)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i38)
)
(i32.const -8)
)
@@ -2227,11 +2179,8 @@
)
)
(set_local $i7
- (i32.load align=4
- (i32.add
- (get_local $i38)
- (i32.const 16)
- )
+ (i32.load offset=16 align=4
+ (get_local $i38)
)
)
(if
@@ -2253,11 +2202,8 @@
)
)
(set_local $i38
- (i32.load align=4
- (i32.add
- (get_local $i38)
- (i32.const 20)
- )
+ (i32.load offset=20 align=4
+ (get_local $i38)
)
)
(if_else
@@ -2333,19 +2279,13 @@
(call_import $_abort)
)
(set_local $i3
- (i32.load align=4
- (i32.add
- (get_local $i44)
- (i32.const 24)
- )
+ (i32.load offset=24 align=4
+ (get_local $i44)
)
)
(set_local $i7
- (i32.load align=4
- (i32.add
- (get_local $i44)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i44)
)
)
(block $do-once$14
@@ -2493,11 +2433,8 @@
)
(block
(set_local $i2
- (i32.load align=4
- (i32.add
- (get_local $i44)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i44)
)
)
(if
@@ -2559,11 +2496,8 @@
(get_local $i3)
(block
(set_local $i7
- (i32.load align=4
- (i32.add
- (get_local $i44)
- (i32.const 28)
- )
+ (i32.load offset=28 align=4
+ (get_local $i44)
)
)
(set_local $i15
@@ -2676,11 +2610,8 @@
(get_local $i3)
)
(set_local $i15
- (i32.load align=4
- (i32.add
- (get_local $i44)
- (i32.const 16)
- )
+ (i32.load offset=16 align=4
+ (get_local $i44)
)
)
(block $do-once$18
@@ -2713,11 +2644,8 @@
)
)
(set_local $i15
- (i32.load align=4
- (i32.add
- (get_local $i44)
- (i32.const 20)
- )
+ (i32.load offset=20 align=4
+ (get_local $i44)
)
)
(if
@@ -3129,11 +3057,8 @@
(if
(i32.eq
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i7)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i7)
)
(i32.const -8)
)
@@ -3796,11 +3721,8 @@
)
)
(set_local $i50
- (i32.load align=4
- (i32.add
- (get_local $i50)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i50)
)
)
(if
@@ -4328,11 +4250,8 @@
)
)
(set_local $i63
- (i32.load align=4
- (i32.add
- (get_local $i63)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i63)
)
)
(br_if
@@ -4352,11 +4271,8 @@
)
(i32.eq
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i67)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i67)
)
(i32.const 8)
)
@@ -4517,11 +4433,8 @@
)
)
(set_local $i63
- (i32.load align=4
- (i32.add
- (get_local $i63)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i63)
)
)
(if
@@ -4546,11 +4459,8 @@
(if_else
(i32.eq
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i70)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i70)
)
(i32.const 8)
)
@@ -4709,11 +4619,8 @@
)
)
(set_local $i62
- (i32.load align=4
- (i32.add
- (get_local $i43)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i43)
)
)
(if_else
@@ -4745,19 +4652,13 @@
)
(block
(set_local $i54
- (i32.load align=4
- (i32.add
- (get_local $i43)
- (i32.const 24)
- )
+ (i32.load offset=24 align=4
+ (get_local $i43)
)
)
(set_local $i55
- (i32.load align=4
- (i32.add
- (get_local $i43)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i43)
)
)
(block $do-once$33
@@ -4905,11 +4806,8 @@
)
(block
(set_local $i5
- (i32.load align=4
- (i32.add
- (get_local $i43)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i43)
)
)
(if
@@ -4974,11 +4872,8 @@
$label$break$L331
)
(set_local $i55
- (i32.load align=4
- (i32.add
- (get_local $i43)
- (i32.const 28)
- )
+ (i32.load offset=28 align=4
+ (get_local $i43)
)
)
(set_local $i5
@@ -5129,11 +5024,8 @@
)
)
(set_local $i45
- (i32.load align=4
- (i32.add
- (get_local $i5)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i5)
)
)
(br_if
@@ -5172,19 +5064,13 @@
)
(block
(set_local $i45
- (i32.load align=4
- (i32.add
- (get_local $i43)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i43)
)
)
(set_local $i55
- (i32.load align=4
- (i32.add
- (get_local $i43)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i43)
)
)
(set_local $i54
@@ -5215,11 +5101,8 @@
)
(br_if
(i32.eq
- (i32.load align=4
- (i32.add
- (get_local $i45)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i45)
)
(get_local $i43)
)
@@ -5722,11 +5605,8 @@
(if
(i32.eq
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i62)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i62)
)
(i32.const -8)
)
@@ -5970,11 +5850,8 @@
(set_local $i53
(i32.add
(get_local $i63)
- (i32.load align=4
- (i32.add
- (get_local $i71)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i71)
)
)
)
@@ -5993,11 +5870,8 @@
)
)
(set_local $i71
- (i32.load align=4
- (i32.add
- (get_local $i71)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i71)
)
)
(br $while-in$45)
@@ -6591,11 +6465,8 @@
(if
(i32.eq
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i62)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i62)
)
(i32.const -8)
)
@@ -7244,19 +7115,13 @@
)
(block
(set_local $i7
- (i32.load align=4
- (i32.add
- (get_local $i8)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i8)
)
)
(set_local $i10
- (i32.load align=4
- (i32.add
- (get_local $i8)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i8)
)
)
(set_local $i14
@@ -7286,11 +7151,8 @@
)
(if
(i32.ne
- (i32.load align=4
- (i32.add
- (get_local $i7)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i7)
)
(get_local $i8)
)
@@ -7388,19 +7250,13 @@
)
)
(set_local $i7
- (i32.load align=4
- (i32.add
- (get_local $i8)
- (i32.const 24)
- )
+ (i32.load offset=24 align=4
+ (get_local $i8)
)
)
(set_local $i10
- (i32.load align=4
- (i32.add
- (get_local $i8)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i8)
)
)
(block $do-once$1
@@ -7548,11 +7404,8 @@
)
(block
(set_local $i11
- (i32.load align=4
- (i32.add
- (get_local $i8)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i8)
)
)
(if
@@ -7613,11 +7466,8 @@
(get_local $i7)
(block
(set_local $i10
- (i32.load align=4
- (i32.add
- (get_local $i8)
- (i32.const 28)
- )
+ (i32.load offset=28 align=4
+ (get_local $i8)
)
)
(set_local $i11
@@ -7784,11 +7634,8 @@
)
)
(set_local $i14
- (i32.load align=4
- (i32.add
- (get_local $i11)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i11)
)
)
(if_else
@@ -8013,19 +7860,13 @@
)
(block
(set_local $i21
- (i32.load align=4
- (i32.add
- (get_local $i6)
- (i32.const 24)
- )
+ (i32.load offset=24 align=4
+ (get_local $i6)
)
)
(set_local $i22
- (i32.load align=4
- (i32.add
- (get_local $i6)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i6)
)
)
(block $do-once$6
@@ -8175,11 +8016,8 @@
)
(block
(set_local $i19
- (i32.load align=4
- (i32.add
- (get_local $i6)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i6)
)
)
(if
@@ -8242,11 +8080,8 @@
(get_local $i21)
(block
(set_local $i22
- (i32.load align=4
- (i32.add
- (get_local $i6)
- (i32.const 28)
- )
+ (i32.load offset=28 align=4
+ (get_local $i6)
)
)
(set_local $i9
@@ -8399,11 +8234,8 @@
)
)
(set_local $i8
- (i32.load align=4
- (i32.add
- (get_local $i9)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i9)
)
)
(if
@@ -8440,19 +8272,13 @@
)
(block
(set_local $i8
- (i32.load align=4
- (i32.add
- (get_local $i6)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (get_local $i6)
)
)
(set_local $i22
- (i32.load align=4
- (i32.add
- (get_local $i6)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i6)
)
)
(set_local $i21
@@ -8484,11 +8310,8 @@
)
(if
(i32.ne
- (i32.load align=4
- (i32.add
- (get_local $i8)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i8)
)
(get_local $i6)
)
@@ -8944,11 +8767,8 @@
(if
(i32.eq
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i2)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i2)
)
(i32.const -8)
)
@@ -9457,11 +9277,8 @@
)
)
(set_local $i18
- (i32.load align=4
- (i32.add
- (get_local $i12)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i12)
)
)
(if_else
@@ -9527,11 +9344,8 @@
(get_local $i23)
)
(set_local $i19
- (i32.load align=4
- (i32.add
- (get_local $i12)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (get_local $i12)
)
)
(set_local $i20
@@ -9602,11 +9416,8 @@
)
(i32.add
(get_local $i13)
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 48)
- )
+ (i32.load offset=48 align=4
+ (get_local $i1)
)
)
)
@@ -9666,11 +9477,8 @@
(set_local $i24
(i32.sub
(get_local $i3)
- (i32.load align=4
- (i32.add
- (get_local $i16)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $i16)
)
)
)
@@ -9777,11 +9585,8 @@
(call_indirect $FUNCSIG$iiii
(i32.add
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i3)
- (i32.const 36)
- )
+ (i32.load offset=36 align=4
+ (get_local $i3)
)
(i32.const 7)
)
@@ -9798,11 +9603,8 @@
(block $label$break$L10
(if_else
(i32.gt_s
- (i32.load8_s align=1
- (i32.add
- (get_local $i3)
- (i32.const 75)
- )
+ (i32.load8_s offset=75 align=1
+ (get_local $i3)
)
(i32.const -1)
)
@@ -9865,11 +9667,8 @@
(call_indirect $FUNCSIG$iiii
(i32.add
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i3)
- (i32.const 36)
- )
+ (i32.load offset=36 align=4
+ (get_local $i3)
)
(i32.const 7)
)
@@ -9964,11 +9763,8 @@
(block
(if
(i32.le_s
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 76)
- )
+ (i32.load offset=76 align=4
+ (get_local $i1)
)
(i32.const -1)
)
@@ -10054,11 +9850,8 @@
(loop $while-out$1 $while-in$2
(if_else
(i32.gt_s
- (i32.load align=4
- (i32.add
- (get_local $i3)
- (i32.const 76)
- )
+ (i32.load offset=76 align=4
+ (get_local $i3)
)
(i32.const -1)
)
@@ -10073,17 +9866,11 @@
)
(if_else
(i32.gt_u
- (i32.load align=4
- (i32.add
- (get_local $i3)
- (i32.const 20)
- )
+ (i32.load offset=20 align=4
+ (get_local $i3)
)
- (i32.load align=4
- (i32.add
- (get_local $i3)
- (i32.const 28)
- )
+ (i32.load offset=28 align=4
+ (get_local $i3)
)
)
(set_local $i8
@@ -10105,11 +9892,8 @@
)
)
(set_local $i3
- (i32.load align=4
- (i32.add
- (get_local $i3)
- (i32.const 56)
- )
+ (i32.load offset=56 align=4
+ (get_local $i3)
)
)
(if_else
@@ -10455,11 +10239,8 @@
)
(i32.ne
(get_local $i11)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 75)
- )
+ (i32.load8_s offset=75 align=1
+ (get_local $i1)
)
)
)
@@ -10488,11 +10269,8 @@
(call_indirect $FUNCSIG$iiii
(i32.add
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 36)
- )
+ (i32.load offset=36 align=4
+ (get_local $i1)
)
(i32.const 7)
)
@@ -10556,11 +10334,8 @@
(call_indirect $FUNCSIG$iiii
(i32.add
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 36)
- )
+ (i32.load offset=36 align=4
+ (get_local $i1)
)
(i32.const 7)
)
@@ -10613,11 +10388,8 @@
(call_indirect $FUNCSIG$iiii
(i32.add
(i32.and
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 40)
- )
+ (i32.load offset=40 align=4
+ (get_local $i1)
)
(i32.const 7)
)
@@ -10968,11 +10740,8 @@
)
(if_else
(i32.gt_s
- (i32.load align=4
- (i32.add
- (get_local $i2)
- (i32.const 76)
- )
+ (i32.load offset=76 align=4
+ (get_local $i2)
)
(i32.const -1)
)
@@ -11001,11 +10770,8 @@
(if
(if_else
(i32.ne
- (i32.load8_s align=1
- (i32.add
- (get_local $i2)
- (i32.const 75)
- )
+ (i32.load8_s offset=75 align=1
+ (get_local $i2)
)
(i32.const 10)
)
@@ -11023,11 +10789,8 @@
)
(i32.lt_u
(get_local $i6)
- (i32.load align=4
- (i32.add
- (get_local $i2)
- (i32.const 16)
- )
+ (i32.load offset=16 align=4
+ (get_local $i2)
)
)
)
@@ -11107,11 +10870,8 @@
)
(i32.store align=4
(get_local $i5)
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 60)
- )
+ (i32.load offset=60 align=4
+ (get_local $i1)
)
)
(i32.store align=4
@@ -11227,11 +10987,8 @@
(i32.const 0)
)
(set_local $i2
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 44)
- )
+ (i32.load offset=44 align=4
+ (get_local $i1)
)
)
(i32.store align=4
@@ -11255,11 +11012,8 @@
)
(i32.add
(get_local $i2)
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 48)
- )
+ (i32.load offset=48 align=4
+ (get_local $i1)
)
)
)
@@ -11296,11 +11050,8 @@
)
(if_else
(i32.gt_s
- (i32.load align=4
- (i32.add
- (get_local $i4)
- (i32.const 76)
- )
+ (i32.load offset=76 align=4
+ (get_local $i4)
)
(i32.const -1)
)
@@ -11401,11 +11152,8 @@
(block
(i32.store align=4
(get_local $i5)
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 60)
- )
+ (i32.load offset=60 align=4
+ (get_local $i1)
)
)
(i32.store align=4
@@ -11472,11 +11220,8 @@
)
(i32.const 1)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 1)
- )
+ (i32.load8_s offset=1 align=1
+ (get_local $i1)
)
)
(i32.store8 align=1
@@ -11486,11 +11231,8 @@
)
(i32.const 2)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 2)
- )
+ (i32.load8_s offset=2 align=1
+ (get_local $i1)
)
)
(i32.store8 align=1
@@ -11500,11 +11242,8 @@
)
(i32.const 3)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 3)
- )
+ (i32.load8_s offset=3 align=1
+ (get_local $i1)
)
)
(i32.store8 align=1
@@ -11514,11 +11253,8 @@
)
(i32.const 4)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 4)
- )
+ (i32.load8_s offset=4 align=1
+ (get_local $i1)
)
)
(i32.store8 align=1
@@ -11528,11 +11264,8 @@
)
(i32.const 5)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 5)
- )
+ (i32.load8_s offset=5 align=1
+ (get_local $i1)
)
)
(i32.store8 align=1
@@ -11542,11 +11275,8 @@
)
(i32.const 6)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 6)
- )
+ (i32.load8_s offset=6 align=1
+ (get_local $i1)
)
)
(i32.store8 align=1
@@ -11556,11 +11286,8 @@
)
(i32.const 7)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 7)
- )
+ (i32.load8_s offset=7 align=1
+ (get_local $i1)
)
)
)
@@ -11586,11 +11313,8 @@
)
(i32.store align=4
(get_local $i3)
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 60)
- )
+ (i32.load offset=60 align=4
+ (get_local $i1)
)
)
(set_local $i1
@@ -11623,11 +11347,8 @@
)
(i32.const 1)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 1)
- )
+ (i32.load8_s offset=1 align=1
+ (get_local $i1)
)
)
(i32.store8 align=1
@@ -11637,11 +11358,8 @@
)
(i32.const 2)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 2)
- )
+ (i32.load8_s offset=2 align=1
+ (get_local $i1)
)
)
(i32.store8 align=1
@@ -11651,11 +11369,8 @@
)
(i32.const 3)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $i1)
- (i32.const 3)
- )
+ (i32.load8_s offset=3 align=1
+ (get_local $i1)
)
)
)
@@ -11741,11 +11456,8 @@
(i32.const 60)
)
(set_local $i1
- (i32.load align=4
- (i32.add
- (call_import $_pthread_self)
- (i32.const 60)
- )
+ (i32.load offset=60 align=4
+ (call_import $_pthread_self)
)
)
)
@@ -11799,11 +11511,8 @@
(func $_cleanup_418 (param $i1 i32)
(if
(i32.eq
- (i32.load align=4
- (i32.add
- (get_local $i1)
- (i32.const 68)
- )
+ (i32.load offset=68 align=4
+ (get_local $i1)
)
(i32.const 0)
)
diff --git a/test/emcc_hello_world.fromasm b/test/emcc_hello_world.fromasm
index bc32b67e4..bf8602fea 100644
--- a/test/emcc_hello_world.fromasm
+++ b/test/emcc_hello_world.fromasm
@@ -148,11 +148,8 @@
)
(i32.const 1)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 1)
- )
+ (i32.load8_s offset=1 align=1
+ (get_local $ptr)
)
)
(i32.store8 align=1
@@ -162,11 +159,8 @@
)
(i32.const 2)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 2)
- )
+ (i32.load8_s offset=2 align=1
+ (get_local $ptr)
)
)
(i32.store8 align=1
@@ -176,11 +170,8 @@
)
(i32.const 3)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 3)
- )
+ (i32.load8_s offset=3 align=1
+ (get_local $ptr)
)
)
)
@@ -200,11 +191,8 @@
)
(i32.const 1)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 1)
- )
+ (i32.load8_s offset=1 align=1
+ (get_local $ptr)
)
)
(i32.store8 align=1
@@ -214,11 +202,8 @@
)
(i32.const 2)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 2)
- )
+ (i32.load8_s offset=2 align=1
+ (get_local $ptr)
)
)
(i32.store8 align=1
@@ -228,11 +213,8 @@
)
(i32.const 3)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 3)
- )
+ (i32.load8_s offset=3 align=1
+ (get_local $ptr)
)
)
(i32.store8 align=1
@@ -242,11 +224,8 @@
)
(i32.const 4)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 4)
- )
+ (i32.load8_s offset=4 align=1
+ (get_local $ptr)
)
)
(i32.store8 align=1
@@ -256,11 +235,8 @@
)
(i32.const 5)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 5)
- )
+ (i32.load8_s offset=5 align=1
+ (get_local $ptr)
)
)
(i32.store8 align=1
@@ -270,11 +246,8 @@
)
(i32.const 6)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 6)
- )
+ (i32.load8_s offset=6 align=1
+ (get_local $ptr)
)
)
(i32.store8 align=1
@@ -284,11 +257,8 @@
)
(i32.const 7)
)
- (i32.load8_s align=1
- (i32.add
- (get_local $ptr)
- (i32.const 7)
- )
+ (i32.load8_s offset=7 align=1
+ (get_local $ptr)
)
)
)
@@ -388,12 +358,9 @@
)
)
(set_local $$1
- (i32.load align=4
- (i32.add
- (i32.load align=4
- (i32.const 24)
- )
- (i32.const 4)
+ (i32.load offset=4 align=4
+ (i32.load align=4
+ (i32.const 24)
)
)
)
@@ -8899,12 +8866,9 @@
)
)
(set_local $$183
- (i32.load align=4
- (i32.add
- (i32.load align=4
- (i32.const 24)
- )
- (i32.const 4)
+ (i32.load offset=4 align=4
+ (i32.load align=4
+ (i32.const 24)
)
)
)
@@ -9005,12 +8969,9 @@
)
)
(set_local $$186
- (i32.load align=4
- (i32.add
- (i32.load align=4
- (i32.const 24)
- )
- (i32.const 4)
+ (i32.load offset=4 align=4
+ (i32.load align=4
+ (i32.const 24)
)
)
)
@@ -25976,11 +25937,8 @@
(get_local $$add$ptr14$i$i)
(i32.const 4)
)
- (i32.load align=4
- (i32.add
- (i32.const 624)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (i32.const 624)
)
)
(i32.store align=4
@@ -25988,11 +25946,8 @@
(get_local $$add$ptr14$i$i)
(i32.const 8)
)
- (i32.load align=4
- (i32.add
- (i32.const 624)
- (i32.const 8)
- )
+ (i32.load offset=8 align=4
+ (i32.const 624)
)
)
(i32.store align=4
@@ -26000,11 +25955,8 @@
(get_local $$add$ptr14$i$i)
(i32.const 12)
)
- (i32.load align=4
- (i32.add
- (i32.const 624)
- (i32.const 12)
- )
+ (i32.load offset=12 align=4
+ (i32.const 624)
)
)
(i32.store align=4
@@ -31345,11 +31297,8 @@
(get_local $$1$0)
)
(i32.xor
- (i32.load align=4
- (i32.add
- (get_local $$rem)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $$rem)
)
(get_local $$1$1)
)
@@ -31473,11 +31422,8 @@
)
(i32.store align=4
(i32.const 168)
- (i32.load align=4
- (i32.add
- (get_local $$rem)
- (i32.const 4)
- )
+ (i32.load offset=4 align=4
+ (get_local $$rem)
)
)
(i32.load align=4
diff --git a/test/passes/post-emscripten.txt b/test/passes/post-emscripten.txt
new file mode 100644
index 000000000..567a8b849
--- /dev/null
+++ b/test/passes/post-emscripten.txt
@@ -0,0 +1,29 @@
+(module
+ (memory 16777216 16777216)
+ (func $b0 (param $x i32)
+ (i32.load offset=1
+ (get_local $x)
+ )
+ (i32.load offset=8
+ (get_local $x)
+ )
+ (i32.load offset=1023
+ (get_local $x)
+ )
+ (i32.load
+ (i32.add
+ (get_local $x)
+ (i32.const 1024)
+ )
+ )
+ (i32.load
+ (i32.add
+ (get_local $x)
+ (i32.const 2048)
+ )
+ )
+ (i32.load offset=4
+ (get_local $x)
+ )
+ )
+)
diff --git a/test/passes/post-emscripten.wast b/test/passes/post-emscripten.wast
new file mode 100644
index 000000000..df56817a7
--- /dev/null
+++ b/test/passes/post-emscripten.wast
@@ -0,0 +1,42 @@
+(module
+ (memory 16777216 16777216)
+ (func $b0 (param $x i32)
+ (i32.load
+ (i32.add
+ (get_local $x)
+ (i32.const 1)
+ )
+ )
+ (i32.load
+ (i32.add
+ (get_local $x)
+ (i32.const 8)
+ )
+ )
+ (i32.load
+ (i32.add
+ (get_local $x)
+ (i32.const 1023)
+ )
+ )
+ (i32.load
+ (i32.add
+ (get_local $x)
+ (i32.const 1024)
+ )
+ )
+ (i32.load
+ (i32.add
+ (get_local $x)
+ (i32.const 2048)
+ )
+ )
+ (i32.load
+ (i32.add
+ (i32.const 4)
+ (get_local $x)
+ )
+ )
+ )
+)
+