diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-01-31 18:40:36 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-01-31 18:41:06 -0800 |
commit | 4eeee5fbc1b60f02c4c2c75b8d6ab0e7c05ea2de (patch) | |
tree | d67dec265352199fe37c0e5dc74b237aad7ef391 /src/passes/PostEmscripten.cpp | |
parent | 6defea9c1b451051714cabbcdd8fbe22872c78c9 (diff) | |
download | binaryen-4eeee5fbc1b60f02c4c2c75b8d6ab0e7c05ea2de.tar.gz binaryen-4eeee5fbc1b60f02c4c2c75b8d6ab0e7c05ea2de.tar.bz2 binaryen-4eeee5fbc1b60f02c4c2c75b8d6ab0e7c05ea2de.zip |
optimize store offsets from emscripten output
Diffstat (limited to 'src/passes/PostEmscripten.cpp')
-rw-r--r-- | src/passes/PostEmscripten.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/passes/PostEmscripten.cpp b/src/passes/PostEmscripten.cpp index aa561baf8..14476b727 100644 --- a/src/passes/PostEmscripten.cpp +++ b/src/passes/PostEmscripten.cpp @@ -39,9 +39,12 @@ struct PostEmscripten : public WalkerPass<WasmWalker<PostEmscripten>> { // 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) { + + template<typename T> + void visitMemoryOp(T *curr) { if (curr->offset) return; - auto add = curr->ptr->dyn_cast<Binary>(); + Expression* ptr = curr->ptr; + auto add = ptr->dyn_cast<Binary>(); if (!add || add->op != Add) return; assert(add->type == i32); auto c = add->right->dyn_cast<Const>(); @@ -61,6 +64,13 @@ struct PostEmscripten : public WalkerPass<WasmWalker<PostEmscripten>> { curr->offset = value; } } + + void visitLoad(Load* curr) { + visitMemoryOp(curr); + } + void visitStore(Store* curr) { + visitMemoryOp(curr); + } }; static RegisterPass<PostEmscripten> registerPass("post-emscripten", "miscellaneous optimizations for Emscripten-generated code"); |