summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-10-27 09:19:16 -0700
committerGitHub <noreply@github.com>2016-10-27 09:19:16 -0700
commitafad1ee305719cf2a34b6dcccff72b07e1a5e34d (patch)
treee9900a4b3e26b83d6747523f23bb28180a8a6c6d /src
parent7047ed25b3ca34aeddb67d0082a998fec0841372 (diff)
downloadbinaryen-afad1ee305719cf2a34b6dcccff72b07e1a5e34d.tar.gz
binaryen-afad1ee305719cf2a34b6dcccff72b07e1a5e34d.tar.bz2
binaryen-afad1ee305719cf2a34b6dcccff72b07e1a5e34d.zip
optimize ne of 0 in a boolean context (#808)
Diffstat (limited to 'src')
-rw-r--r--src/passes/OptimizeInstructions.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 84f126ae9..6454d3510 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -352,14 +352,24 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
}
private:
-
+ // Optimize given that the expression is flowing into a boolean context
Expression* optimizeBoolean(Expression* boolean) {
- auto* condition = boolean->dynCast<Unary>();
- if (condition && condition->op == EqZInt32) {
- auto* condition2 = condition->value->dynCast<Unary>();
- if (condition2 && condition2->op == EqZInt32) {
- // double eqz
- return condition2->value;
+ if (auto* unary = boolean->dynCast<Unary>()) {
+ if (unary && unary->op == EqZInt32) {
+ auto* unary2 = unary->value->dynCast<Unary>();
+ if (unary2 && unary2->op == EqZInt32) {
+ // double eqz
+ return unary2->value;
+ }
+ }
+ } else if (auto* binary = boolean->dynCast<Binary>()) {
+ // x != 0 is just x if it's used as a bool
+ if (binary->op == NeInt32) {
+ if (auto* num = binary->right->dynCast<Const>()) {
+ if (num->value.geti32() == 0) {
+ return binary->left;
+ }
+ }
}
}
return boolean;