未验证 提交 ae941b56 编写于 作者: S Sychev Vadim 提交者: GitHub

Add optimization "X & 1 == 1" to "X & 1" (#61412) (#62818)

* 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)
上级 7ba7f036
......@@ -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.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册