[pypy-commit] pypy default: (cfbolz, smarr): optimize int_sub_ovf(x, x) to 0
Stefan Marr
noreply at buildbot.pypy.org
Wed May 21 12:39:46 CEST 2014
Author: Stefan Marr <hg at stefan-marr.de>
Branch:
Changeset: r71628:919ab79173d3
Date: 2014-05-21 11:33 +0100
http://bitbucket.org/pypy/pypy/changeset/919ab79173d3/
Log: (cfbolz, smarr): optimize int_sub_ovf(x, x) to 0
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -198,11 +198,11 @@
opnum = lastop.getopnum()
args = lastop.getarglist()
result = lastop.result
- # If the INT_xxx_OVF was replaced with INT_xxx, then we can kill
- # the GUARD_NO_OVERFLOW.
- if (opnum == rop.INT_ADD or
- opnum == rop.INT_SUB or
- opnum == rop.INT_MUL):
+ # If the INT_xxx_OVF was replaced with INT_xxx or removed
+ # completely, then we can kill the GUARD_NO_OVERFLOW.
+ if (opnum != rop.INT_ADD_OVF and
+ opnum != rop.INT_SUB_OVF and
+ opnum != rop.INT_MUL_OVF):
return
# Else, synthesize the non overflowing op for optimize_default to
# reuse, as well as the reverse op
@@ -248,6 +248,9 @@
def optimize_INT_SUB_OVF(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
+ if v1 is v2:
+ self.make_constant_int(op.result, 0)
+ return
resbound = v1.intbound.sub_bound(v2.intbound)
if resbound.bounded():
op = op.copy_and_change(rop.INT_SUB)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -3339,6 +3339,21 @@
"""
self.optimize_loop(ops, expected)
+ def test_fold_int_sub_ovf_xx(self):
+ ops = """
+ [i0]
+ i1 = int_sub_ovf(i0, i0)
+ guard_no_overflow() []
+ escape(i1)
+ jump(i1)
+ """
+ expected = """
+ []
+ escape(0)
+ jump()
+ """
+ self.optimize_loop(ops, expected)
+
def test_fold_partially_constant_shift(self):
ops = """
[i0]
More information about the pypy-commit
mailing list