[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