Skip to content

Commit

Permalink
Add optimization "X & 1 == 1" to "X & 1" (#61412) (#62818)
Browse files Browse the repository at this point in the history
* Add optimization "X & 1 == 1" to "X & 1" (#61412)

* Moved the optimization to the morph phase (#61412)

* Done in post-order (#61412)

* Moved the optimization into fgOptimizeEqualityComparisonWithConst (#61412)

* Some corrections due the comments (#61412)

* Fix of the picture (#61412)

* Add optNarrowTree use (#61412)

* Change narrowing to the type check (#61412)

* Fix regressions (#61412)

* Moved the optimization to the lowering phase (#61412)

* Reverted Morph changes (#61412)

* Moved the optimization into OptimizeConstCompare method (#61412)

* Add GT_EQ check(#61412)
  • Loading branch information
SkiFoD committed Mar 21, 2022
1 parent 7ba7f03 commit ae941b5
Showing 1 changed file with 19 additions and 0 deletions.
19 changes: 19 additions & 0 deletions src/coreclr/jit/lower.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2925,6 +2925,25 @@ GenTree* Lowering::OptimizeConstCompare(GenTree* cmp)

if (op2Value != 0)
{
// Optimizes (X & 1) == 1 to (X & 1)
// The compiler requires jumps to have relop operands, so we do not fold that case.
LIR::Use cmpUse;
if ((op2Value == 1) && cmp->OperIs(GT_EQ))
{
if (andOp2->IsIntegralConst(1) && (genActualType(op1) == cmp->TypeGet()) &&
BlockRange().TryGetUse(cmp, &cmpUse) && !cmpUse.User()->OperIs(GT_JTRUE))
{
GenTree* next = cmp->gtNext;

cmpUse.ReplaceWith(op1);

BlockRange().Remove(cmp->gtGetOp2());
BlockRange().Remove(cmp);

return next;
}
}

//
// If we don't have a 0 compare we can get one by transforming ((x AND mask) EQ|NE mask)
// into ((x AND mask) NE|EQ 0) when mask is a single bit.
Expand Down

0 comments on commit ae941b5

Please sign in to comment.