diff options
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/asm2wasm.h | 3 | ||||
-rw-r--r-- | src/passes/PostEmscripten.cpp | 68 | ||||
-rw-r--r-- | test/emcc_O2_hello_world.fromasm | 731 | ||||
-rw-r--r-- | test/emcc_hello_world.fromasm | 132 | ||||
-rw-r--r-- | test/passes/post-emscripten.txt | 29 | ||||
-rw-r--r-- | test/passes/post-emscripten.wast | 42 |
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) + ) + ) + ) +) + |