[pypy-svn] r76611 - in pypy/branch/jit-bounds/pypy/jit/metainterp: . test

hakanardo at codespeak.net hakanardo at codespeak.net
Thu Aug 12 19:32:50 CEST 2010


Author: hakanardo
Date: Thu Aug 12 19:32:48 2010
New Revision: 76611

Modified:
   pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt.py
   pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
more tests, int_gt

Modified: pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt.py	Thu Aug 12 19:32:48 2010
@@ -76,7 +76,7 @@
         if val is None: return
         self.maxint = val - 1
 
-    def bountint_le(self, val):
+    def boundint_le(self, val):
         if val is None: return
         self.maxint = val
         
@@ -84,7 +84,7 @@
         if val is None: return
         self.minint = val + 1
 
-    def bountint_ge(self, val):
+    def boundint_ge(self, val):
         if val is None: return
         self.minint = val
 
@@ -1142,18 +1142,13 @@
     def optimize_INT_GT(self, op):
         v1 = self.getvalue(op.args[0])
         v2 = self.getvalue(op.args[1])
-        min1 = v1.get_minint()
-        max1 = v1.get_maxint()
-        min2 = v2.get_minint()
-        max2 = v1.get_maxint()
-        if min1 is not None and min2 is not None and max2 < min1
+        if v1.known_gt(v2):
             self.make_constant_int(op.result, 1)
-        elif min1 is not None and max2 is not None and max2 <= min1:
+        elif v1.known_le(v2):
             self.make_constant_int(op.result, 0)
         else:
             self.optimize_default(op)
-        
-        
+
     def propagate_bounds_INT_LT(self, op):
         v1 = self.getvalue(op.args[0])
         v2 = self.getvalue(op.args[1])
@@ -1170,6 +1165,22 @@
             self.propagate_bounds_backward(op.args[0])
             self.propagate_bounds_backward(op.args[1])
 
+    def propagate_bounds_INT_GT(self, op):
+        v1 = self.getvalue(op.args[0])
+        v2 = self.getvalue(op.args[1])
+        r = self.getvalue(op.result)
+        if r.is_constant():
+            if r.box.same_constant(CONST_1):
+                v2.boundint_lt(v1.get_maxint())
+                v1.boundint_gt(v2.get_minint())
+            elif r.box.same_constant(CONST_0):
+                v2.boundint_ge(v1.get_minint())
+                v1.boundint_le(v2.get_maxint())
+            else:
+                assert False, "Boolean neither True nor False"
+            self.propagate_bounds_backward(op.args[0])
+            self.propagate_bounds_backward(op.args[1])
+
 
 optimize_ops = _findall(Optimizer, 'optimize_')
 propagate_bounds_ops = _findall(Optimizer, 'propagate_bounds_')

Modified: pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_optimizeopt.py	Thu Aug 12 19:32:48 2010
@@ -3044,7 +3044,7 @@
         '''
         self.optimize_loop(ops, 'Not', expected)
 
-    def test_upperbound(self):
+    def test_bound_lt(self):
         ops = """
         [i0]
         i1 = int_lt(i0, 4)
@@ -3061,6 +3061,74 @@
         """
         self.optimize_loop(ops, 'Not', expected)
         
+    def test_bound_lt_noguard(self):
+        ops = """
+        [i0]
+        i1 = int_lt(i0, 4)
+        i2 = int_lt(i0, 5)
+        jump(i2)
+        """
+        expected = """
+        [i0]
+        i1 = int_lt(i0, 4)
+        i2 = int_lt(i0, 5)
+        jump(i2)
+        """
+        self.optimize_loop(ops, 'Not', expected)
+        
+    def test_bound_lt_noopt(self):
+        ops = """
+        [i0]
+        i1 = int_lt(i0, 4)
+        guard_false(i1) []
+        i2 = int_lt(i0, 5)
+        guard_true(i2) []
+        jump(i0)
+        """
+        expected = """
+        [i0]
+        i1 = int_lt(i0, 4)
+        guard_false(i1) []
+        i2 = int_lt(i0, 5)
+        guard_true(i2) []
+        jump(i0)
+        """
+        self.optimize_loop(ops, 'Not', expected)
+        
+    def test_bound_lt_rev(self):
+        ops = """
+        [i0]
+        i1 = int_lt(i0, 4)
+        guard_false(i1) []
+        i2 = int_gt(i0, 3)
+        guard_true(i2) []
+        jump(i0)
+        """
+        expected = """
+        [i0]
+        i1 = int_lt(i0, 4)
+        guard_false(i1) []
+        jump(i0)
+        """
+        self.optimize_loop(ops, 'Not', expected)
+        
+    def test_bound_gt(self):
+        ops = """
+        [i0]
+        i1 = int_gt(i0, 5)
+        guard_true(i1) []
+        i2 = int_gt(i0, 4)
+        guard_true(i2) []
+        jump(i0)
+        """
+        expected = """
+        [i0]
+        i1 = int_gt(i0, 5)
+        guard_true(i1) []
+        jump(i0)
+        """
+        self.optimize_loop(ops, 'Not', expected)
+        
         
     
 



More information about the Pypy-commit mailing list