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

Reply via email to