Skip to content

Commit 9576230

Browse files
committed
* limit to IsAnyLocal|IsConst()
1 parent f836080 commit 9576230

2 files changed

Lines changed: 17 additions & 5 deletions

File tree

src/coreclr/jit/gentree.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15381,6 +15381,16 @@ GenTree* Compiler::gtFoldAndOrXor(GenTree* tree)
1538115381

1538215382
GenTree* op1 = tree->gtGetOp1();
1538315383
GenTree* op2 = tree->gtGetOp2();
15384+
15385+
auto supportedOp = [](GenTree* op) {
15386+
return op->OperIsAnyLocal() || op->OperIsConst();
15387+
};
15388+
if (!supportedOp(op1->gtGetOp1()) || !supportedOp(op1->gtGetOp2()) || !supportedOp(op2->gtGetOp1()) ||
15389+
!supportedOp(op2->gtGetOp2()))
15390+
{
15391+
return tree;
15392+
}
15393+
1538415394
if (!op1->OperIs(GT_EQ))
1538515395
{
1538615396
std::swap(op1, op2);
@@ -15399,8 +15409,8 @@ GenTree* Compiler::gtFoldAndOrXor(GenTree* tree)
1539915409
}
1540015410
}
1540115411

15402-
if (fusedCmp != GT_NONE && GenTree::Compare(op1->gtGetOp1(), op2->gtGetOp1()) &&
15403-
GenTree::Compare(op1->gtGetOp2(), op2->gtGetOp2()))
15412+
if (fusedCmp != GT_NONE && GenTree::Compare(op1->gtGetOp2(), op2->gtGetOp2()) &&
15413+
GenTree::Compare(op1->gtGetOp1(), op2->gtGetOp1()))
1540415414
{
1540515415
return gtNewOperNode(fusedCmp, tree->TypeGet(), op1->gtGetOp1(), op1->gtGetOp2());
1540615416
}

src/coreclr/jit/ifconversion.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ GenTree* OptIfConversionDsc::TrySelectToCondOpLcl(GenTreeConditional* select)
983983

984984
//-----------------------------------------------------------------------------
985985
// TrySelectToBitwiseOp: Try to optimize:
986-
// SELECT(x != 3, x > 3, 1) -> (x == 3) | (x > 3)
986+
// SELECT(x != 3, x > 3, 1) -> (x == 3) | (x > 3)
987987
// SELECT(x == 13, y == 4, 0) -> (x == 13) & (y == 4)
988988
//
989989
// Arguments:
@@ -1003,15 +1003,17 @@ GenTree* OptIfConversionDsc::TrySelectToBitwiseOp(GenTreeConditional* select)
10031003
return nullptr;
10041004
}
10051005

1006-
int64_t trueVal = falseInput->AsIntConCommon()->IntegralValue();
1007-
genTreeOps bitOp = (trueVal == 1) ? GT_OR : ((trueVal == 0) ? GT_AND : GT_NONE);
1006+
int64_t trueVal = falseInput->AsIntConCommon()->IntegralValue();
1007+
genTreeOps bitOp = (trueVal == 1) ? GT_OR : ((trueVal == 0) ? GT_AND : GT_NONE);
10081008
if (bitOp == GT_NONE)
10091009
{
10101010
return nullptr;
10111011
}
10121012

10131013
if (bitOp == GT_OR)
10141014
{
1015+
// Need to reverse for OR because of:
1016+
// SELECT(x != 3, x > 3, 1) -> (x == 3) | (x > 3)
10151017
cond = m_compiler->gtReverseCond(cond);
10161018
}
10171019

0 commit comments

Comments
 (0)