[pypy-commit] pypy optresult: start working on raw virtuals

fijal noreply at buildbot.pypy.org
Sun May 31 15:37:49 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77721:6103e21af779
Date: 2015-05-31 13:22 +0200
http://bitbucket.org/pypy/pypy/changeset/6103e21af779/

Log:	start working on raw virtuals

diff --git a/rpython/jit/backend/llsupport/descr.py b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -22,7 +22,7 @@
         self._cache_interiorfield = {}
 
     def init_size_descr(self, STRUCT, sizedescr):
-        assert isinstance(STRUCT, lltype.GcStruct)
+        pass
 
     def init_array_descr(self, ARRAY, arraydescr):
         assert (isinstance(ARRAY, lltype.GcArray) or
@@ -74,18 +74,19 @@
         size = symbolic.get_size(STRUCT, gccache.translate_support_code)
         count_fields_if_immut = heaptracker.count_fields_if_immutable(STRUCT)
         gc_fielddescrs = heaptracker.gc_fielddescrs(gccache, STRUCT)
-        all_fielddescrs = heaptracker.all_fielddescrs(gccache, STRUCT)
         if is_object: #heaptracker.has_gcstruct_a_vtable(STRUCT):
             #assert is_object
             sizedescr = SizeDescrWithVTable(size, count_fields_if_immut,
-                                            gc_fielddescrs, all_fielddescrs,
+                                            gc_fielddescrs, None,
                 heaptracker.get_vtable_for_gcstruct(cpu, STRUCT))
         else:
             #assert not is_object
             sizedescr = SizeDescr(size, count_fields_if_immut,
-                                  gc_fielddescrs, all_fielddescrs)
+                                  gc_fielddescrs, None)
         gccache.init_size_descr(STRUCT, sizedescr)
         cache[STRUCT] = sizedescr
+        all_fielddescrs = heaptracker.all_fielddescrs(gccache, STRUCT)
+        sizedescr.all_fielddescrs = all_fielddescrs
         return sizedescr
 
 
@@ -111,11 +112,12 @@
     field_size = 0
     flag = '\x00'
 
-    def __init__(self, name, offset, field_size, flag):
+    def __init__(self, name, offset, field_size, flag, index_in_parent=0):
         self.name = name
         self.offset = offset
         self.field_size = field_size
         self.flag = flag
+        self.index = index_in_parent
 
     def __repr__(self):
         return 'FieldDescr<%s>' % (self.name,)
@@ -166,9 +168,11 @@
         FIELDTYPE = getattr(STRUCT, fieldname)
         flag = get_type_flag(FIELDTYPE)
         name = '%s.%s' % (STRUCT._name, fieldname)
-        fielddescr = FieldDescr(name, offset, size, flag)
+        index_in_parent = heaptracker.get_fielddescr_index_in(STRUCT, fieldname)
+        fielddescr = FieldDescr(name, offset, size, flag, index_in_parent)
         cachedict = cache.setdefault(STRUCT, {})
         cachedict[fieldname] = fielddescr
+        fielddescr.parent_descr = get_size_descr(None, gccache, STRUCT, False)
         return fielddescr
 
 def get_type_flag(TYPE):
diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -635,6 +635,8 @@
         #self.gcrootmap.initialize()
 
     def init_size_descr(self, S, descr):
+        if not isinstance(S, lltype.GcStruct):
+            return
         if self.layoutbuilder is not None:
             type_id = self.layoutbuilder.get_type_id(S)
             assert not self.layoutbuilder.is_weakref_type(S)
@@ -642,6 +644,8 @@
             descr.tid = llop.combine_ushort(lltype.Signed, type_id, 0)
 
     def init_array_descr(self, A, descr):
+        if not isinstance(A, lltype.GcArray):
+            return
         if self.layoutbuilder is not None:
             type_id = self.layoutbuilder.get_type_id(A)
             descr.tid = llop.combine_ushort(lltype.Signed, type_id, 0)
diff --git a/rpython/jit/codewriter/heaptracker.py b/rpython/jit/codewriter/heaptracker.py
--- a/rpython/jit/codewriter/heaptracker.py
+++ b/rpython/jit/codewriter/heaptracker.py
@@ -21,7 +21,8 @@
     return intmask(a)
 
 def count_fields_if_immutable(STRUCT):
-    assert isinstance(STRUCT, lltype.GcStruct)
+    if not isinstance(STRUCT, lltype.GcStruct):
+        return -1
     if STRUCT._hints.get('immutable', False):
         try:
             return _count_fields(STRUCT)
@@ -104,9 +105,10 @@
 
 def finish_registering(cpu):
     # annotation hack for small examples which have no vtable at all
-    if not hasattr(cpu.tracker, '_all_size_descrs_with_vtable'):
-        vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
-        register_known_gctype(cpu, vtable, rclass.OBJECT)
+    pass
+    #if not hasattr(cpu.tracker, '_all_size_descrs_with_vtable'):
+    #    vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
+    #    register_known_gctype(cpu, vtable, rclass.OBJECT)
 
 def vtable2descr(cpu, vtable):
     assert lltype.typeOf(vtable) is lltype.Signed
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
@@ -169,6 +169,9 @@
         assert self.is_virtual()
         return visitor.visit_vstruct(self.vdescr, fielddescrs)
 
+class RawStructPtrInfo(StructPtrInfo):
+    pass
+
 class ArrayPtrInfo(AbstractVirtualPtrInfo):
     _attrs_ = ('length', '_items', 'lenbound', '_clear')
 
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
@@ -332,10 +332,13 @@
         op = self.get_box_replacement(op)
         assert op.type == 'i'
         if isinstance(op, ConstInt):
-            return info.ConstRawInfo(op)
+            return info.ConstPtrInfo(op)
         fw = op.get_forwarded()
         if fw is not None:
-            assert isinstance(fw, info.RawPtrInfo)
+            if isinstance(fw, info.NonNullPtrInfo):
+                fw = info.RawStructPtrInfo()
+                op.set_forwarded(fw)
+            assert isinstance(fw, info.RawStructPtrInfo)
             return fw
         return None
 
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
@@ -751,8 +751,8 @@
         self.last_emitted_operation = REMOVED
 
     def do_RAW_FREE(self, op):
-        value = self.getvalue(op.getarg(1))
-        if value.is_virtual():
+        opinfo = self.getrawptrinfo(op.getarg(1))
+        if opinfo and opinfo.is_virtual():
             return
         self.emit_operation(op)
 
@@ -844,8 +844,8 @@
     optimize_GETARRAYITEM_RAW_F = optimize_GETARRAYITEM_RAW_I
 
     def optimize_SETARRAYITEM_RAW(self, op):
-        value = self.getvalue(op.getarg(0))
-        if value.is_virtual():
+        opinfo = self.getrawptrinfo(op.getarg(0))
+        if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
                 offset, itemsize, descr = self._unpack_arrayitem_raw_op(op, indexbox)
@@ -855,7 +855,7 @@
                     return
                 except InvalidRawOperation:
                     pass
-        value.ensure_nonnull()
+        self.make_nonnull(op.getarg(0))
         self.emit_operation(op)
 
     def _unpack_raw_load_store_op(self, op, offsetbox):


More information about the pypy-commit mailing list