@@ -595,14 +595,23 @@ class LeapYearGuardCondition extends GuardCondition {
595595 |
596596 // Cannonical case:
597597 // form: `(year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)`
598- // or : `!(year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)`
598+ // or : `!((year % 4 == 0) && (year % 100 != 0 || year % 400 == 0))`
599+ // Also accepting `(year & 3 == 0) && (year % 100 != 0 || year % 400 == 0)`
599600 this = andExpr and
600601 andExpr .hasOperands ( div4Check , orExpr ) and
601602 orExpr .hasOperands ( div100Check , div400Check ) and
602- exists ( RemExpr e |
603- div4Check .comparesEq ( e , 0 , true , gv ) and
604- e .getRightOperand ( ) .getValue ( ) .toInt ( ) = 4 and
605- yearSinkDiv4 = e .getLeftOperand ( )
603+ (
604+ exists ( RemExpr e |
605+ div4Check .comparesEq ( e , 0 , true , gv ) and
606+ e .getRightOperand ( ) .getValue ( ) .toInt ( ) = 4 and
607+ yearSinkDiv4 = e .getLeftOperand ( )
608+ )
609+ or
610+ exists ( BitwiseAndExpr e |
611+ div4Check .comparesEq ( e , 0 , true , gv ) and
612+ e .getRightOperand ( ) .getValue ( ) .toInt ( ) = 3 and
613+ yearSinkDiv4 = e .getLeftOperand ( )
614+ )
606615 ) and
607616 exists ( RemExpr e |
608617 div100Check .comparesEq ( e , 0 , false , gv ) and
@@ -616,14 +625,23 @@ class LeapYearGuardCondition extends GuardCondition {
616625 )
617626 or
618627 // Inverted logic case:
619- // `year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)`
628+ // `year % 4 != 0 || (year % 100 == 0 && year % 400 != 0)`
629+ // or `year & 3 != 0 || (year % 100 == 0 && year % 400 != 0)`
620630 this = orExpr and
621631 orExpr .hasOperands ( div4Check , andExpr ) and
622632 andExpr .hasOperands ( div100Check , div400Check ) and
623- exists ( RemExpr e |
624- div4Check .comparesEq ( e , 0 , false , gv ) and
625- e .getRightOperand ( ) .getValue ( ) .toInt ( ) = 4 and
626- yearSinkDiv4 = e .getLeftOperand ( )
633+ (
634+ exists ( RemExpr e |
635+ div4Check .comparesEq ( e , 0 , false , gv ) and
636+ e .getRightOperand ( ) .getValue ( ) .toInt ( ) = 4 and
637+ yearSinkDiv4 = e .getLeftOperand ( )
638+ )
639+ or
640+ exists ( BitwiseAndExpr e |
641+ div4Check .comparesEq ( e , 0 , false , gv ) and
642+ e .getRightOperand ( ) .getValue ( ) .toInt ( ) = 3 and
643+ yearSinkDiv4 = e .getLeftOperand ( )
644+ )
627645 ) and
628646 exists ( RemExpr e |
629647 div100Check .comparesEq ( e , 0 , true , gv ) and
0 commit comments