[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