Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77625:bb48cb213dc0
Date: 2015-05-27 12:22 +0200
http://bitbucket.org/pypy/pypy/changeset/bb48cb213dc0/
Log: fight with rewriting quite a bit more
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
@@ -36,11 +36,13 @@
tid = llop.combine_ushort(lltype.Signed, 0, 0)
def __init__(self, size, count_fields_if_immut=-1,
- gc_fielddescrs=None, all_fielddescrs=None):
+ gc_fielddescrs=None, all_fielddescrs=None,
+ vtable=0):
self.size = size
self.count_fields_if_immut = count_fields_if_immut
self.gc_fielddescrs = gc_fielddescrs
self.all_fielddescrs = all_fielddescrs
+ self.vtable = vtable
def count_fields_if_immutable(self):
return self.count_fields_if_immut
@@ -58,9 +60,12 @@
def is_object(self):
return True
+ def get_vtable(self):
+ return self.vtable
+
BaseSizeDescr = SizeDescr
-def get_size_descr(gccache, STRUCT):
+def get_size_descr(cpu, gccache, STRUCT, is_object):
cache = gccache._cache_size
try:
return cache[STRUCT]
@@ -70,9 +75,12 @@
gc_fielddescrs = heaptracker.gc_fielddescrs(gccache, STRUCT)
all_fielddescrs = heaptracker.all_fielddescrs(gccache, STRUCT)
if heaptracker.has_gcstruct_a_vtable(STRUCT):
+ assert is_object
sizedescr = SizeDescrWithVTable(size, count_fields_if_immut,
- gc_fielddescrs, all_fielddescrs)
+ gc_fielddescrs, all_fielddescrs,
+ heaptracker.get_vtable_for_gcstruct(cpu, GCSTRUCT))
else:
+ assert not is_object
sizedescr = SizeDescr(size, count_fields_if_immut,
gc_fielddescrs, all_fielddescrs)
gccache.init_size_descr(STRUCT, sizedescr)
diff --git a/rpython/jit/backend/llsupport/llmodel.py
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -299,7 +299,7 @@
return rffi.cast(TYPE, x)
def sizeof(self, S, is_object):
- return get_size_descr(self.gc_ll_descr, S)
+ return get_size_descr(self, self.gc_ll_descr, S, is_object)
def fielddescrof(self, STRUCT, fieldname):
return get_field_descr(self.gc_ll_descr, STRUCT, fieldname)
diff --git a/rpython/jit/backend/llsupport/rewrite.py
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -57,14 +57,17 @@
return op
def emit_op(self, op):
- if op.type != 'v':
- op = self.get_box_replacement(op)
- # XXX specialize on number of args
- for i in range(op.numargs()):
- orig_arg = op.getarg(i)
- arg = self.get_box_replacement(orig_arg)
- if orig_arg is not arg:
- xxx
+ op = self.get_box_replacement(op)
+ # XXX specialize on number of args
+ replaced = False
+ for i in range(op.numargs()):
+ orig_arg = op.getarg(i)
+ arg = self.get_box_replacement(orig_arg)
+ if orig_arg is not arg:
+ if not replaced:
+ op = op.copy_and_change(op.getopnum())
+ replaced = True
+ op.setarg(i, arg)
self._newops.append(op)
def replace_op_with(self, op, newop):
@@ -147,14 +150,13 @@
if opnum == rop.NEW:
self.handle_new_fixedsize(op.getdescr(), op)
elif opnum == rop.NEW_WITH_VTABLE:
- classint = op.getarg(0).getint()
- descr = heaptracker.vtable2descr(self.cpu, classint)
+ descr = op.getdescr()
self.handle_new_fixedsize(descr, op)
if self.gc_ll_descr.fielddescr_vtable is not None:
op = ResOperation(rop.SETFIELD_GC,
- [op.result, ConstInt(classint)], None,
+ [op, ConstInt(descr.get_vtable())],
descr=self.gc_ll_descr.fielddescr_vtable)
- self.newops.append(op)
+ self.emit_op(op)
elif opnum == rop.NEW_ARRAY or opnum == rop.NEW_ARRAY_CLEAR:
descr = op.getdescr()
assert isinstance(descr, ArrayDescr)
@@ -220,7 +222,7 @@
assert isinstance(descr, SizeDescr)
size = descr.size
if self.gen_malloc_nursery(size, op):
- self.gen_initialize_tid(op.result, descr.tid)
+ self.gen_initialize_tid(op, descr.tid)
else:
self.gen_malloc_fixedsize(size, descr.tid, op)
self.clear_gc_fields(descr, op)
@@ -399,13 +401,14 @@
for v, d in self.delayed_zero_setfields.iteritems():
for ofs in d.iterkeys():
op = ResOperation(rop.ZERO_PTR_FIELD, [v, ConstInt(ofs)], None)
- self.newops.append(op)
+ self.emit_op(op)
self.delayed_zero_setfields.clear()
def _gen_call_malloc_gc(self, args, v_result, descr):
"""Generate a CALL_MALLOC_GC with the given args."""
self.emitting_an_operation_that_can_collect()
op = ResOperation(rop.CALL_MALLOC_GC, args, descr)
+ self.replace_op_with(v_result, op)
self.emit_op(op)
# In general, don't add v_result to write_barrier_applied:
# v_result might be a large young array.
@@ -529,29 +532,28 @@
self._op_malloc_nursery.setarg(0, ConstInt(total_size))
op = ResOperation(rop.INT_ADD,
[self._v_last_malloced_nursery,
- ConstInt(self._previous_size)],
- v_result)
+ ConstInt(self._previous_size)])
if op is None:
# if we failed to merge with a previous MALLOC_NURSERY, emit one
self.emitting_an_operation_that_can_collect()
op = ResOperation(rop.CALL_MALLOC_NURSERY,
- [ConstInt(size)],
- v_result)
+ [ConstInt(size)])
+ self.replace_op_with(v_result, op)
self._op_malloc_nursery = op
#
- self.newops.append(op)
+ self.emit_op(op)
self._previous_size = size
- self._v_last_malloced_nursery = v_result
- self.write_barrier_applied[v_result] = None
+ self._v_last_malloced_nursery = op
+ self.write_barrier_applied[op] = None
return True
def gen_initialize_tid(self, v_newgcobj, tid):
if self.gc_ll_descr.fielddescr_tid is not None:
# produce a SETFIELD to initialize the GC header
op = ResOperation(rop.SETFIELD_GC,
- [v_newgcobj, ConstInt(tid)], None,
+ [v_newgcobj, ConstInt(tid)],
descr=self.gc_ll_descr.fielddescr_tid)
- self.newops.append(op)
+ self.emit_op(op)
def gen_initialize_len(self, v_newgcobj, v_length, arraylen_descr):
# produce a SETFIELD to initialize the array length
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py
b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -28,13 +28,13 @@
def check_rewrite(self, frm_operations, to_operations, **namespace):
S = lltype.GcStruct('S', ('x', lltype.Signed),
('y', lltype.Signed))
- sdescr = get_size_descr(self.gc_ll_descr, S)
+ sdescr = get_size_descr(self.cpu, self.gc_ll_descr, S, False)
sdescr.tid = 1234
#
T = lltype.GcStruct('T', ('y', lltype.Signed),
('z', lltype.Ptr(S)),
('t', lltype.Signed))
- tdescr = get_size_descr(self.gc_ll_descr, T)
+ tdescr = get_size_descr(self.cpu, self.gc_ll_descr, T, False)
tdescr.tid = 5678
tzdescr = get_field_descr(self.gc_ll_descr, T, 'z')
#
@@ -54,13 +54,14 @@
clendescr = cdescr.lendescr
#
E = lltype.GcStruct('Empty')
- edescr = get_size_descr(self.gc_ll_descr, E)
+ edescr = get_size_descr(self.cpu, self.gc_ll_descr, E, False)
edescr.tid = 9000
#
vtable_descr = self.gc_ll_descr.fielddescr_vtable
O = lltype.GcStruct('O', ('parent', rclass.OBJECT),
('x', lltype.Signed))
o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
+ o_descr = self.cpu.sizeof(O, True)
register_known_gctype(self.cpu, o_vtable, O)
#
tiddescr = self.gc_ll_descr.fielddescr_tid
@@ -111,7 +112,10 @@
operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
ops.operations,
[])
- equaloplists(operations, expected.operations)
+ remap = {}
+ for a, b in zip(ops.inputargs, expected.inputargs):
+ remap[b] = a
+ equaloplists(operations, expected.operations, remap=remap)
lltype.free(frame_info, flavor='raw')
class FakeTracker(object):
@@ -159,7 +163,8 @@
class FakeCPU(BaseFakeCPU):
def sizeof(self, STRUCT, is_object):
assert is_object
- return SizeDescrWithVTable(102, gc_fielddescrs=[])
+ return SizeDescrWithVTable(102, gc_fielddescrs=[],
+ vtable=12)
self.cpu = FakeCPU()
self.gc_ll_descr = GcLLDescr_boehm(None, None, None)
@@ -230,13 +235,13 @@
def test_new_with_vtable(self):
self.check_rewrite("""
[]
- p0 = new_with_vtable(ConstClass(o_vtable))
+ p0 = new_with_vtable(descr=o_descr)
jump()
""", """
[p1]
p0 = call_malloc_gc(ConstClass(malloc_fixedsize), 102, \
descr=malloc_fixedsize_descr)
- setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
+ setfield_gc(p0, 12, descr=vtable_descr)
jump()
""")
@@ -295,7 +300,7 @@
self.gc_ll_descr.malloc_zero_filled = False
#
class FakeCPU(BaseFakeCPU):
- def sizeof(self, STRUCT):
+ def sizeof(self, STRUCT, is_object):
descr = SizeDescrWithVTable(104, gc_fielddescrs=[])
descr.tid = 9315
return descr
diff --git a/rpython/jit/metainterp/optimizeopt/util.py
b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -167,7 +167,8 @@
if op2 in remap:
assert op1.same_box(remap[op2])
else:
- remap[op2] = op1
+ if op1.type != 'v':
+ remap[op2] = op1
if op1.getopnum() not in [rop.JUMP, rop.LABEL, rop.FINISH] and not
op1.is_guard():
assert op1.getdescr() == op2.getdescr()
if op1.getfailargs() or op2.getfailargs():
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit