[pypy-commit] pypy default: allow reverse int_add_ovf and int_sub_ovf to be optimized out in the same was as reverse int_add and int_sub ar optimzed out
hakanardo
noreply at buildbot.pypy.org
Sun May 22 10:10:52 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch:
Changeset: r44362:a3500887b9ec
Date: 2011-05-22 10:15 +0200
http://bitbucket.org/pypy/pypy/changeset/a3500887b9ec/
Log: allow reverse int_add_ovf and int_sub_ovf to be optimized out in the
same was as reverse int_add and int_sub ar optimzed out
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
@@ -161,6 +161,9 @@
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)
+ # Synthesize the reverse op for optimize_default to reuse
+ self.pure(rop.INT_SUB, [op.result, op.getarg(1)], op.getarg(0))
+ self.pure(rop.INT_SUB, [op.result, op.getarg(0)], op.getarg(1))
def optimize_INT_SUB_OVF(self, op):
@@ -180,6 +183,10 @@
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)
+ # Synthesize the reverse ops for optimize_default to reuse
+ self.pure(rop.INT_ADD, [op.result, op.getarg(1)], op.getarg(0))
+ self.pure(rop.INT_SUB, [op.getarg(0), op.result], op.getarg(1))
+
def optimize_INT_MUL_OVF(self, op):
v1 = self.getvalue(op.getarg(0))
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
@@ -3899,6 +3899,50 @@
jump(i4, i10)
"""
self.optimize_loop(ops, expected)
+
+ def test_add_sub_ovf(self):
+ ops = """
+ [i1]
+ i2 = int_add_ovf(i1, 1)
+ guard_no_overflow() []
+ i3 = int_sub_ovf(i2, 1)
+ guard_no_overflow() []
+ escape(i3)
+ jump(i2)
+ """
+ expected = """
+ [i1]
+ i2 = int_add_ovf(i1, 1)
+ guard_no_overflow() []
+ escape(i1)
+ jump(i2)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_add_sub_ovf_virtual_unroll(self):
+ ops = """
+ [p15]
+ i886 = getfield_gc_pure(p15, descr=valuedescr)
+ i888 = int_sub_ovf(i886, 1)
+ guard_no_overflow() []
+ escape(i888)
+ i4360 = getfield_gc_pure(p15, descr=valuedescr)
+ i4362 = int_add_ovf(i4360, 1)
+ guard_no_overflow() []
+ i4360p = int_sub_ovf(i4362, 1)
+ guard_no_overflow() []
+ p4364 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p4364, i4362, descr=valuedescr)
+ jump(p4364)
+ """
+ expected = """
+ [i0, i1]
+ escape(i1)
+ i2 = int_add_ovf(i0, 1)
+ guard_no_overflow() []
+ jump(i2, i0)
+ """
+ self.optimize_loop(ops, expected)
def test_framestackdepth_overhead(self):
ops = """
More information about the pypy-commit
mailing list