Author: Maciej Fijalkowski <[email protected]>
Branch: gc_no_cleanup_nursery
Changeset: r73622:fe96b6f2e560
Date: 2014-09-21 07:26 +0200
http://bitbucket.org/pypy/pypy/changeset/fe96b6f2e560/
Log: remove spurious zero_ptr_fields + fix tests
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
@@ -45,6 +45,7 @@
self.newops = []
self.known_lengths = {}
self.write_barrier_applied = {}
+ self.delayed_zero_setfields = {}
def rewrite(self, operations):
# we can only remember one malloc since the next malloc can possibly
@@ -71,6 +72,7 @@
# ---------- write barriers ----------
if self.gc_ll_descr.write_barrier_descr is not None:
if op.getopnum() == rop.SETFIELD_GC:
+ self.consider_setfield_gc(op)
self.handle_write_barrier_setfield(op)
continue
if op.getopnum() == rop.SETINTERIORFIELD_GC:
@@ -79,10 +81,18 @@
if op.getopnum() == rop.SETARRAYITEM_GC:
self.handle_write_barrier_setarrayitem(op)
continue
+ else:
+ # this is dead code, but in case we have a gc that does
+ # not have a write barrier and does not zero memory, we would
+ # need to clal it
+ if op.getopnum() == rop.SETFIELD_GC:
+ self.consider_setfield_gc(op)
# ---------- call assembler -----------
if op.getopnum() == rop.CALL_ASSEMBLER:
self.handle_call_assembler(op)
continue
+ if op.getopnum() == rop.JUMP or op.getopnum() == rop.FINISH:
+ self.emit_pending_zeros()
#
self.newops.append(op)
return self.newops
@@ -118,14 +128,28 @@
def clear_gc_fields(self, descr, result):
if self.gc_ll_descr.malloc_zero_filled:
return
+ try:
+ d = self.delayed_zero_setfields[result]
+ except KeyError:
+ d = {}
+ self.delayed_zero_setfields[result] = d
for ofs in descr.offsets_of_gcfields:
- o = ResOperation(rop.ZERO_PTR_FIELD, [result, ConstInt(ofs)], None)
- self.newops.append(o)
+ d[ofs] = None
+
+ def consider_setfield_gc(self, op):
+ offset = op.getdescr().offset
+ try:
+ del self.delayed_zero_setfields[op.getarg(0)][offset]
+ except KeyError:
+ pass
def clear_varsize_gc_fields(self, descr, result, v_length=None):
if self.gc_ll_descr.malloc_zero_filled:
return
if descr.is_array_of_structs() or descr.is_array_of_pointers():
+ # for the case of array of structs, this is for correctness only,
+ # since in practice all GC arrays of structs are allocated
+ # with malloc(zero=True)
self.handle_clear_array_contents(descr, result, v_length)
def handle_new_fixedsize(self, descr, op):
@@ -257,8 +281,16 @@
# forgets the previous MALLOC_NURSERY, if any; and empty the
# set 'write_barrier_applied', so that future SETFIELDs will generate
# a write barrier as usual.
+ # it also writes down all the pending zero ptr fields
self._op_malloc_nursery = None
self.write_barrier_applied.clear()
+ self.emit_pending_zeros()
+
+ def emit_pending_zeros(self):
+ 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)
def _gen_call_malloc_gc(self, args, v_result, descr):
"""Generate a CALL_MALLOC_GC with the given args."""
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
@@ -85,7 +85,6 @@
signedframedescr = self.cpu.signedframedescr
floatframedescr = self.cpu.floatframedescr
casmdescr.compiled_loop_token = clt
- tzdescr = None # noone cares
#
namespace.update(locals())
#
@@ -312,9 +311,9 @@
setfield_gc(p0, 1234, descr=tiddescr)
p1 = int_add(p0, %(sdescr.size)d)
setfield_gc(p1, 5678, descr=tiddescr)
- zero_ptr_field(p1, %(tdescr.offsets_of_gcfields[0])s)
p2 = int_add(p1, %(tdescr.size)d)
setfield_gc(p2, 1234, descr=tiddescr)
+ zero_ptr_field(p1, %(tdescr.offsets_of_gcfields[0])s)
jump()
""")
@@ -599,6 +598,7 @@
%(cdescr.basesize + 129 * cdescr.itemsize)d)
setfield_gc(p1, 8111, descr=tiddescr)
setfield_gc(p1, 129, descr=clendescr)
+ zero_array(p1, 0, 129, descr=cdescr)
call(123456)
cond_call_gc_wb(p1, descr=wbdescr)
setarrayitem_gc(p1, i2, p3, descr=cdescr)
@@ -620,6 +620,7 @@
%(cdescr.basesize + 130 * cdescr.itemsize)d)
setfield_gc(p1, 8111, descr=tiddescr)
setfield_gc(p1, 130, descr=clendescr)
+ zero_array(p1, 0, 130, descr=cdescr)
call(123456)
cond_call_gc_wb_array(p1, i2, descr=wbdescr)
setarrayitem_gc(p1, i2, p3, descr=cdescr)
@@ -651,6 +652,7 @@
%(cdescr.basesize + 5 * cdescr.itemsize)d)
setfield_gc(p1, 8111, descr=tiddescr)
setfield_gc(p1, 5, descr=clendescr)
+ zero_array(p1, 0, 5, descr=cdescr)
label(p1, i2, p3)
cond_call_gc_wb_array(p1, i2, descr=wbdescr)
setarrayitem_gc(p1, i2, p3, descr=cdescr)
@@ -720,6 +722,7 @@
%(cdescr.basesize + 5 * cdescr.itemsize)d)
setfield_gc(p0, 8111, descr=tiddescr)
setfield_gc(p0, 5, descr=clendescr)
+ zero_array(p0, 0, 5, descr=cdescr)
setarrayitem_gc(p0, i2, p1, descr=cdescr)
jump()
""")
@@ -753,6 +756,7 @@
[i0]
p0 = call_malloc_nursery(%(tdescr.size)d)
setfield_gc(p0, 5678, descr=tiddescr)
+ zero_ptr_field(p0, %(tdescr.offsets_of_gcfields[0])s)
p1 = call_malloc_nursery_varsize(1, 1, i0, \
descr=strdescr)
setfield_gc(p1, i0, descr=strlendescr)
@@ -772,6 +776,7 @@
[p1]
p0 = call_malloc_nursery(%(tdescr.size)d)
setfield_gc(p0, 5678, descr=tiddescr)
+ zero_ptr_field(p0, %(tdescr.offsets_of_gcfields[0])s)
label(p0, p1)
cond_call_gc_wb(p0, descr=wbdescr)
setfield_gc(p0, p1, descr=tzdescr)
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
@@ -132,7 +132,8 @@
if res is None:
res = []
# order is not relevant, except for tests
- for name, FIELD in STRUCT._flds.iteritems():
+ for name in STRUCT._names:
+ FIELD = getattr(STRUCT, name)
if isinstance(FIELD, lltype.Ptr) and FIELD._needsgc():
offset, _ = symbolic.get_field_token(STRUCT, name,
gccache.translate_support_code)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit