Author: Gregor Wegberg <[email protected]>
Branch: gc-incminimark-pinning
Changeset: r72825:79cdf621b8fb
Date: 2014-08-16 15:58 +0200
http://bitbucket.org/pypy/pypy/changeset/79cdf621b8fb/

Log:    if the same pointer is used multiple times, only use one array
        element.

        Implements the optimisation that was pointed to in commit
        5dcc35cb8954a4ce373804707a6745c8adb3487c

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
@@ -18,6 +18,7 @@
 from rpython.jit.backend.llsupport.descr import get_call_descr
 from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler
 from rpython.memory.gctransform import asmgcroot
+from rpython.rtyper.lltypesystem import llmemory
 
 class PinnedObjectTracker(object):
     """Simple helper class to keep informations regarding the 'GcArray'
@@ -26,21 +27,26 @@
 
     _ref_array_type = lltype.GcArray(llmemory.GCREF)
 
-    def __init__(self, cpu, size):
-        self._size = size
-        self._next_item = 0
+    def __init__(self, cpu, pointers):
+        # prepare GC array to hold the pointers
+        size = len(pointers)
         self._ref_array = lltype.malloc(PinnedObjectTracker._ref_array_type, 
size)
         self.ref_array_descr = 
cpu.arraydescrof(PinnedObjectTracker._ref_array_type)
         self.ref_array_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, 
self._ref_array)
         self.const_ptr_gcref_array = ConstPtr(self.ref_array_gcref)
+        #
+        # assign each pointer an index and put the pointer into the GC array
+        self._indexes = {}
+        for index in range(len(pointers)):
+            ptr = pointers[index]
+            self._indexes[llmemory.cast_ptr_to_adr(ptr)] = 
llmemory.cast_int_to_adr(index)
+            self._ref_array[index] = ptr
 
-    def add_ref(self, ref):
-        index = self._next_item
-        assert index < self._size
-        self._next_item += 1
-        self._ref_array[index] = ref
+    def add_ref(self, ptr):
+        assert llmemory.cast_ptr_to_adr(ptr) in self._indexes
+        index = 
llmemory.cast_adr_to_int(self._indexes[llmemory.cast_ptr_to_adr(ptr)])
+        assert ptr == self._ref_array[index]
         return index
-
 # ____________________________________________________________
 
 class GcLLDescription(GcCache):
@@ -114,7 +120,8 @@
     def gc_malloc_unicode(self, num_elem):
         return self._bh_malloc_array(num_elem, self.unicode_descr)
 
-    def _record_constptrs(self, op, gcrefs_output_list, moving_output_list):
+    def _record_constptrs(self, op, gcrefs_output_list, moving_output_list,
+            known_pointers):
         moving_output_list[op] = []
         for i in range(op.numargs()):
             v = op.getarg(i)
@@ -124,6 +131,8 @@
                     gcrefs_output_list.append(p)
                 else:
                     moving_output_list[op].append(i)
+                    if p not in known_pointers:
+                        known_pointers.append(p)
         #
         if op.is_guard() or op.getopnum() == rop.FINISH:
             llref = cast_instance_to_gcref(op.getdescr())
@@ -165,11 +174,13 @@
         newnewops = [] # XXX better name... (groggi)
 
         moving_output_list = {}
+        known_pointers = []
         for op in newops:
-            self._record_constptrs(op, gcrefs_output_list, moving_output_list)
+            self._record_constptrs(op, gcrefs_output_list, moving_output_list,
+                    known_pointers)
         #
         if len(moving_output_list) > 0:
-            pinned_obj_tracker = PinnedObjectTracker(cpu, 
len(moving_output_list))
+            pinned_obj_tracker = PinnedObjectTracker(cpu, known_pointers)
             if not we_are_translated():
                 self.last_pinned_object_tracker = pinned_obj_tracker
             gcrefs_output_list.append(pinned_obj_tracker.ref_array_gcref)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to