summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2020-10-29 21:56:04 +0200
committerGitHub <noreply@github.com>2020-10-29 12:56:04 -0700
commitb59f61678a415ccb3baa8074556c6b8759edc593 (patch)
tree6a2a6a07e79f56773f47426e56a5ff1f1e9616f4 /src/passes/OptimizeInstructions.cpp
parent972c7a08cdf25c5bd8a3182668c589596563820d (diff)
downloadbinaryen-b59f61678a415ccb3baa8074556c6b8759edc593.tar.gz
binaryen-b59f61678a415ccb3baa8074556c6b8759edc593.tar.bz2
binaryen-b59f61678a415ccb3baa8074556c6b8759edc593.zip
Optimize negative one on LHS for some shift operations (#3292)
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index d019a983f..57ef42913 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -764,7 +764,7 @@ struct OptimizeInstructions
}
// abs(0 - x) ==> abs(x),
// only for fast math
- if (getPassOptions().fastMath &&
+ if (fastMath &&
binary->op == Abstract::getBinary(binary->type, Abstract::Sub)) {
if (auto* c = binary->left->dynCast<Const>()) {
if (c->value.isZero()) {
@@ -1716,12 +1716,23 @@ private:
using namespace Match;
using namespace Abstract;
+ auto type = curr->left->type;
auto* left = curr->left->cast<Const>();
- // 0 <<>> y ==> 0
+ // 0 <<>> x ==> 0
if (Abstract::hasAnyShift(curr->op) && left->value.isZero() &&
!effects(curr->right).hasSideEffects()) {
return curr->left;
}
+ // (signed)-1 >> x ==> -1
+ // rotl(-1, x) ==> -1
+ // rotr(-1, x) ==> -1
+ if ((curr->op == Abstract::getBinary(type, ShrS) ||
+ curr->op == Abstract::getBinary(type, RotL) ||
+ curr->op == Abstract::getBinary(type, RotR)) &&
+ left->value.getInteger() == -1LL &&
+ !effects(curr->right).hasSideEffects()) {
+ return curr->left;
+ }
{
// fval(C) / -x ==> -C / x
Expression* right;