[pypy-commit] pypy release-pypy2.7-5.x: Issue #2528: test and fix for int_and() propagating wrong bounds

arigo pypy.commits at gmail.com
Wed Apr 5 06:41:45 EDT 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: release-pypy2.7-5.x
Changeset: r90961:e0ad22c8f2c8
Date: 2017-04-04 20:37 +0200
http://bitbucket.org/pypy/pypy/changeset/e0ad22c8f2c8/

Log:	Issue #2528: test and fix for int_and() propagating wrong bounds
	(grafted from 42ab42428685f84d22e980313ba1f4a1b357cafc)

diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -104,14 +104,14 @@
             return
         elif b2.is_constant():
             val = b2.lower
-            if val == -1 or b1.lower >= 0 \
-                and b1.upper <= val & ~(val + 1):
+            if val == -1 or (b1.bounded() and b1.lower >= 0
+                                          and b1.upper <= val & ~(val + 1)):
                 self.make_equal_to(op, op.getarg(0))
                 return
         elif b1.is_constant():
             val = b1.lower
-            if val == -1 or b2.lower >= 0 \
-                and b2.upper <= val & ~(val + 1):
+            if val == -1 or (b2.bounded() and b2.lower >= 0
+                                          and b2.upper <= val & ~(val + 1)):
                 self.make_equal_to(op, op.getarg(1))
                 return
 
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5623,6 +5623,26 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_bug_int_and_1(self):
+        ops = """
+        [p0]
+        i51 = arraylen_gc(p0, descr=arraydescr)
+        i57 = int_and(i51, 1)
+        i62 = int_eq(i57, 0)
+        guard_false(i62) []
+        """
+        self.optimize_loop(ops, ops)
+
+    def test_bug_int_and_2(self):
+        ops = """
+        [p0]
+        i51 = arraylen_gc(p0, descr=arraydescr)
+        i57 = int_and(4, i51)
+        i62 = int_eq(i57, 0)
+        guard_false(i62) []
+        """
+        self.optimize_loop(ops, ops)
+
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass


More information about the pypy-commit mailing list