Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d08dcb4

Browse files
committed
Ensure that we prefer AndNot over TernaryLogic
1 parent 3ad1ec2 commit d08dcb4

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

src/coreclr/jit/lowerxarch.cpp

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,43 +1508,41 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
15081508
+- t1
15091509
t2 = binary logical op2
15101510
*/
1511-
GenTree* second = use.User();
1512-
if (!second->OperIs(GT_HWINTRINSIC))
1511+
GenTree* user = use.User();
1512+
if (!user->OperIs(GT_HWINTRINSIC))
15131513
{
15141514
break;
15151515
}
15161516

1517-
bool nestedIsScalar = false;
1518-
genTreeOps nestedOper = second->AsHWIntrinsic()->GetOperForHWIntrinsicId(&isScalar);
1517+
GenTreeHWIntrinsic* userIntrin = user->AsHWIntrinsic();
15191518

1520-
if (nestedOper == GT_NONE)
1521-
{
1522-
// TODO: We should support cases like CNDSEL
1523-
break;
1524-
}
1519+
bool userIsScalar = false;
1520+
genTreeOps userOper = userIntrin->GetOperForHWIntrinsicId(&isScalar);
15251521

1526-
if (nestedIsScalar)
1522+
if ((userOper != GT_AND) && (userOper != GT_OR) && (userOper != GT_XOR))
15271523
{
1524+
// TODO: We should support other cases like AND_NOT, CNDSEL, and TernaryLogic
15281525
break;
15291526
}
1527+
assert(!userIsScalar);
15301528

1531-
if ((nestedOper != GT_AND) && (nestedOper != GT_OR) && (nestedOper != GT_XOR))
1529+
if ((userOper == GT_AND) && (oper == GT_XOR) && op2->IsVectorAllBitsSet())
15321530
{
1533-
// TODO: We should support other cases like AND_NOT, NOT, and CNDSEL
1534-
break;
1531+
// We have something that will transform to AND_NOT, which we want to
1532+
// prefer over TernaryLogic or any other transform.
1533+
return node->gtNext;
15351534
}
15361535

1537-
GenTree* op3 = second->AsHWIntrinsic()->Op(1) == node ? second->AsHWIntrinsic()->Op(2)
1538-
: second->AsHWIntrinsic()->Op(1);
1539-
GenTree* control = comp->gtNewIconNode(node->GetTernaryControlByte(second->AsHWIntrinsic()));
1536+
GenTree* op3 = userIntrin->Op(1) == node ? userIntrin->Op(2) : userIntrin->Op(1);
1537+
GenTree* control = comp->gtNewIconNode(node->GetTernaryControlByte(userIntrin));
15401538
CorInfoType simdBaseJitType = node->GetSimdBaseJitType();
15411539
unsigned simdSize = node->GetSimdSize();
15421540
var_types simdType = Compiler::getSIMDTypeForSize(simdSize);
15431541
GenTree* ternaryNode =
15441542
comp->gtNewSimdTernaryLogicNode(simdType, op1, op2, op3, control, simdBaseJitType, simdSize);
1545-
BlockRange().InsertBefore(second, control, ternaryNode);
1543+
BlockRange().InsertBefore(userIntrin, control, ternaryNode);
15461544
LIR::Use finalRes;
1547-
if (BlockRange().TryGetUse(second, &finalRes))
1545+
if (BlockRange().TryGetUse(userIntrin, &finalRes))
15481546
{
15491547
finalRes.ReplaceWith(ternaryNode);
15501548
}
@@ -1554,7 +1552,7 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
15541552
}
15551553
GenTree* next = node->gtNext;
15561554
BlockRange().Remove(node);
1557-
BlockRange().Remove(second);
1555+
BlockRange().Remove(userIntrin);
15581556
return next;
15591557
}
15601558
break;

0 commit comments

Comments
 (0)