[pypy-svn] pypy jit-unroll-loops: Propagate intbound through floordiv in a simple case
hakanardo
commits-noreply at bitbucket.org
Wed Jan 5 07:53:31 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-unroll-loops
Changeset: r40404:0fa252de28e0
Date: 2011-01-05 07:48 +0100
http://bitbucket.org/pypy/pypy/changeset/0fa252de28e0/
Log: Propagate intbound through floordiv in a simple case
diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py b/pypy/jit/metainterp/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/test/test_optimizeopt.py
@@ -3910,6 +3910,45 @@
"""
self.optimize_loop(ops, expected, preamble)
+ def test_bound_floordiv(self):
+ ops = """
+ [i0, i1, i2]
+ it1 = int_ge(i1, 0)
+ guard_true(it1) []
+ it2 = int_gt(i2, 0)
+ guard_true(it2) []
+ ix2 = int_floordiv(i0, i1)
+ ix2t = int_ge(ix2, 0)
+ guard_true(ix2t) []
+ ix3 = int_floordiv(i1, i0)
+ ix3t = int_ge(ix3, 0)
+ guard_true(ix3t) []
+ ix4 = int_floordiv(i1, i2)
+ ix4t = int_ge(ix4, 0)
+ guard_true(ix4t) []
+ jump(i0, i1, i2)
+ """
+ preamble = """
+ [i0, i1, i2]
+ it1 = int_ge(i1, 0)
+ guard_true(it1) []
+ it2 = int_gt(i2, 0)
+ guard_true(it2) []
+ ix2 = int_floordiv(i0, i1)
+ ix2t = int_ge(ix2, 0)
+ guard_true(ix2t) []
+ ix3 = int_floordiv(i1, i0)
+ ix3t = int_ge(ix3, 0)
+ guard_true(ix3t) []
+ ix4 = int_floordiv(i1, i2)
+ jump(i0, i1, i2)
+ """
+ expected = """
+ [i0, i1, i2]
+ jump(i0, i1, i2)
+ """
+ self.optimize_loop(ops, expected, preamble)
+
def test_bound_int_is_zero(self):
ops = """
[i1, i2a, i2b, i2c]
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -110,6 +110,15 @@
r = self.getvalue(op.result)
r.intbound.intersect(v1.intbound.mul_bound(v2.intbound))
+ def optimize_INT_FLOORDIV(self, op):
+ v1 = self.getvalue(op.getarg(0))
+ v2 = self.getvalue(op.getarg(1))
+ self.emit_operation(op)
+ if v1.intbound.known_ge(IntBound(0, 0)) and \
+ v2.intbound.known_ge(IntBound(0, 0)):
+ r = self.getvalue(op.result)
+ r.intbound.make_ge(IntLowerBound(0))
+
def optimize_INT_ADD_OVF(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
More information about the Pypy-commit
mailing list