[pypy-svn] r27953 - in pypy/dist/pypy/rpython: . memory

arigo at codespeak.net arigo at codespeak.net
Wed May 31 10:55:34 CEST 2006


Author: arigo
Date: Wed May 31 10:55:33 2006
New Revision: 27953

Modified:
   pypy/dist/pypy/rpython/annlowlevel.py
   pypy/dist/pypy/rpython/memory/gctransform.py
Log:
Fix a gc=ref bug: a DelayedPointer seen by the exception transformer because
the ll_incref/decref functions are still delayed.  Couldn't find an example
smaller than PyPy that triggers it, sadly.

Also, trying to inline the incref/decrefs.  This gives a 3x speed-up on
richards.


Modified: pypy/dist/pypy/rpython/annlowlevel.py
==============================================================================
--- pypy/dist/pypy/rpython/annlowlevel.py	(original)
+++ pypy/dist/pypy/rpython/annlowlevel.py	Wed May 31 10:55:33 2006
@@ -215,6 +215,7 @@
                                 "originally specified: %r\n"
                                 " found by annotating: %r" %
                                 (graph, s_result, s_real_result))
+        del self.pending[:]
 
     def finish_rtype(self):
         rtyper = self.rtyper
@@ -228,13 +229,14 @@
             lltype.typeOf(p).TO.become(lltype.typeOf(real_p).TO)
             p._become(real_p)
         rtyper.specialize_more_blocks()
-        del self.pending[:]
         del self.delayedreprs[:]
         del self.delayedconsts[:]
+        del self.delayedfuncs[:]
 
     def backend_optimize(self, **flags):
         # only optimize the newly created graphs
         from pypy.translator.backendopt.all import backend_optimizations
         translator = self.rtyper.annotator.translator
         newgraphs = translator.graphs[self.original_graph_count:]
+        self.original_graph_count = len(translator.graphs)
         backend_optimizations(translator, newgraphs, **flags)

Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py	Wed May 31 10:55:33 2006
@@ -264,17 +264,19 @@
     def replace_safe_call(self, op, livevars, block):
         return [SpaceOperation("direct_call", op.args, op.result)]
 
-    def annotate_helper(self, ll_helper, ll_args, ll_result):
+    def annotate_helper(self, ll_helper, ll_args, ll_result, inline=False):
         assert not self.finished_helpers
         args_s = map(annmodel.lltype_to_annotation, ll_args)
         s_result = annmodel.lltype_to_annotation(ll_result)
         graph = self.mixlevelannotator.getgraph(ll_helper, args_s, s_result)
         # the produced graphs does not need to be fully transformed
         self.need_minimal_transform(graph)
+        if inline:
+            self.graphs_to_inline[graph] = True
         return self.mixlevelannotator.graph2delayed(graph)
 
     def inittime_helper(self, ll_helper, ll_args, ll_result):
-        ptr = self.annotate_helper(ll_helper, ll_args, ll_result)
+        ptr = self.annotate_helper(ll_helper, ll_args, ll_result, inline=True)
         return Constant(ptr, lltype.typeOf(ptr))
 
     def finish_helpers(self):
@@ -407,7 +409,7 @@
     HDR = lltype.Struct("header", ("refcount", lltype.Signed))
 
     def __init__(self, translator):
-        super(RefcountingGCTransformer, self).__init__(translator)
+        super(RefcountingGCTransformer, self).__init__(translator, inline=True)
         self.gcheaderbuilder = GCHeaderBuilder(self.HDR)
         gc_header_offset = self.gcheaderbuilder.size_gc_header
         self.deallocator_graphs_needing_transforming = []
@@ -423,6 +425,14 @@
                 gcheader.signed[0] = refcount
                 if refcount == 0:
                     dealloc(adr)
+        def ll_decref_simple(adr):
+            if adr:
+                gcheader = adr - gc_header_offset
+                refcount = gcheader.signed[0] - 1
+                if refcount == 0:
+                    llop.gc_free(lltype.Void, adr)
+                else:
+                    gcheader.signed[0] = refcount
         def ll_no_pointer_dealloc(adr):
             llop.gc_free(lltype.Void, adr)
         if self.translator:
@@ -431,8 +441,11 @@
             self.decref_ptr = self.inittime_helper(
                 ll_decref, [llmemory.Address, lltype.Ptr(ADDRESS_VOID_FUNC)],
                 lltype.Void)
+            self.decref_simple_ptr = self.inittime_helper(
+                ll_decref_simple, [llmemory.Address], lltype.Void)
             self.no_pointer_dealloc_ptr = self.inittime_helper(
                 ll_no_pointer_dealloc, [llmemory.Address], lltype.Void)
+            self.mixlevelannotator.finish()   # for now
         # cache graphs:
         self.decref_funcptrs = {}
         self.static_deallocator_funcptrs = {}
@@ -453,12 +466,17 @@
         result = [SpaceOperation("cast_ptr_to_adr", [var], adr1)]
 
         dealloc_fptr = self.dynamic_deallocation_funcptr_for_type(PTRTYPE.TO)
-        cdealloc_fptr = rmodel.inputconst(
-            lltype.typeOf(dealloc_fptr), dealloc_fptr)
-             
-        result.append(SpaceOperation("direct_call",
-                                     [self.decref_ptr, adr1, cdealloc_fptr],
-                                     varoftype(lltype.Void)))
+        if dealloc_fptr is self.no_pointer_dealloc_ptr.value:
+            # simple case
+            result.append(SpaceOperation("direct_call",
+                                         [self.decref_simple_ptr, adr1],
+                                         varoftype(lltype.Void)))
+        else:
+            cdealloc_fptr = rmodel.inputconst(
+                lltype.typeOf(dealloc_fptr), dealloc_fptr)
+            result.append(SpaceOperation("direct_call",
+                                        [self.decref_ptr, adr1, cdealloc_fptr],
+                                         varoftype(lltype.Void)))
         return result
 
     def replace_gc_protect(self, op, livevars, block):



More information about the Pypy-commit mailing list