Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: optresult-unroll
Changeset: r79160:ed85c661a0e3
Date: 2015-08-23 17:49 +0200
http://bitbucket.org/pypy/pypy/changeset/ed85c661a0e3/

Log:    pass arraydescr a bit everywhere for short preamble

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
@@ -198,17 +198,17 @@
         return op.getarg(2)
 
     def _getfield(self, opinfo, descr, optheap):
-        res = opinfo.getitem(self.index, optheap)
+        res = opinfo.getitem(descr, self.index, optheap)
         if isinstance(res, PreambleOp):
             index = res.preamble_op.getarg(1).getint()
             res = optheap.optimizer.force_op_from_preamble(res)
-            opinfo.setitem(index, None, res, optheap=optheap)
+            opinfo.setitem(descr, index, None, res, optheap=optheap)
         return res
 
     def _setfield(self, op, opinfo, optheap):
         arg = optheap.get_box_replacement(op.getarg(2))
         struct = optheap.get_box_replacement(op.getarg(0))
-        opinfo.setitem(self.index, struct, arg, self, optheap)
+        opinfo.setitem(op.getdescr(), self.index, struct, arg, self, optheap)
 
     def invalidate(self, descr):
         for opinfo in self.cached_infos:
@@ -589,7 +589,7 @@
         self.emit_operation(op)
         # the remember the result of reading the array item
         if cf is not None:
