@@ -89,7 +89,8 @@ private module RangeAnalysisCache {
8989 */
9090 cached
9191 predicate bounded ( Expr e , Bound b , int delta , boolean upper , Reason reason ) {
92- bounded ( e , b , delta , upper , _, _, reason )
92+ bounded ( e , b , delta , upper , _, _, reason ) and
93+ bestBound ( e , b , delta , upper )
9394 }
9495 }
9596
@@ -105,6 +106,17 @@ private module RangeAnalysisCache {
105106private import RangeAnalysisCache
106107import RangeAnalysisPublic
107108
109+ /**
110+ * Holds if `b + delta` is a valid bound for `e` and this is the best such delta.
111+ * - `upper = true` : `e <= b + delta`
112+ * - `upper = false` : `e >= b + delta`
113+ */
114+ private predicate bestBound ( Expr e , Bound b , int delta , boolean upper ) {
115+ delta = min ( int d | bounded ( e , b , d , upper , _, _, _) ) and upper = true
116+ or
117+ delta = max ( int d | bounded ( e , b , d , upper , _, _, _) ) and upper = false
118+ }
119+
108120/**
109121 * Holds if `comp` corresponds to:
110122 * - `upper = true` : `v <= e + delta` or `v < e + delta`
0 commit comments