Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r90951:e691a4f66264
Date: 2017-04-04 20:47 +0200
http://bitbucket.org/pypy/pypy/changeset/e691a4f66264/

Log:    Another case where we read .upper without checking .has_upper

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
@@ -94,8 +94,11 @@
         if b1.known_ge(IntBound(0, 0)) and \
            b2.known_ge(IntBound(0, 0)):
             r = self.getintbound(op)
-            mostsignificant = b1.upper | b2.upper
-            r.intersect(IntBound(0, next_pow2_m1(mostsignificant)))
+            if b1.has_upper and b2.has_upper:
+                mostsignificant = b1.upper | b2.upper
+                r.intersect(IntBound(0, next_pow2_m1(mostsignificant)))
+            else:
+                r.make_ge(IntBound(0, 0))
 
     optimize_INT_OR = optimize_INT_OR_or_XOR
     optimize_INT_XOR = optimize_INT_OR_or_XOR
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
@@ -5643,6 +5643,51 @@
         """
         self.optimize_loop(ops, ops)
 
+    def test_bug_int_or(self):
+        ops = """
+        [p0, p1]
+        i51 = arraylen_gc(p0, descr=arraydescr)
+        i52 = arraylen_gc(p1, descr=arraydescr)
+        i57 = int_or(i51, i52)
+        i62 = int_eq(i57, 0)
+        guard_false(i62) []
+        """
+        self.optimize_loop(ops, ops)
+
+    def test_int_and_positive(self):
+        ops = """
+        [p0, p1]
+        i51 = arraylen_gc(p0, descr=arraydescr)
+        i52 = arraylen_gc(p1, descr=arraydescr)
+        i57 = int_and(i51, i52)
+        i62 = int_lt(i57, 0)
+        guard_false(i62) []
+        """
+        expected = """
+        [p0, p1]
+        i51 = arraylen_gc(p0, descr=arraydescr)
+        i52 = arraylen_gc(p1, descr=arraydescr)
+        i57 = int_and(i51, i52)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_int_or_positive(self):
+        ops = """
+        [p0, p1]
+        i51 = arraylen_gc(p0, descr=arraydescr)
+        i52 = arraylen_gc(p1, descr=arraydescr)
+        i57 = int_or(i51, i52)
+        i62 = int_lt(i57, 0)
+        guard_false(i62) []
+        """
+        expected = """
+        [p0, p1]
+        i51 = arraylen_gc(p0, descr=arraydescr)
+        i52 = arraylen_gc(p1, descr=arraydescr)
+        i57 = int_or(i51, i52)
+        """
+        self.optimize_loop(ops, expected)
+
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to