-            arrayinfo.setitem(indexb.getint(),
+            arrayinfo.setitem(op.getdescr(), indexb.getint(),
                               self.get_box_replacement(op.getarg(0)),
                               self.get_box_replacement(op), cf,
                               self)
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
@@ -317,16 +317,19 @@
         return visitor.visit_vrawslice(self.offset)
 
 class ArrayPtrInfo(AbstractVirtualPtrInfo):
-    _attrs_ = ('length', '_items', 'lenbound', '_clear')
+    _attrs_ = ('length', '_items', 'lenbound', '_clear', 'arraydescr')
 
     _items = None
     lenbound = None
     length = -1
 
-    def __init__(self, const=None, size=0, clear=False, vdescr=None):
+    def __init__(self, arraydescr, const=None, size=0, clear=False,
+                 vdescr=None):
         from rpython.jit.metainterp.optimizeopt import intutils
         self.vdescr = vdescr
+        self.arraydescr = arraydescr
         if vdescr is not None:
+            assert vdescr is arraydescr
             self._init_items(const, size, clear)
             self.lenbound = intutils.ConstIntBound(size)
         self._clear = clear
@@ -350,9 +353,9 @@
     def all_items(self):
         return self._items
 
-    def copy_fields_to_const(self, constinfo, optheap):
+    def copy_fields_to_const(self, arraydescr, constinfo, optheap):
         if self._items is not None:
-            info = constinfo._get_array_info(optheap)
+            info = constinfo._get_array_info(arraydescr, optheap)
             info._items = self._items[:]
 
     def _force_elements(self, op, optforce, descr):
@@ -371,7 +374,7 @@
                     optforce.emit_operation(setop)
         optforce.pure_from_args(rop.ARRAYLEN_GC, [op], 
ConstInt(len(self._items)))
 
-    def setitem(self, index, struct_op, op, cf=None, optheap=None):
+    def setitem(self, descr, index, struct_op, op, cf=None, optheap=None):
         if self._items is None:
             self._items = [None] * (index + 1)
         if index >= len(self._items):
@@ -381,7 +384,7 @@
             assert not self.is_virtual()
             cf.register_dirty_field(struct_op, self)
 
-    def getitem(self, index, optheap=None):
+    def getitem(self, descr, index, optheap=None):
         if self._items is None or index >= len(self._items):
             return None
         return self._items[index]
@@ -418,7 +421,7 @@
     def make_guards(self, op, short):
         AbstractVirtualPtrInfo.make_guards(self, op, short)
         if self.lenbound is not None:
-            lenop = ResOperation(rop.ARRAYLEN_GC, [op])
+            lenop = ResOperation(rop.ARRAYLEN_GC, [op], descr=self.arraydescr)
             short.append(lenop)
             self.lenbound.make_guards(lenop, short)
 
@@ -503,11 +506,11 @@
             optheap.const_infos[ref] = info
         return info
 
-    def _get_array_info(self, optheap):
+    def _get_array_info(self, arraydescr, optheap):
         ref = self._const.getref_base()
         info = optheap.const_infos.get(ref, None)
         if info is None:
-            info = ArrayPtrInfo()
+            info = ArrayPtrInfo(arraydescr)
             optheap.const_infos[ref] = info
         return info        
 
@@ -515,13 +518,13 @@
         info = self._get_info(optheap)
         return info.getfield(descr)
 
-    def getitem(self, index, optheap=None):
-        info = self._get_array_info(optheap)
-        return info.getitem(index)
+    def getitem(self, descr, index, optheap=None):
+        info = self._get_array_info(descr, optheap)
+        return info.getitem(descr, index)
 
-    def setitem(self, index, struct, op, cf=None, optheap=None):
-        info = self._get_array_info(optheap)
-        info.setitem(index, struct, op, cf)
+    def setitem(self, descr, index, struct, op, cf=None, optheap=None):
+        info = self._get_array_info(descr, optheap)
+        info.setitem(descr, index, struct, op, cf)
 
     def setfield(self, descr, struct, op, optheap=None, cf=None):
         info = self._get_info(optheap)
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
@@ -549,7 +549,7 @@
             # XXX fish fish fish
             for index in range(length.getint()):
                 if source_info and source_info.is_virtual():
-                    val = source_info.getitem(index + source_start)
+                    val = source_info.getitem(arraydescr, index + source_start)
                 else:
                     opnum = OpHelpers.getarrayitem_for_descr(arraydescr)
                     newop = ResOperation(opnum,
@@ -561,7 +561,7 @@
                 if val is None:
                     continue
                 if dest_info and dest_info.is_virtual():
-                    dest_info.setitem(index + dest_start,
+                    dest_info.setitem(arraydescr, index + dest_start,
                                       self.get_box_replacement(op.getarg(2)),
                                       val)
                 else:
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py 
b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -69,7 +69,8 @@
         else:
             index = g.getarg(1).getint()
             assert index >= 0
-            opinfo.setitem(index, self.res, pop, optheap=optheap)
+            opinfo.setitem(self.getfield_op.getdescr(), index, self.res,
+                           pop, optheap=optheap)
 
     def add_op_to_short(self, sb):
         sop = self.getfield_op
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -489,7 +489,7 @@
         info2 = VArrayStateInfo(descr)
         info2.fieldstate = [innerinfo2]
 
-        value1 = info.ArrayPtrInfo(vdescr=descr, size=1)
+        value1 = info.ArrayPtrInfo(descr, vdescr=descr, size=1)
         box = InputArgRef(self.nodeaddr)
         value1._items[0] = box
 
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -48,7 +48,7 @@
             if known_class:
                 self.make_constant_class(op, known_class, False)
             if isinstance(preamble_info, info.ArrayPtrInfo):
-                arr_info = info.ArrayPtrInfo(None)
+                arr_info = info.ArrayPtrInfo(preamble_info.arraydescr)
                 arr_info.lenbound = preamble_info.getlenbound(None)
                 op.set_forwarded(arr_info)
             if preamble_info.is_nonnull():
@@ -210,25 +210,27 @@
 
     def inline_short_preamble(self, jump_args, short_inputargs, short_ops,
                               short_jump_op, patchguardop):
-        self._check_no_forwarding([short_inputargs, short_ops], False)
-        assert len(short_inputargs) == len(jump_args)
-        for i in range(len(jump_args)):
-            short_inputargs[i].set_forwarded(None)
-            self.make_equal_to(short_inputargs[i], jump_args[i])
-        for op in short_ops:
-            if op.is_guard():
-                op = self.replace_op_with(op, op.getopnum(),
-                                          
descr=compile.ResumeAtPositionDescr())
-                op.rd_snapshot = patchguardop.rd_snapshot
-                op.rd_frame_info_list = patchguardop.rd_frame_info_list
-            self.optimizer.send_extra_operation(op)
-        res = [self.optimizer.get_box_replacement(op) for op in
-                short_jump_op]
-        for op in short_inputargs:
-            op.set_forwarded(None)
-        for op in short_ops:
-            op.set_forwarded(None)
-        return res
+        try:
+            self._check_no_forwarding([short_inputargs, short_ops], False)
+            assert len(short_inputargs) == len(jump_args)
+            for i in range(len(jump_args)):
+                short_inputargs[i].set_forwarded(None)
+                self.make_equal_to(short_inputargs[i], jump_args[i])
+            for op in short_ops:
+                if op.is_guard():
+                    op = self.replace_op_with(op, op.getopnum(),
+                                    descr=compile.ResumeAtPositionDescr())
+                    op.rd_snapshot = patchguardop.rd_snapshot
+                    op.rd_frame_info_list = patchguardop.rd_frame_info_list
+                self.optimizer.send_extra_operation(op)
+            res = [self.optimizer.get_box_replacement(op) for op in
+                    short_jump_op]
+            return res
+        finally:
+            for op in short_inputargs:
+                op.set_forwarded(None)
+            for op in short_ops:
+                op.set_forwarded(None)
 
     def export_state(self, start_label, original_label_args, 
renamed_inputargs):
         end_args = [self.get_box_replacement(a) for a in original_label_args]
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -28,7 +28,8 @@
             opinfo = info.ArrayStructInfo(size, vdescr=arraydescr)
         else:
             const = self.new_const_item(arraydescr)
-            opinfo = info.ArrayPtrInfo(const, size, clear, vdescr=arraydescr)
+            opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear,
+                                       vdescr=arraydescr)
         newop = self.replace_op_with(source_op, source_op.getopnum())
         newop.set_forwarded(opinfo)
         return opinfo
@@ -277,7 +278,7 @@
         if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
-                item = opinfo.getitem(indexbox.getint())
+                item = opinfo.getitem(op.getdescr(), indexbox.getint())
                 if item is None:   # reading uninitialized array items?
                     assert False, "can't read uninitialized items"
                     itemvalue = value.constvalue     # bah, just return 0
@@ -299,7 +300,7 @@
         if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
-                opinfo.setitem(indexbox.getint(),
+                opinfo.setitem(op.getdescr(), indexbox.getint(),
                                self.get_box_replacement(op.getarg(0)),
                                self.get_box_replacement(op.getarg(2)))
                 return
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -223,7 +223,7 @@
         if len(self.fieldstate) > info.getlength():
             raise BadVirtualState
         for i in range(len(self.fieldstate)):
-            fieldbox = info.getitem(i)
+            fieldbox = info.getitem(self.arraydescr, i)
             if fieldbox is None:
                 xxx
                 v = value.get_missing_null_value()
diff --git a/rpython/jit/metainterp/test/test_resume.py 
b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -1285,7 +1285,8 @@
     modifier.liveboxes = {}
     modifier.vfieldboxes = {}
 
-    v2 = info.ArrayPtrInfo(vdescr=LLtypeMixin.arraydescr, size=2)
+    v2 = info.ArrayPtrInfo(LLtypeMixin.arraydescr,
+                           vdescr=LLtypeMixin.arraydescr, size=2)
     b2s.set_forwarded(v2)
     v2._items = [b4s, c1s]
     modifier.register_virtual_fields(b2s, [b4s, c1s])
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to