summaryrefslogtreecommitdiff
path: root/src/passes/PostEmscripten.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-31 18:40:36 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-31 18:41:06 -0800
commit4eeee5fbc1b60f02c4c2c75b8d6ab0e7c05ea2de (patch)
treed67dec265352199fe37c0e5dc74b237aad7ef391 /src/passes/PostEmscripten.cpp
parent6defea9c1b451051714cabbcdd8fbe22872c78c9 (diff)
downloadbinaryen-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.cpp14
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");