Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77573:a695000cce2a
Date: 2015-05-26 13:38 +0200
http://bitbucket.org/pypy/pypy/changeset/a695000cce2a/
Log: hack enough to start passing resume tests
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -653,11 +653,11 @@
return lltype.cast_opaque_ptr(llmemory.GCREF,
lltype.malloc(sizedescr.S, zero=True))
- def bh_new_with_vtable(self, vtable, descr):
+ def bh_new_with_vtable(self, descr):
result = lltype.malloc(descr.S, zero=True)
result_as_objptr = lltype.cast_pointer(rclass.OBJECTPTR, result)
result_as_objptr.typeptr = support.cast_from_int(rclass.CLASSTYPE,
- vtable)
+ descr._corresponding_vtable)
return lltype.cast_opaque_ptr(llmemory.GCREF, result)
def bh_new_array(self, length, arraydescr):
diff --git a/rpython/jit/metainterp/executor.py
b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -227,11 +227,8 @@
else:
return BoxInt(cpu.bh_raw_load_i(addr, offset, arraydescr))
-def exec_new_with_vtable(cpu, clsbox):
- from rpython.jit.codewriter import heaptracker
- vtable = clsbox.getint()
- descr = heaptracker.vtable2descr(cpu, vtable)
- return cpu.bh_new_with_vtable(vtable, descr)
+def exec_new_with_vtable(cpu, descr):
+ return cpu.bh_new_with_vtable(descr)
def do_new_with_vtable(cpu, _, clsbox):
return exec_new_with_vtable(cpu, clsbox)
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
@@ -1,4 +1,5 @@
+from rpython.rlib.objectmodel import specialize
from rpython.jit.metainterp.resoperation import AbstractValue, ResOperation,\
rop
from rpython.jit.metainterp.history import ConstInt
@@ -19,8 +20,6 @@
INFO_NONNULL = 1
INFO_UNKNOWN = 2
-FLAG_VIRTUAL = 1
-
class AbstractInfo(AbstractValue):
is_info_class = True
@@ -71,9 +70,11 @@
assert self.get_last_guard(optimizer).is_guard()
class AbstractVirtualPtrInfo(NonNullPtrInfo):
- _attrs_ = ('flags',)
+ _attrs_ = ('_cached_vinfo', 'vdescr')
+ # XXX merge _cached_vinfo with vdescr
- flags = 0
+ _cached_vinfo = None
+ vdescr = None
def force_box(self, op, optforce):
if self.is_virtual():
@@ -82,13 +83,13 @@
newop = optforce.getlastop()
op.set_forwarded(newop)
newop.set_forwarded(self)
- self.flags &= ~FLAG_VIRTUAL # clean the virtual flag
+ self.vdescr = None
self._force_elements(newop, optforce)
return newop
return op
def is_virtual(self):
- return self.flags & FLAG_VIRTUAL
+ return self.vdescr is not None
class AbstractStructPtrInfo(AbstractVirtualPtrInfo):
_attrs_ = ('_fields',)
@@ -97,8 +98,7 @@
self._fields = [None] * len(descr.all_fielddescrs)
def clear_cache(self):
- assert self.flags & FLAG_VIRTUAL == 0
- self.flags = 0
+ assert not self.is_virtual()
self._fields = [None] * len(self._fields)
def setfield(self, descr, op, optheap=None, cf=None):
@@ -130,32 +130,45 @@
_attrs_ = ('_known_class',)
_fields = None
- def __init__(self, known_class=None, is_virtual=False):
+ def __init__(self, known_class=None, vdescr=None):
self._known_class = known_class
- if is_virtual:
- self.flags = FLAG_VIRTUAL
+ self.vdescr = vdescr
def get_known_class(self, cpu):
return self._known_class
+ def visitor_walk_recursive(self, instbox, visitor):
+ if visitor.already_seen_virtual(instbox):
+ return
+ #lst = op.getdescr().parent_descr.all_fielddescrs
+ assert self.is_virtual()
+ visitor.register_virtual_fields(instbox,
+ [box for box in self._fields if box])
+ #for i in range(len(lst)):
+ # descr = lst[descr]
+ # fieldvalue = self._fields[ofs]
+ # fieldvalue.visitor_walk_recursive(visitor)
+
+ @specialize.argtype(1)
+ def visitor_dispatch_virtual_type(self, visitor):
+ fielddescrs = self.vdescr.all_fielddescrs
+ assert self.is_virtual()
+ return visitor.visit_virtual(self.vdescr, fielddescrs)
+
class StructPtrInfo(AbstractStructPtrInfo):
- def __init__(self, is_virtual=False):
- if is_virtual:
- self.flags = FLAG_VIRTUAL
+ def __init__(self, vdescr=None):
+ self.vdescr = vdescr
class ArrayPtrInfo(AbstractVirtualPtrInfo):
- _attrs_ = ('length', '_items', '_descr', 'lenbound')
+ _attrs_ = ('length', '_items', 'lenbound')
- flags = 0
_items = None
lenbound = None
length = -1
- def __init__(self, descr, const=None, size=0, clear=False,
- is_virtual=False):
- self._descr = descr
- if is_virtual:
- self.flags = FLAG_VIRTUAL
+ def __init__(self, const=None, size=0, clear=False, vdescr=None):
+ self.vdescr = vdescr
+ if vdescr is not None:
self._init_items(const, size, clear)
def _init_items(self, const, size, clear):
@@ -199,11 +212,10 @@
return self.length
class ArrayStructInfo(ArrayPtrInfo):
- def __init__(self, descr, size, is_virtual):
+ def __init__(self, size, vdescr=None):
self.length = size
- lgt = len(descr.all_interiorfielddescrs)
- if is_virtual:
- self.flags = FLAG_VIRTUAL
+ lgt = len(vdescr.all_interiorfielddescrs)
+ self.vdescr = vdescr
self._items = [None] * (size * lgt)
def _compute_index(self, index, fielddescr):
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
@@ -213,11 +213,10 @@
v2 = self.get_box_replacement(rhs)
if v1.is_constant():
- xxxx
- if v1.box.getfloatstorage() == 1.0:
+ if v1.getfloatstorage() == 1.0:
self.make_equal_to(op, v2)
return
- elif v1.box.getfloatstorage() == -1.0:
+ elif v1.getfloatstorage() == -1.0:
newop = self.replace_op_with(op, rop.FLOAT_NEG, args=[rhs])
self.emit_operation(newop)
return
@@ -227,12 +226,12 @@
def optimize_FLOAT_TRUEDIV(self, op):
arg1 = op.getarg(0)
arg2 = op.getarg(1)
- v2 = self.getvalue(arg2)
+ v2 = self.get_box_replacement(arg2)
# replace "x / const" by "x * (1/const)" if possible
newop = op
if v2.is_constant():
- divisor = v2.box.getfloatstorage()
+ divisor = v2.getfloatstorage()
fraction = math.frexp(divisor)[0]
# This optimization is valid for powers of two
# but not for zeroes, some denormals and NaN:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -1621,7 +1621,7 @@
"""
expected = """
[p1, i2, i3]
- guard_true(i3) []
+ guard_true(i3) [p1]
i4 = int_neg(i2)
setfield_gc(p1, NULL, descr=nextdescr)
jump(p1, i2, i4)
@@ -1641,7 +1641,7 @@
"""
expected = """
[p1, i2, i3]
- guard_true(i3) [] # [i2, p1]
+ guard_true(i3) [i2, p1]
i4 = int_neg(i2)
setfield_gc(p1, NULL, descr=nextdescr)
jump(p1, i2, i4)
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
@@ -521,7 +521,7 @@
_last_guard_not_forced_2 = None
def make_virtual(self, known_class, source_op, descr):
- opinfo = info.InstancePtrInfo(known_class, is_virtual=True)
+ opinfo = info.InstancePtrInfo(known_class, vdescr=descr)
opinfo.init_fields(descr)
source_op.set_forwarded(opinfo)
return opinfo
@@ -529,15 +529,15 @@
def make_varray(self, arraydescr, size, source_op, clear=False):
if arraydescr.is_array_of_structs():
assert clear
- opinfo = info.ArrayStructInfo(arraydescr, size, True)
+ opinfo = info.ArrayStructInfo(size, vdescr=arraydescr)
else:
const = self.new_const_item(arraydescr)
- opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear, True)
+ opinfo = info.ArrayPtrInfo(const, size, clear, vdescr=arraydescr)
source_op.set_forwarded(opinfo)
return opinfo
def make_vstruct(self, structdescr, source_op):
- opinfo = info.StructPtrInfo(True)
+ opinfo = info.StructPtrInfo(vdescr=structdescr)
opinfo.init_fields(structdescr)
source_op.set_forwarded(opinfo)
return opinfo
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -438,9 +438,7 @@
@arguments("descr")
def opimpl_new_with_vtable(self, sizedescr):
- cpu = self.metainterp.cpu
- cls = heaptracker.descr2vtable(cpu, sizedescr)
- return self.metainterp.execute_new_with_vtable(ConstInt(cls))
+ return self.metainterp.execute_new_with_vtable(descr=sizedescr)
@arguments("box", "descr")
def opimpl_new_array(self, lengthbox, itemsizedescr):
@@ -2024,9 +2022,8 @@
if op.type != 'v':
return op
- def execute_new_with_vtable(self, known_class):
- resbox = self.execute_and_record(rop.NEW_WITH_VTABLE, None,
- known_class)
+ def execute_new_with_vtable(self, descr):
+ resbox = self.execute_and_record(rop.NEW_WITH_VTABLE, descr)
self.heapcache.new(resbox)
self.heapcache.class_now_known(resbox)
return resbox
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
@@ -289,23 +289,21 @@
self.snapshot_storage = snapshot_storage
self.memo = memo
- def make_virtual_info(self, value, fieldnums):
- from rpython.jit.metainterp.optimizeopt.virtualize import
AbstractVirtualValue
- assert isinstance(value, AbstractVirtualValue)
+ def make_virtual_info(self, descr, info, fieldnums):
assert fieldnums is not None
- vinfo = value._cached_vinfo
+ vinfo = info._cached_vinfo
if vinfo is not None and vinfo.equals(fieldnums):
return vinfo
- vinfo = value.visitor_dispatch_virtual_type(self)
+ vinfo = info.visitor_dispatch_virtual_type(self)
vinfo.set_content(fieldnums)
- value._cached_vinfo = vinfo
+ info._cached_vinfo = vinfo
return vinfo
def visit_not_virtual(self, value):
assert 0, "unreachable"
- def visit_virtual(self, known_class, fielddescrs):
- return VirtualInfo(known_class, fielddescrs)
+ def visit_virtual(self, descr, fielddescrs):
+ return VirtualInfo(descr, fielddescrs)
def visit_vstruct(self, typedescr, fielddescrs):
return VStructInfo(typedescr, fielddescrs)
@@ -392,20 +390,20 @@
liveboxes[i] = box
else:
assert tagbits == TAGVIRTUAL
- value = optimizer.getvalue(box)
- value.visitor_walk_recursive(self)
+ info = optimizer.getptrinfo(box)
+ info.visitor_walk_recursive(box, self)
- for item in pending_setfields:
- pass
- #_, box, fieldbox, _ = item
- # XXX fixme
- #self.register_box(box)
- #self.register_box(fieldbox)
- #value = optimizer.getvalue(fieldbox)
- #value.visitor_walk_recursive(self)
+ for setfield_op in pending_setfields:
+ box = setfield_op.getarg(0)
+ fieldbox = setfield_op.getarg(1)
+ self.register_box(box)
+ self.register_box(fieldbox)
+ info = optimizer.getptrinfo(fieldbox)
+ assert info is not None and info.is_virtual()
+ info.visitor_walk_recursive(fieldbox, self)
self._number_virtuals(liveboxes, optimizer, v)
- self._add_pending_fields([]) # XXX fixme pending_setfields)
+ self._add_pending_fields(pending_setfields)
storage.rd_consts = self.memo.consts
return liveboxes[:]
@@ -450,10 +448,12 @@
memo.nvholes += length - len(vfieldboxes)
for virtualbox, fieldboxes in vfieldboxes.iteritems():
num, _ = untag(self.liveboxes[virtualbox])
- value = optimizer.getvalue(virtualbox)
+ info = optimizer.getptrinfo(virtualbox)
+ assert info.is_virtual()
fieldnums = [self._gettagged(box)
for box in fieldboxes]
- vinfo = self.make_virtual_info(value, fieldnums)
+ descr = info.vdescr
+ vinfo = self.make_virtual_info(descr, info, fieldnums)
# if a new vinfo instance is made, we get the fieldnums list we
# pass in as an attribute. hackish.
if vinfo.fieldnums is not fieldnums:
@@ -478,19 +478,23 @@
n = len(pending_setfields)
rd_pendingfields = lltype.malloc(PENDINGFIELDSP.TO, n)
for i in range(n):
- descr, box, fieldbox, itemindex = pending_setfields[i]
+ op = pending_setfields[i]
+ box = op.getarg(0)
+ fieldbox = op.getarg(1)
+ descr = op.getdescr()
+ #descr, box, fieldbox, itemindex = pending_setfields[i]
lldescr = annlowlevel.cast_instance_to_base_ptr(descr)
num = self._gettagged(box)
fieldnum = self._gettagged(fieldbox)
# the index is limited to 2147483647 (64-bit machines only)
- if itemindex > 2147483647:
- raise TagOverflow
- itemindex = rffi.cast(rffi.INT, itemindex)
+ #if itemindex > 2147483647:
+ # raise TagOverflow
+ #itemindex = rffi.cast(rffi.INT, itemindex)
#
rd_pendingfields[i].lldescr = lldescr
rd_pendingfields[i].num = num
rd_pendingfields[i].fieldnum = fieldnum
- rd_pendingfields[i].itemindex = itemindex
+ rd_pendingfields[i].itemindex = rffi.cast(rffi.INT, 0) # XXXX
itemindex
self.storage.rd_pendingfields = rd_pendingfields
def _gettagged(self, box):
@@ -538,13 +542,13 @@
str(untag(self.fieldnums[i])))
class VirtualInfo(AbstractVirtualStructInfo):
- def __init__(self, known_class, fielddescrs):
+ def __init__(self, descr, fielddescrs):
AbstractVirtualStructInfo.__init__(self, fielddescrs)
- self.known_class = known_class
+ self.descr = descr
@specialize.argtype(1)
def allocate(self, decoder, index):
- struct = decoder.allocate_with_vtable(self.known_class)
+ struct = decoder.allocate_with_vtable(descr=self.descr)
decoder.virtuals_cache.set_ptr(index, struct)
return self.setfields(decoder, struct)
@@ -1008,8 +1012,8 @@
virtualref_boxes = self.consume_virtualref_boxes(numb, end)
return virtualizable_boxes, virtualref_boxes
- def allocate_with_vtable(self, known_class):
- return self.metainterp.execute_new_with_vtable(known_class)
+ def allocate_with_vtable(self, descr=None):
+ return self.metainterp.execute_new_with_vtable(descr=descr)
def allocate_struct(self, typedescr):
return self.metainterp.execute_new(typedescr)
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
@@ -159,9 +159,8 @@
self.trace.append((opnum, list(argboxes), resvalue, descr))
return op
- def execute_new_with_vtable(self, known_class):
- return self.execute_and_record(rop.NEW_WITH_VTABLE, None,
- known_class)
+ def execute_new_with_vtable(self, descr=None):
+ return self.execute_and_record(rop.NEW_WITH_VTABLE, descr)
def execute_new(self, typedescr):
return self.execute_and_record(rop.NEW, typedescr)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit