Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78908:8505df96400f
Date: 2015-08-11 13:11 +0200
http://bitbucket.org/pypy/pypy/changeset/8505df96400f/

Log:    fix one more test

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -562,10 +562,9 @@
         indexb = self.getintbound(op.getarg(1))
         cf = None
         if indexb.is_constant():
-            # XXXX lgt bound
-            #arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(), 
indexvalue.box.getint())
+            index = indexb.getint()
+            arrayinfo.getlenbound().make_gt_const(index)
             # use the cache on (arraydescr, index), which is a constant
-            index = indexb.getint()
             cf = self.arrayitem_cache(op.getdescr(), index)
             field = cf.getfield_from_cache(self, arrayinfo, op.getdescr())
             if field is not None:
@@ -592,11 +591,11 @@
         indexb = self.getintbound(op.getarg(1))
         cf = None
         if indexb.is_constant():
-            #arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(), 
indexvalue.box.getint())
+            index = indexb.getint()
+            arrayinfo.getlenbound().make_gt_const(index)
             # use the cache on (arraydescr, index), which is a constant
-            #cf = self.arrayitem_cache(op.getdescr(), indexvalue.box.getint())
-            #fieldvalue = cf.getfield_from_cache(self, arrayvalue)
-            fieldvalue = None
+            cf = self.arrayitem_cache(op.getdescr(), index)
+            fieldvalue = cf.getfield_from_cache(self, arrayinfo, op.getdescr())
             if fieldvalue is not None:
                 self.make_equal_to(op, fieldvalue)
                 return
@@ -620,10 +619,9 @@
         #
         indexb = self.getintbound(op.getarg(1))
         if indexb.is_constant():
-            #arrayinfo = self.ensure_ptr_info_arg0(op)
+            arrayinfo = self.ensure_ptr_info_arg0(op)
             # arraybound
-            #arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(), 
indexvalue.box.getint())
-            # use the cache on (arraydescr, index), which is a constant
+            arrayinfo.getlenbound().make_gt_const(indexb.getint())
             cf = self.arrayitem_cache(op.getdescr(), indexb.getint())
             cf.do_setfield(self, op)
         else:
diff --git a/rpython/jit/metainterp/optimizeopt/info.py 
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -301,16 +301,20 @@
     length = -1
 
     def __init__(self, const=None, size=0, clear=False, vdescr=None):
+        from rpython.jit.metainterp.optimizeopt import intutils
         self.vdescr = vdescr
         if vdescr is not None:
             self._init_items(const, size, clear)
+            self.lenbound = intutils.ConstIntBound(size)
         self._clear = clear
 
-    #def getlenbound(self):
-    #    if self.lenbound is None:
-    #        raise Exception("implement me - lenbound")
-    #        xxx
-    #    return self.lenbound
+    def getlenbound(self):
+        from rpython.jit.metainterp.optimizeopt import intutils
+        
+        if self.lenbound is None:
+            assert self.length == -1
+            self.lenbound = intutils.IntLowerBound(0)
+        return self.lenbound
 
     def _init_items(self, const, size, clear):
         self.length = size
@@ -378,6 +382,13 @@
                                            descr=descr)
             shortboxes.add_heap_op(op, getarrayitem_op)
 
+    def make_guards(self, op, short):
+        AbstractVirtualPtrInfo.make_guards(self, op, short)
+        if self.lenbound is not None:
+            lenop = ResOperation(rop.ARRAYLEN_GC, [op])
+            short.append(lenop)
+            self.lenbound.make_guards(lenop, short)
+
 class ArrayStructInfo(ArrayPtrInfo):
     def __init__(self, size, vdescr=None):
         self.length = size
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
@@ -409,12 +409,9 @@
             bres.intersect(bounds)
 
     def optimize_ARRAYLEN_GC(self, op):
-        array = self.getptrinfo(op.getarg(0))
-        result = self.getintbound(op)
-        result.make_ge(IntLowerBound(0))
+        array = self.ensure_ptr_info_arg0(op)
         self.emit_operation(op)
-        #array.make_len_gt(MODE_ARRAY, op.getdescr(), -1)
-        #array.getlenbound().bound.intersect(result.getintbound())
+        self.optimizer.setintbound(op, array.getlenbound())
 
     def optimize_STRLEN(self, op):
         self.emit_operation(op)
diff --git a/rpython/jit/metainterp/optimizeopt/intutils.py 
b/rpython/jit/metainterp/optimizeopt/intutils.py
--- a/rpython/jit/metainterp/optimizeopt/intutils.py
+++ b/rpython/jit/metainterp/optimizeopt/intutils.py
@@ -43,6 +43,18 @@
                 return True
         return False
 
+    def make_ge_const(self, other):
+        return self.make_ge(ConstIntBound(other))
+
+    def make_gt_const(self, other):
+        return self.make_gt(ConstIntBound(other))
+
+    def make_eq_const(self, intval):
+        self.has_upper = True
+        self.has_lower = True
+        self.upper = intval
+        self.lower = intval
+
     def make_gt(self, other):
         return self.make_ge(other.add(1))
 
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py 
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -59,6 +59,14 @@
         op.set_forwarded(intbound)
         return intbound
 
+    def setintbound(self, op, bound):
+        assert op.type == 'i'
+        op = self.get_box_replacement(op)
+        if op.is_constant():
+            return
+        assert op.get_forwarded() is None
+        op.set_forwarded(bound)
+
     def getnullness(self, op):
         if op.type == 'i':
             return self.getintbound(op).getnullness()
@@ -425,7 +433,8 @@
                 opinfo = info.StructPtrInfo()
             opinfo.init_fields(op.getdescr().get_parent_descr(),
                                op.getdescr().get_index())
-        elif op.is_getarrayitem() or op.getopnum() == rop.SETARRAYITEM_GC:
+        elif (op.is_getarrayitem() or op.getopnum() == rop.SETARRAYITEM_GC or
+              op.getopnum() == rop.ARRAYLEN_GC):
             opinfo = info.ArrayPtrInfo(op.getdescr())
         elif op.getopnum() in (rop.GUARD_CLASS, rop.GUARD_NONNULL_CLASS):
             opinfo = info.InstancePtrInfo()
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
@@ -4659,19 +4659,41 @@
     def test_bound_arraylen(self):
         ops = """
         [i0, p0]
-        p1 = new_array(i0, descr=arraydescr)
+        p1 = new_array(i0, descr=gcarraydescr)
         i1 = arraylen_gc(p1)
         i2 = int_gt(i1, -1)
         guard_true(i2) []
-        setarrayitem_gc(p0, 0, p1)
+        setarrayitem_gc(p0, 0, p1, descr=gcarraydescr)
         jump(i0, p0)
         """
         # The dead arraylen_gc will be eliminated by the backend.
         expected = """
         [i0, p0]
-        p1 = new_array(i0, descr=arraydescr)
+        p1 = new_array(i0, descr=gcarraydescr)
         i1 = arraylen_gc(p1)
-        setarrayitem_gc(p0, 0, p1)
+        setarrayitem_gc(p0, 0, p1, descr=gcarraydescr)
+        jump(i0, p0)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_bound_arraylen_2(self):
+        ops = """
+        [i0, p0]
+        p1 = new_array(i0, descr=gcarraydescr)
+        setarrayitem_gc(p1, 3, p1, descr=gcarraydescr)
+        i1 = arraylen_gc(p1)
+        i2 = int_gt(i1, 2)
+        guard_true(i2) []
+        setarrayitem_gc(p1, 0, p0, descr=gcarraydescr)
+        jump(i0, p0)
+        """
+        # The dead arraylen_gc will be eliminated by the backend.
+        expected = """
+        [i0, p0]
+        p1 = new_array(i0, descr=gcarraydescr)
+        i1 = arraylen_gc(p1)
+        setarrayitem_gc(p1, 0, p0, descr=gcarraydescr)
+        setarrayitem_gc(p1, 3, p1, descr=gcarraydescr)
         jump(i0, p0)
         """
         self.optimize_loop(ops, expected)
@@ -7612,7 +7634,7 @@
         ops = """
         [p0]
         p1 = getfield_gc_r(p0, descr=nextdescr)
-        p2 = getarrayitem_gc_r(p1, 7, descr=arraydescr)
+        p2 = getarrayitem_gc_r(p1, 7, descr=gcarraydescr)
         call_n(p2, descr=nonwritedescr)
         jump(p0)
         """
@@ -7623,13 +7645,13 @@
         i1 = arraylen_gc(p1)
         i2 = int_ge(i1, 8)
         guard_true(i2) []
-        p2 = getarrayitem_gc_r(p1, 7, descr=arraydescr)
-        jump(p0, p1, p2)
+        p2 = getarrayitem_gc_r(p1, 7, descr=gcarraydescr)
+        jump(p1, p2)
         """
         expected = """
         [p0, p1, p2]
         call_n(p2, descr=nonwritedescr)
-        # i3 = arraylen_gc(p1) # Should be killed by backend
+        i3 = arraylen_gc(p1) # Should be killed by backend
         jump(p0, p1, p2)
         """
         self.optimize_loop(ops, expected, expected_short=short)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -168,6 +168,7 @@
     immut_ptrval = cpu.fielddescrof(PTROBJ_IMMUT, 'ptrval')
 
     arraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Signed))
+    gcarraydescr = cpu.arraydescrof(lltype.GcArray(llmemory.GCREF))
     floatarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Float))
 
     # a GcStruct not inheriting from OBJECT
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to