[pypy-commit] pypy jit-short_from_state: generalize unreasonable intbounds at end of preamble
hakanardo
noreply at buildbot.pypy.org
Wed May 11 08:09:15 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r44067:80bb810b6354
Date: 2011-05-07 10:36 +0200
http://bitbucket.org/pypy/pypy/changeset/80bb810b6354/
Log: generalize unreasonable intbounds at end of preamble
diff --git a/pypy/jit/metainterp/optimizeopt/intutils.py b/pypy/jit/metainterp/optimizeopt/intutils.py
--- a/pypy/jit/metainterp/optimizeopt/intutils.py
+++ b/pypy/jit/metainterp/optimizeopt/intutils.py
@@ -224,7 +224,7 @@
res.has_lower = self.has_lower
res.has_upper = self.has_upper
return res
-
+
class IntUpperBound(IntBound):
def __init__(self, upper):
self.has_upper = True
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -58,14 +58,14 @@
if self.level == LEVEL_NONNULL:
op = ResOperation(rop.GUARD_NONNULL, [box], None)
guards.append(op)
- if self.intbound.has_lower:
+ if self.intbound.has_lower and self.intbound.lower > MININT:
bound = self.intbound.lower
res = BoxInt()
op = ResOperation(rop.INT_GE, [box, ConstInt(bound)], res)
guards.append(op)
op = ResOperation(rop.GUARD_TRUE, [res], None)
guards.append(op)
- if self.intbound.has_upper:
+ if self.intbound.has_upper and self.intbound.upper < MAXINT:
bound = self.intbound.upper
res = BoxInt()
op = ResOperation(rop.INT_LE, [box, ConstInt(bound)], res)
@@ -81,6 +81,10 @@
return self.box
def force_at_end_of_preamble(self, already_forced):
+ if self.intbound.lower < MININT/2:
+ self.intbound.lower = MININT
+ if self.intbound.upper > MAXINT/2:
+ self.intbound.upper = MAXINT
return self
def get_cloned(self, optimizer, valuemap, force_if_needed=True):
diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -2372,7 +2372,22 @@
node1 = A(i)
i += 1
assert self.meta_interp(f, [20, 7]) == f(20, 7)
-
+
+ def test_intbounds_generalized(self):
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa'])
+
+ def f(n):
+ sa = i = 0
+ while i < n:
+ myjitdriver.jit_merge_point(n=n, i=i, sa=sa)
+ if i > n/2:
+ sa += 1
+ else:
+ sa += 2
+ i += 1
+ return sa
+ assert self.meta_interp(f, [20]) == f(20)
+ self.check_loops(int_gt=1, int_lt=2, int_ge=0, int_le=0)
class TestOOtype(BasicTests, OOJitMixin):
More information about the pypy-commit
mailing list