@@ -917,25 +917,46 @@ module RangeStage<
917917 bounded ( cast .getOperand ( ) , b , delta , upper , fromBackEdge , origdelta , reason )
918918 }
919919
920+ pragma [ nomagic]
921+ private predicate initialBoundedUpper ( SemExpr e ) {
922+ exists ( D:: Delta d |
923+ initialBounded ( e , _, d , false , _, _, _) and
924+ D:: toFloat ( d ) >= 0
925+ )
926+ }
927+
928+ private predicate noOverflow0 ( SemExpr e , boolean upper ) {
929+ exists ( boolean lower | lower = upper .booleanNot ( ) |
930+ semExprDoesNotOverflow ( lower , e )
931+ or
932+ upper = [ true , false ] and
933+ not potentiallyOverflowingExpr ( lower , e )
934+ )
935+ }
936+
937+ pragma [ nomagic]
938+ private predicate initialBoundedLower ( SemExpr e ) {
939+ exists ( D:: Delta d |
940+ initialBounded ( e , _, d , true , _, _, _) and
941+ D:: toFloat ( d ) <= 0
942+ )
943+ }
944+
945+ pragma [ nomagic]
946+ private predicate noOverflow ( SemExpr e , boolean upper ) {
947+ noOverflow0 ( e , upper )
948+ or
949+ upper = true and initialBoundedUpper ( e )
950+ or
951+ upper = false and initialBoundedLower ( e )
952+ }
953+
920954 predicate bounded (
921955 SemExpr e , SemBound b , D:: Delta delta , boolean upper , boolean fromBackEdge , D:: Delta origdelta ,
922956 SemReason reason
923957 ) {
924958 initialBounded ( e , b , delta , upper , fromBackEdge , origdelta , reason ) and
925- (
926- semExprDoesNotOverflow ( upper .booleanNot ( ) , e )
927- or
928- not potentiallyOverflowingExpr ( upper .booleanNot ( ) , e )
929- or
930- exists ( D:: Delta otherDelta |
931- initialBounded ( e , _, otherDelta , upper .booleanNot ( ) , _, _, _) and
932- (
933- upper = true and D:: toFloat ( otherDelta ) >= 0
934- or
935- upper = false and D:: toFloat ( otherDelta ) <= 0
936- )
937- )
938- )
959+ noOverflow ( e , upper )
939960 }
940961
941962 predicate potentiallyOverflowingExpr ( boolean positively , SemExpr expr ) {
0 commit comments