diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-10-27 09:19:16 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-27 09:19:16 -0700 |
commit | afad1ee305719cf2a34b6dcccff72b07e1a5e34d (patch) | |
tree | e9900a4b3e26b83d6747523f23bb28180a8a6c6d /src | |
parent | 7047ed25b3ca34aeddb67d0082a998fec0841372 (diff) | |
download | binaryen-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.cpp | 24 |
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; |