@@ -3567,6 +3567,38 @@ ValueNum ValueNumStore::EvalUsingMathIdentity(var_types typ, VNFunc func, ValueN
3567
3567
resultVN = VNZeroForType (typ);
3568
3568
break ;
3569
3569
}
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
+ }
3570
3602
// (x == x) == true (integer only)
3571
3603
FALLTHROUGH;
3572
3604
case GT_GE:
@@ -3586,11 +3618,45 @@ ValueNum ValueNumStore::EvalUsingMathIdentity(var_types typ, VNFunc func, ValueN
3586
3618
((arg1VN == VNForNull ()) && IsKnownNonNull (arg0VN)))
3587
3619
{
3588
3620
resultVN = VNOneForType (typ);
3621
+ break ;
3589
3622
}
3590
3623
// (x != x) == false (integer only)
3591
3624
else if ((arg0VN == arg1VN) && varTypeIsIntegralOrI (TypeOfVN (arg0VN)))
3592
3625
{
3593
3626
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
+ }
3594
3660
}
3595
3661
break ;
3596
3662
@@ -4605,6 +4671,41 @@ ValueNum ValueNumStore::GetRelatedRelop(ValueNum vn, VN_RELATION_KIND vrk)
4605
4671
return result;
4606
4672
}
4607
4673
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
+
4608
4709
bool ValueNumStore::IsVNConstantBound (ValueNum vn)
4609
4710
{
4610
4711
// Do we have "var < 100"?
0 commit comments