[pypy-commit] pypy fold-arith-ops: when folding int_add's, handle overflow correctly
Berkin Ilbeyi
noreply at buildbot.pypy.org
Thu May 21 19:12:49 CEST 2015
Author: Berkin Ilbeyi <berkin at 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]
More information about the pypy-commit
mailing list