@@ -917,25 +917,46 @@ module RangeStage<
917
917
bounded ( cast .getOperand ( ) , b , delta , upper , fromBackEdge , origdelta , reason )
918
918
}
919
919
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
+
920
954
predicate bounded (
921
955
SemExpr e , SemBound b , D:: Delta delta , boolean upper , boolean fromBackEdge , D:: Delta origdelta ,
922
956
SemReason reason
923
957
) {
924
958
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 )
939
960
}
940
961
941
962
predicate potentiallyOverflowingExpr ( boolean positively , SemExpr expr ) {
0 commit comments