[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