[pypy-svn] pypy jit-short-preamble: move loop invariant *_ovf out of the loops
hakanardo
commits-noreply at bitbucket.org
Fri Jan 21 19:18:06 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short-preamble
Changeset: r41179:4064c4844a16
Date: 2011-01-21 19:17 +0100
http://bitbucket.org/pypy/pypy/changeset/4064c4844a16/
Log: move loop invariant *_ovf out of the loops
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
@@ -3425,7 +3425,6 @@
"""
expected = """
[i0]
- i2 = int_add(i0, 10)
jump(i0)
"""
self.optimize_loop(ops, expected, preamble)
@@ -4224,7 +4223,6 @@
guard_no_overflow() []
i2 = int_gt(i1, 1)
guard_true(i2) []
- i3 = int_sub(1, i0)
jump(i0)
"""
expected = """
@@ -4559,16 +4557,11 @@
guard_true(i4) []
i5 = int_gt(i3, 2)
guard_true(i5) []
- jump(i0, i1, i22)
- """
- expected = """
- [i0, i1, i22]
- i3 = int_mul(i22, i1)
- i4 = int_lt(i3, 10)
- guard_true(i4) []
- i5 = int_gt(i3, 2)
- guard_true(i5) []
- jump(i0, i1, i22)
+ jump(i0, i1)
+ """
+ expected = """
+ [i0, i1]
+ jump(i0, i1)
"""
self.optimize_loop(ops, expected, preamble)
@@ -4597,19 +4590,43 @@
guard_true(i4) []
i5 = int_ge(i3, 2)
guard_true(i5) []
- jump(i0, i1, i2)
- """
- expected = """
- [i0, i1, i2]
- i3 = int_sub(i2, i1)
- i4 = int_le(i3, 10)
- guard_true(i4) []
- i5 = int_ge(i3, 2)
- guard_true(i5) []
- jump(i0, i1, i2)
+ jump(i0, i1)
+ """
+ expected = """
+ [i0, i1]
+ jump(i0, i1)
"""
self.optimize_loop(ops, expected, preamble)
+ def test_invariant_ovf(self):
+ ops = """
+ [i0, i1, i10, i11, i12]
+ i2 = int_add_ovf(i0, i1)
+ guard_no_overflow() []
+ i3 = int_sub_ovf(i0, i1)
+ guard_no_overflow() []
+ i4 = int_mul_ovf(i0, i1)
+ guard_no_overflow() []
+ i24 = int_mul_ovf(i10, i11)
+ guard_no_overflow() []
+ i23 = int_sub_ovf(i10, i11)
+ guard_no_overflow() []
+ i22 = int_add_ovf(i10, i11)
+ guard_no_overflow() []
+ jump(i0, i1, i2, i3, i4)
+ """
+ expected = """
+ [i0, i1, i10, i11, i12]
+ i24 = int_mul_ovf(i10, i11)
+ guard_no_overflow() []
+ i23 = int_sub_ovf(i10, i11)
+ guard_no_overflow() []
+ i22 = int_add_ovf(i10, i11)
+ guard_no_overflow() []
+ jump(i0, i1, i10, i11, i12)
+ """
+ self.optimize_loop(ops, expected, ops)
+
def test_value_proven_to_be_constant_after_two_iterations(self):
class FakeDescr(AbstractDescr):
def __init__(self, name):
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
@@ -150,6 +150,10 @@
r = self.getvalue(op.result)
r.intbound.intersect(resbound)
self.emit_operation(self.nextop)
+ if self.nextop.getopnum() == rop.GUARD_NO_OVERFLOW:
+ # Synthesize the non overflowing op for optimize_default to reuse
+ self.pure(rop.INT_ADD, op.getarglist()[:], op.result)
+
def optimize_INT_SUB_OVF(self, op):
v1 = self.getvalue(op.getarg(0))
@@ -165,6 +169,9 @@
r = self.getvalue(op.result)
r.intbound.intersect(resbound)
self.emit_operation(self.nextop)
+ if self.nextop.getopnum() == rop.GUARD_NO_OVERFLOW:
+ # Synthesize the non overflowing op for optimize_default to reuse
+ self.pure(rop.INT_SUB, op.getarglist()[:], op.result)
def optimize_INT_MUL_OVF(self, op):
v1 = self.getvalue(op.getarg(0))
@@ -180,6 +187,10 @@
r = self.getvalue(op.result)
r.intbound.intersect(resbound)
self.emit_operation(self.nextop)
+ if self.nextop.getopnum() == rop.GUARD_NO_OVERFLOW:
+ # Synthesize the non overflowing op for optimize_default to reuse
+ self.pure(rop.INT_MUL, op.getarglist()[:], op.result)
+
def optimize_INT_LT(self, op):
v1 = self.getvalue(op.getarg(0))
diff --git a/pypy/jit/metainterp/test/test_optimizebasic.py b/pypy/jit/metainterp/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/test/test_optimizebasic.py
@@ -3708,7 +3708,6 @@
guard_no_overflow() []
i2 = int_gt(i1, 1)
guard_true(i2) []
- i3 = int_sub(1, i0)
jump(i0)
"""
self.optimize_loop(ops, expected)
More information about the Pypy-commit
mailing list