[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