Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79391:64b6bc2604a9
Date: 2015-09-03 18:08 +0200
http://bitbucket.org/pypy/pypy/changeset/64b6bc2604a9/

Log:    track descrs a bit differently

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
@@ -104,11 +104,11 @@
         short.append(op)
 
 class AbstractVirtualPtrInfo(NonNullPtrInfo):
-    _attrs_ = ('_cached_vinfo', 'vdescr')
-    # XXX merge _cached_vinfo with vdescr
+    _attrs_ = ('_cached_vinfo', 'descr', '_is_virtual')
+    # XXX merge _cached_vinfo with descr
 
     _cached_vinfo = None
-    vdescr = None
+    descr = None
 
     def force_box(self, op, optforce):
         if self.is_virtual():
@@ -117,9 +117,8 @@
             if 
self._is_immutable_and_filled_with_constants(optforce.optimizer):
                 constptr = optforce.optimizer.constant_fold(op)
                 op.set_forwarded(constptr)
-                descr = self.vdescr
-                self.vdescr = None
-                self._force_elements_immutable(descr, constptr, optforce)
+                self._is_virtual = False
+                self._force_elements_immutable(self.descr, constptr, optforce)
                 return constptr
             #
             op.set_forwarded(None)
@@ -127,8 +126,8 @@
             newop = optforce.getlastop()
             op.set_forwarded(newop)
             newop.set_forwarded(self)
-            descr = self.vdescr
-            self.vdescr = None
+            descr = self.descr
+            self._is_virtual = False
             self._force_elements(newop, optforce, descr)
             return newop
         return op
@@ -137,7 +136,7 @@
         return self.force_box(op, optforce)
 
     def is_virtual(self):
-        return self.vdescr is not None
+        return self._is_virtual
 
 class AbstractStructPtrInfo(AbstractVirtualPtrInfo):
     _attrs_ = ('_fields',)
@@ -147,6 +146,7 @@
         if self._fields is None:
             self._fields = [None] * len(descr.get_all_fielddescrs())
         if index >= len(self._fields):
+            self.descr = descr # a more precise descr
             # we found out a subclass with more fields
             extra_len = len(descr.get_all_fielddescrs()) - len(self._fields)
             self._fields = self._fields + [None] * extra_len
@@ -205,7 +205,7 @@
         return op
 
     def _visitor_walk_recursive(self, instbox, visitor, optimizer):
