[pypy-commit] pypy stmgc-c7: don't add stm_read for immutable operations (still very bad)
Remi Meier
noreply at buildbot.pypy.org
Fri Mar 14 17:07:05 CET 2014
Author: Remi Meier
Branch: stmgc-c7
Changeset: r69960:955bfd905138
Date: 2014-03-14 17:07 +0100
http://bitbucket.org/pypy/pypy/changeset/955bfd905138/
Log: don't add stm_read for immutable operations (still very bad)
diff --git a/rpython/translator/stm/readbarrier.py b/rpython/translator/stm/readbarrier.py
--- a/rpython/translator/stm/readbarrier.py
+++ b/rpython/translator/stm/readbarrier.py
@@ -1,4 +1,4 @@
-from rpython.flowspace.model import SpaceOperation
+from rpython.flowspace.model import SpaceOperation, Constant, Variable
from rpython.translator.unsimplify import varoftype
from rpython.rtyper.lltypesystem import lltype
@@ -9,6 +9,31 @@
def is_gc_ptr(T):
return isinstance(T, lltype.Ptr) and T.TO._gckind == 'gc'
+def unwraplist(list_v):
+ for v in list_v:
+ if isinstance(v, Constant):
+ yield v.value
+ elif isinstance(v, Variable):
+ yield None # unknown
+ else:
+ raise AssertionError(v)
+
+def is_immutable(op):
+ if op.opname in ('getfield', 'setfield'):
+ STRUCT = op.args[0].concretetype.TO
+ return STRUCT._immutable_field(op.args[1].value)
+ if op.opname in ('getarrayitem', 'setarrayitem'):
+ ARRAY = op.args[0].concretetype.TO
+ return ARRAY._immutable_field()
+ if op.opname == 'getinteriorfield':
+ OUTER = op.args[0].concretetype.TO
+ return OUTER._immutable_interiorfield(unwraplist(op.args[1:]))
+ if op.opname == 'setinteriorfield':
+ OUTER = op.args[0].concretetype.TO
+ return OUTER._immutable_interiorfield(unwraplist(op.args[1:-1]))
+ if op.opname in ('raw_load', 'raw_store'):
+ return False
+
def insert_stm_read_barrier(transformer, graph):
# We need to put enough 'stm_read' in the graph so that any
@@ -19,13 +44,29 @@
# XXX this can be optimized a lot, but for now we go with the
# simplest possible solution...
#
+ gcremovetypeptr = transformer.translator.config.translation.gcremovetypeptr
+
for block in graph.iterblocks():
if not block.operations:
continue
newops = []
stm_ignored = False
for op in block.operations:
- if op.opname in READ_OPS and is_gc_ptr(op.args[0].concretetype):
+ is_getter = (op.opname in READ_OPS and
+ op.result.concretetype is not lltype.Void and
+ is_gc_ptr(op.args[0].concretetype))
+
+ if (gcremovetypeptr and op.opname in ('getfield', 'setfield') and
+ op.args[1].value == 'typeptr' and
+ op.args[0].concretetype.TO._hints.get('typeptr')):
+ # typeptr is always immutable
+ pass
+ elif ((op.opname in ('getarraysize', 'getinteriorarraysize', 'weakref_deref') and
+ is_gc_ptr(op.args[0].concretetype)) or
+ (is_getter and is_immutable(op))):
+ # immutable getters
+ pass
+ elif is_getter:
if not stm_ignored:
v_none = varoftype(lltype.Void)
newops.append(SpaceOperation('stm_read',
More information about the pypy-commit
mailing list