Author: Berkin Ilbeyi <ber...@csl.cornell.edu> Branch: fold-arith-ops Changeset: r77455:a93f68dfd0bc Date: 2015-05-21 13:10 -0400 http://bitbucket.org/pypy/pypy/changeset/a93f68dfd0bc/
Log: when folding int_add's, handle overflow correctly 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 @@ -8,7 +8,7 @@ from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method from rpython.jit.metainterp.resoperation import rop from rpython.jit.backend.llsupport import symbolic -from rpython.rlib.rarithmetic import is_valid_int +from rpython.rlib.rarithmetic import intmask def get_integer_min(is_unsigned, byte_size): @@ -157,13 +157,10 @@ prod_arg1, prod_arg2 = prod_arg2, prod_arg1 prod_v1, prod_v2 = prod_v2, prod_v1 if prod_v2.is_constant(): - sum = v2.box.getint() + prod_v2.box.getint() - # the sum might not be a valid int if the values - # added are very large - if is_valid_int(sum): - arg1 = prod_arg1 - arg2 = ConstInt(sum) - op = op.copy_and_change(rop.INT_ADD, args=[arg1, arg2]) + sum = intmask(v2.box.getint() + prod_v2.box.getint()) + arg1 = prod_arg1 + arg2 = ConstInt(sum) + op = op.copy_and_change(rop.INT_ADD, args=[arg1, arg2]) self.emit_operation(op) r = self.getvalue(op.result) 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 @@ -3123,6 +3123,25 @@ """ self.optimize_loop(ops, expected) + def test_remove_multiple_add_3(self): + ops = """ + [i0] + i1 = int_add(i0, %s) + i2 = int_add(i1, %s) + i3 = int_add(i0, %s) + i4 = int_add(i3, %s) + jump(i4) + """ % (sys.maxint - 1, sys.maxint - 2, -sys.maxint, -sys.maxint + 1) + expected = """ + [i0] + i1 = int_add(i0, %s) + i2 = int_add(i0, %s) + i3 = int_add(i0, %s) + i4 = int_add(i0, %s) + jump(i4) + """ % (sys.maxint - 1, -5, -sys.maxint, 3) + self.optimize_loop(ops, expected) + def test_remove_duplicate_pure_op(self): ops = """ [p1, p2] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit