[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