summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-04-09 18:34:12 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-04-09 18:34:12 -0700
commit3e00d9a1481c6f61cef163b186c2b13b8160cdad (patch)
treeab085cebcfeb1e79d0cc6985747e1e38838d4acb /src/passes/OptimizeInstructions.cpp
parentd30b98d47697daa167333db66ac0fe3d8a693eae (diff)
parent4c98c3f9c6d0c98fbcbaa44a4fc5eb3b7e21b201 (diff)
downloadbinaryen-3e00d9a1481c6f61cef163b186c2b13b8160cdad.tar.gz
binaryen-3e00d9a1481c6f61cef163b186c2b13b8160cdad.tar.bz2
binaryen-3e00d9a1481c6f61cef163b186c2b13b8160cdad.zip
Merge pull request #329 from WebAssembly/opts
Begin an AST Builder helper class, and more asm2wasm opts
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 638977353..de342b43f 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -36,6 +36,28 @@ struct OptimizeInstructions : public WalkerPass<WasmWalker<OptimizeInstructions>
}
}
}
+ void visitUnary(Unary* curr) {
+ if (curr->op == EqZ) {
+ // fold comparisons that flow into an EqZ
+ auto* child = curr->value->dyn_cast<Binary>();
+ if (child && (child->type == i32 || child->type == i64)) {
+ switch (child->op) {
+ case Eq: child->op = Ne; break;
+ case Ne: child->op = Eq; break;
+ case LtS: child->op = GeS; break;
+ case LtU: child->op = GeU; break;
+ case LeS: child->op = GtS; break;
+ case LeU: child->op = GtU; break;
+ case GtS: child->op = LeS; break;
+ case GtU: child->op = LeU; break;
+ case GeS: child->op = LtS; break;
+ case GeU: child->op = LtU; break;
+ default: return;
+ }
+ replaceCurrent(child);
+ }
+ }
+ }
};
static RegisterPass<OptimizeInstructions> registerPass("optimize-instructions", "optimizes instruction combinations");