Skip to content

Commit 5a108e8

Browse files
authored
JIT: Improve VN for (EQ/NE (RELOP ...), 0/1) (#60943)
Try and re-express these VNs in terms of the RELOP or its complement.
1 parent 8dfaac9 commit 5a108e8

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

src/coreclr/jit/valuenum.cpp

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3567,6 +3567,38 @@ ValueNum ValueNumStore::EvalUsingMathIdentity(var_types typ, VNFunc func, ValueN
35673567
resultVN = VNZeroForType(typ);
35683568
break;
35693569
}
3570+
// (relop == 0) == !relop
3571+
ZeroVN = VNZeroForType(typ);
3572+
if (IsVNRelop(arg0VN) && (arg1VN == ZeroVN))
3573+
{
3574+
ValueNum rev0VN = GetRelatedRelop(arg0VN, VN_RELATION_KIND::VRK_Reverse);
3575+
if (rev0VN != NoVN)
3576+
{
3577+
resultVN = rev0VN;
3578+
break;
3579+
}
3580+
}
3581+
else if (IsVNRelop(arg1VN) && (arg0VN == ZeroVN))
3582+
{
3583+
ValueNum rev1VN = GetRelatedRelop(arg1VN, VN_RELATION_KIND::VRK_Reverse);
3584+
if (rev1VN != NoVN)
3585+
{
3586+
resultVN = rev1VN;
3587+
break;
3588+
}
3589+
}
3590+
// (relop == 1) == relop
3591+
OneVN = VNOneForType(typ);
3592+
if (IsVNRelop(arg0VN) && (arg1VN == OneVN))
3593+
{
3594+
resultVN = arg0VN;
3595+
break;
3596+
}
3597+
else if (IsVNRelop(arg1VN) && (arg0VN == OneVN))
3598+
{
3599+
resultVN = arg1VN;
3600+
break;
3601+
}
35703602
// (x == x) == true (integer only)
35713603
FALLTHROUGH;
35723604
case GT_GE:
@@ -3586,11 +3618,45 @@ ValueNum ValueNumStore::EvalUsingMathIdentity(var_types typ, VNFunc func, ValueN
35863618
((arg1VN == VNForNull()) && IsKnownNonNull(arg0VN)))
35873619
{
35883620
resultVN = VNOneForType(typ);
3621+
break;
35893622
}
35903623
// (x != x) == false (integer only)
35913624
else if ((arg0VN == arg1VN) && varTypeIsIntegralOrI(TypeOfVN(arg0VN)))
35923625
{
35933626
resultVN = VNZeroForType(typ);
3627+
break;
3628+
}
3629+
// (relop != 0) == relop
3630+
ZeroVN = VNZeroForType(typ);
3631+
if (IsVNRelop(arg0VN) && (arg1VN == ZeroVN))
3632+
{
3633+
resultVN = arg0VN;
3634+
break;
3635+
}
3636+
else if (IsVNRelop(arg1VN) && (arg0VN == ZeroVN))
3637+
{
3638+
resultVN = arg1VN;
3639+
break;
3640+
}
3641+
// (relop != 1) == !relop
3642+
OneVN = VNOneForType(typ);
3643+
if (IsVNRelop(arg0VN) && (arg1VN == OneVN))
3644+
{
3645+
ValueNum rev0VN = GetRelatedRelop(arg0VN, VN_RELATION_KIND::VRK_Reverse);
3646+
if (rev0VN != NoVN)
3647+
{
3648+
resultVN = rev0VN;
3649+
break;
3650+
}
3651+
}
3652+
else if (IsVNRelop(arg1VN) && (arg0VN == OneVN))
3653+
{
3654+
ValueNum rev1VN = GetRelatedRelop(arg1VN, VN_RELATION_KIND::VRK_Reverse);
3655+
if (rev1VN != NoVN)
3656+
{
3657+
resultVN = rev1VN;
3658+
break;
3659+
}
35943660
}
35953661
break;
35963662

@@ -4605,6 +4671,41 @@ ValueNum ValueNumStore::GetRelatedRelop(ValueNum vn, VN_RELATION_KIND vrk)
46054671
return result;
46064672
}
46074673

4674+
bool ValueNumStore::IsVNRelop(ValueNum vn)
4675+
{
4676+
VNFuncApp funcAttr;
4677+
if (!GetVNFunc(vn, &funcAttr))
4678+
{
4679+
return false;
4680+
}
4681+
4682+
if (funcAttr.m_arity != 2)
4683+
{
4684+
return false;
4685+
}
4686+
4687+
const VNFunc func = funcAttr.m_func;
4688+
4689+
if (func >= VNF_Boundary)
4690+
{
4691+
switch (func)
4692+
{
4693+
case VNF_LT_UN:
4694+
case VNF_LE_UN:
4695+
case VNF_GE_UN:
4696+
case VNF_GT_UN:
4697+
return true;
4698+
default:
4699+
return false;
4700+
}
4701+
}
4702+
else
4703+
{
4704+
const genTreeOps op = (genTreeOps)func;
4705+
return GenTree::OperIsRelop(op);
4706+
}
4707+
}
4708+
46084709
bool ValueNumStore::IsVNConstantBound(ValueNum vn)
46094710
{
46104711
// Do we have "var < 100"?

src/coreclr/jit/valuenum.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,9 @@ class ValueNumStore
842842
// Returns true iff the VN represents a handle constant.
843843
bool IsVNHandle(ValueNum vn);
844844

845+
// Returns true iff the VN represents a relop
846+
bool IsVNRelop(ValueNum vn);
847+
845848
// Given VN(x > y), return VN(y > x), VN(x <= y) or VN(y >= x)
846849
//
847850
// If vn is not a relop, return NoVN.

0 commit comments

Comments
 (0)