-        lst = self.vdescr.get_all_fielddescrs()
+        lst = self.descr.get_all_fielddescrs()
         assert self.is_virtual()
         visitor.register_virtual_fields(instbox,
                                         [optimizer.get_box_replacement(box)
@@ -235,7 +235,7 @@
         # which also answers True to the same question.
         #
         assert self.is_virtual()
-        if not self.vdescr.is_immutable():
+        if not self.descr.is_immutable():
             return False
         if memo is not None and self in memo:
             return True       # recursive case: assume yes
@@ -271,18 +271,21 @@
     _attrs_ = ('_known_class',)
     _fields = None
 
-    def __init__(self, known_class=None, vdescr=None):
+    def __init__(self, descr=None, known_class=None, is_virtual=False):
         self._known_class = known_class
-        self.vdescr = vdescr
+        # that's a descr of best-known class, can be actually a subclass
+        # of the class described in descr
+        self.descr = descr
+        self._is_virtual = is_virtual
 
     def get_known_class(self, cpu):
         return self._known_class
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
-        fielddescrs = self.vdescr.get_all_fielddescrs()
+        fielddescrs = self.descr.get_all_fielddescrs()
         assert self.is_virtual()
-        return visitor.visit_virtual(self.vdescr, fielddescrs)
+        return visitor.visit_virtual(self.descr, fielddescrs)
 
     def make_guards(self, op, short):
         if self._known_class is not None:
@@ -293,14 +296,15 @@
             AbstractStructPtrInfo.make_guards(self, op, short)
 
 class StructPtrInfo(AbstractStructPtrInfo):
-    def __init__(self, vdescr=None):
-        self.vdescr = vdescr
+    def __init__(self, descr, is_virtual=False):
+        self.descr = descr
+        self._is_virtual = is_virtual
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
-        fielddescrs = self.vdescr.get_all_fielddescrs()
+        fielddescrs = self.descr.get_all_fielddescrs()
         assert self.is_virtual()
-        return visitor.visit_vstruct(self.vdescr, fielddescrs)
+        return visitor.visit_vstruct(self.descr, fielddescrs)
 
 class AbstractRawPtrInfo(AbstractVirtualPtrInfo):
     def _visitor_walk_recursive(self, op, visitor, optimizer):
@@ -400,19 +404,19 @@
         return visitor.visit_vrawslice(self.offset)
 
 class ArrayPtrInfo(AbstractVirtualPtrInfo):
-    _attrs_ = ('length', '_items', 'lenbound', '_clear', 'arraydescr')
+    _attrs_ = ('length', '_items', 'lenbound', '_clear', 'descr',
+               '_is_virtual')
 
     _items = None
     lenbound = None
     length = -1
 
-    def __init__(self, arraydescr, const=None, size=0, clear=False,
-                 vdescr=None):
+    def __init__(self, descr, const=None, size=0, clear=False,
+                 is_virtual=False):
         from rpython.jit.metainterp.optimizeopt import intutils
-        self.vdescr = vdescr
-        self.arraydescr = arraydescr
-        if vdescr is not None:
-            assert vdescr is arraydescr
+        self.descr = descr
+        self._is_virtual = is_virtual
+        if is_virtual:
             self._init_items(const, size, clear)
             self.lenbound = intutils.ConstIntBound(size)
         self._clear = clear
@@ -437,15 +441,15 @@
         return self._items
 
     def copy_fields_to_const(self, constinfo, optheap):
-        arraydescr = self.arraydescr
+        descr = self.descr
         if self._items is not None:
-            info = constinfo._get_array_info(arraydescr, optheap)
+            info = constinfo._get_array_info(descr, optheap)
             assert isinstance(info, ArrayPtrInfo)
             info._items = self._items[:]
 
     def _force_elements(self, op, optforce, descr):
-        arraydescr = op.getdescr()
-        const = optforce.new_const_item(self.arraydescr)
+        descr = op.getdescr()
+        const = optforce.new_const_item(self.descr)
         for i in range(self.length):
             item = self._items[i]
             if item is None or self._clear and const.same_constant(item):
@@ -453,7 +457,7 @@
             subbox = optforce.force_box(item)
             setop = ResOperation(rop.SETARRAYITEM_GC,
                                  [op, ConstInt(i), subbox],
-                                  descr=arraydescr)
+                                  descr=descr)
             self._items[i] = None
             optforce.emit_operation(setop)
         optforce.pure_from_args(rop.ARRAYLEN_GC, [op], 
ConstInt(len(self._items)))
@@ -490,7 +494,7 @@
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
-        return visitor.visit_varray(self.vdescr, self._clear)
+        return visitor.visit_varray(self.descr, self._clear)
 
     def produce_short_preamble_ops(self, structbox, descr, index, optimizer,
                                    shortboxes):
@@ -522,19 +526,20 @@
     def make_guards(self, op, short):
         AbstractVirtualPtrInfo.make_guards(self, op, short)
         if self.lenbound is not None:
-            lenop = ResOperation(rop.ARRAYLEN_GC, [op], descr=self.arraydescr)
+            lenop = ResOperation(rop.ARRAYLEN_GC, [op], descr=self.descr)
             short.append(lenop)
             self.lenbound.make_guards(lenop, short)
 
 class ArrayStructInfo(ArrayPtrInfo):
-    def __init__(self, size, vdescr=None):
+    def __init__(self, descr, size, is_virtual=False):
         from rpython.jit.metainterp.optimizeopt import intutils
 
         self.length = size
-        lgt = len(vdescr.get_all_fielddescrs())
+        lgt = len(descr.get_all_fielddescrs())
         self.lenbound = intutils.ConstIntBound(size)
-        self.vdescr = vdescr
+        self.descr = descr
         self._items = [None] * (size * lgt)
+        self._is_virtual = is_virtual
 
     def _compute_index(self, index, fielddescr):
         all_fdescrs = fielddescr.get_arraydescr().get_all_fielddescrs()
@@ -571,7 +576,7 @@
         itemops = [optimizer.get_box_replacement(item)
                    for item in self._items]
         visitor.register_virtual_fields(instbox, itemops)
-        fielddescrs = self.vdescr.get_all_fielddescrs()
+        fielddescrs = self.descr.get_all_fielddescrs()
         i = 0
         for index in range(self.getlength()):
             for flddescr in fielddescrs:
@@ -586,8 +591,8 @@
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
-        flddescrs = self.vdescr.get_all_fielddescrs()
-        return visitor.visit_varraystruct(self.vdescr, self.getlength(),
+        flddescrs = self.descr.get_all_fielddescrs()
+        return visitor.visit_varraystruct(self.descr, self.getlength(),
                                           flddescrs)
 
 class ConstPtrInfo(PtrInfo):
@@ -602,24 +607,24 @@
     def make_guards(self, op, short):
         short.append(ResOperation(rop.GUARD_VALUE, [op, self._const]))
 
-    def _get_info(self, optheap):
+    def _get_info(self, descr, optheap):
         ref = self._const.getref_base()
         info = optheap.const_infos.get(ref, None)
         if info is None:
-            info = StructPtrInfo()
+            info = StructPtrInfo(descr)
             optheap.const_infos[ref] = info
         return info
 
-    def _get_array_info(self, arraydescr, optheap):
+    def _get_array_info(self, descr, optheap):
         ref = self._const.getref_base()
         info = optheap.const_infos.get(ref, None)
         if info is None:
-            info = ArrayPtrInfo(arraydescr)
+            info = ArrayPtrInfo(descr)
             optheap.const_infos[ref] = info
         return info        
 
     def getfield(self, descr, optheap=None):
-        info = self._get_info(optheap)
+        info = self._get_info(descr.get_parent_descr(), optheap)
         return info.getfield(descr)
 
     def getitem(self, descr, index, optheap=None):
@@ -631,7 +636,7 @@
         info.setitem(descr, index, struct, op, cf)
 
     def setfield(self, descr, struct, op, optheap=None, cf=None):
-        info = self._get_info(optheap)
+        info = self._get_info(descr.get_parent_descr(), optheap)
         info.setfield(descr, struct, op, optheap, cf)
 
     def is_null(self):
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
@@ -449,13 +449,13 @@
         assert opinfo is None or opinfo.__class__ is info.NonNullPtrInfo
         if (op.is_getfield() or op.getopnum() == rop.SETFIELD_GC or
             op.getopnum() == rop.QUASIIMMUT_FIELD):
-            is_object = op.getdescr().get_parent_descr().is_object()
-            if is_object:
-                opinfo = info.InstancePtrInfo()
+            descr = op.getdescr()
+            parent_descr = descr.get_parent_descr()
+            if parent_descr.is_object():
+                opinfo = info.InstancePtrInfo(parent_descr)
             else:
-                opinfo = info.StructPtrInfo()
-            opinfo.init_fields(op.getdescr().get_parent_descr(),
-                               op.getdescr().get_index())
+                opinfo = info.StructPtrInfo(parent_descr)
+            opinfo.init_fields(parent_descr, descr.get_index())
         elif (op.is_getarrayitem() or op.getopnum() == rop.SETARRAYITEM_GC or
               op.getopnum() == rop.ARRAYLEN_GC):
             opinfo = info.ArrayPtrInfo(op.getdescr())
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
@@ -15,7 +15,7 @@
     _last_guard_not_forced_2 = None
 
     def make_virtual(self, known_class, source_op, descr):
-        opinfo = info.InstancePtrInfo(known_class, vdescr=descr)
+        opinfo = info.InstancePtrInfo(descr, known_class, is_virtual=True)
         opinfo.init_fields(descr, 0)
         newop = self.replace_op_with(source_op, source_op.getopnum())
         newop.set_forwarded(opinfo)
@@ -24,17 +24,17 @@
     def make_varray(self, arraydescr, size, source_op, clear=False):
         if arraydescr.is_array_of_structs():
             assert clear
-            opinfo = info.ArrayStructInfo(size, vdescr=arraydescr)
+            opinfo = info.ArrayStructInfo(arraydescr, size, is_virtual=True)
         else:
             const = self.new_const_item(arraydescr)
             opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear,
-                                       vdescr=arraydescr)
+                                       is_virtual=True)
         newop = self.replace_op_with(source_op, source_op.getopnum())
         newop.set_forwarded(opinfo)
         return opinfo
 
     def make_vstruct(self, structdescr, source_op):
-        opinfo = info.StructPtrInfo(vdescr=structdescr)
+        opinfo = info.StructPtrInfo(structdescr, is_virtual=True)
         opinfo.init_fields(structdescr, 0)
         newop = self.replace_op_with(source_op, source_op.getopnum())
         newop.set_forwarded(opinfo)
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -601,6 +601,7 @@
 
 class AbstractVArrayInfo(AbstractVirtualInfo):
     def __init__(self, arraydescr):
+        assert arraydescr is not None
         self.arraydescr = arraydescr
         #self.fieldnums = ...
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to