Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de> Branch: intbound-improvements Changeset: r93253:3dd506aecf8a Date: 2017-12-03 18:33 +0100 http://bitbucket.org/pypy/pypy/changeset/3dd506aecf8a/
Log: refactor the .make_??( methods to include versions that take constants as arguments (as opposed to bounds), make those versions the primitives diff --git a/rpython/jit/metainterp/optimizeopt/intutils.py b/rpython/jit/metainterp/optimizeopt/intutils.py --- a/rpython/jit/metainterp/optimizeopt/intutils.py +++ b/rpython/jit/metainterp/optimizeopt/intutils.py @@ -49,28 +49,51 @@ # Returns True if the bound was updated def make_le(self, other): if other.has_upper: - if not self.has_upper or other.upper < self.upper: - self.has_upper = True - self.upper = other.upper - return True + self.make_le_const(other.upper) return False def make_lt(self, other): - return self.make_le(other.add(-1)) + if other.has_upper: + return self.make_lt_const(other.upper) + return False def make_ge(self, other): if other.has_lower: - if not self.has_lower or other.lower > self.lower: - self.has_lower = True - self.lower = other.lower - return True + return self.make_ge_const(other.lower) return False + def make_gt(self, other): + if other.has_lower: + return self.make_gt_const(other.lower) + return False + + def make_le_const(self, other): + if not self.has_upper or other < self.upper: + self.has_upper = True + self.upper = other + return True + return False + + def make_lt_const(self, other): + try: + other = ovfcheck(other - 1) + except OverflowError: + return False + return self.make_le_const(other) + def make_ge_const(self, other): - return self.make_ge(ConstIntBound(other)) + if not self.has_lower or other > self.lower: + self.has_lower = True + self.lower = other + return True + return False def make_gt_const(self, other): - return self.make_gt(ConstIntBound(other)) + try: + other = ovfcheck(other + 1) + except OverflowError: + return False + return self.make_ge_const(other) def make_eq_const(self, intval): self.has_upper = True @@ -78,9 +101,6 @@ self.upper = intval self.lower = intval - def make_gt(self, other): - return self.make_ge(other.add(1)) - def is_constant(self): return self.has_upper and self.has_lower and self.lower == self.upper @@ -221,21 +241,21 @@ return r # nothing known about other if other.known_nonnegative(): # with Python's modulo: 0 <= (x % pos) < pos - r.make_ge(IntBound(0, 0)) + r.make_ge_const(0) if other.has_upper: - r.make_lt(IntBound(other.upper, other.upper)) + r.make_lt_const(other.upper) elif other.has_upper and other.upper <= 0: # with Python's modulo: neg < (x % neg) <= 0 - r.make_le(IntBound(0, 0)) + r.make_le_const(0) if other.has_lower: - r.make_gt(IntBound(other.lower, other.lower)) + r.make_gt_const(other.lower) else: # the interval straddles 0, so we know this: # other.lower < x % other < other.upper if other.has_upper: - r.make_lt(IntBound(other.upper, other.upper)) + r.make_lt_const(other.upper) if other.has_lower: - r.make_gt(IntBound(other.lower, other.lower)) + r.make_gt_const(other.lower) pass return r @@ -273,7 +293,7 @@ pos2 = other.known_nonnegative() r = IntUnbounded() if pos1 or pos2: - r.make_ge(IntBound(0, 0)) + r.make_ge_const(0) if pos1: r.make_le(self) if pos2: @@ -284,14 +304,14 @@ r = IntUnbounded() if self.known_nonnegative() and \ other.known_nonnegative(): - r.make_ge(IntBound(0, 0)) + r.make_ge_const(0) if self.has_upper and other.has_upper: r.intersect(IntBound(0, upper_bound_or_xor(self.upper, other.upper))) if self.has_lower and other.has_lower: # max of the two lower bounds gives an ok (but not tight) lower # bound of or lower = max(self.lower, other.lower) - r.make_ge(IntBound(lower, lower)) + r.make_ge_const(lower) return r def xor_bound(self, other): @@ -301,7 +321,7 @@ if self.has_upper and other.has_upper: r.intersect(IntBound(0, upper_bound_or_xor(self.upper, other.upper))) else: - r.make_ge(IntBound(0, 0)) + r.make_ge_const(0) return r diff --git a/rpython/jit/metainterp/optimizeopt/test/test_intbound.py b/rpython/jit/metainterp/optimizeopt/test/test_intbound.py --- a/rpython/jit/metainterp/optimizeopt/test/test_intbound.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_intbound.py @@ -130,7 +130,7 @@ assert b.known_lt(c) -def test_make(): +def test_make(): for _, _, b1 in some_bounds(): for _, _, b2 in some_bounds(): lt = IntUnbounded() @@ -169,7 +169,7 @@ assert not le.known_gt(c) assert not le.known_ge(c) - + ge = IntUnbounded() ge.make_ge(b1) ge.make_ge(b2) @@ -192,13 +192,13 @@ else: assert not gl.known_ge(c) assert not gl.known_gt(c) - if b2.known_le(c): + if b2.known_le(c): assert gl.known_le(c) else: assert not gl.known_le(c) assert not gl.known_lt(c) -def test_intersect(): +def test_intersect(): for _, _, b1 in some_bounds(): for _, _, b2 in some_bounds(): b = copy(b1) @@ -208,7 +208,7 @@ assert b.contains(n) else: assert not b.contains(n) - + def test_add(): for _, _, b1 in some_bounds(): for n1 in nbr: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit