diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-04-09 18:34:12 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-04-09 18:34:12 -0700 |
commit | 3e00d9a1481c6f61cef163b186c2b13b8160cdad (patch) | |
tree | ab085cebcfeb1e79d0cc6985747e1e38838d4acb /src/passes/OptimizeInstructions.cpp | |
parent | d30b98d47697daa167333db66ac0fe3d8a693eae (diff) | |
parent | 4c98c3f9c6d0c98fbcbaa44a4fc5eb3b7e21b201 (diff) | |
download | binaryen-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.cpp | 22 |
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"); |