[pypy-commit] pypy stmgc-c8: In the JIT, copy the stm_dont_track_raw_accesses logic for getfield_raw
arigo
noreply at buildbot.pypy.org
Wed Jun 24 19:10:45 CEST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c8
Changeset: r78302:972b5349364b
Date: 2015-06-24 19:10 +0200
http://bitbucket.org/pypy/pypy/changeset/972b5349364b/
Log: In the JIT, copy the stm_dont_track_raw_accesses logic for
getfield_raw to also apply to getarrayitem_raw
diff --git a/rpython/jit/backend/llsupport/descr.py b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -84,16 +84,20 @@
class ArrayOrFieldDescr(AbstractDescr):
vinfo = None
+ stm_dont_track_raw_accesses = False
def get_vinfo(self):
return self.vinfo
+ def stm_should_track_raw_accesses(self):
+ return not self.stm_dont_track_raw_accesses
+
+
class FieldDescr(ArrayOrFieldDescr):
name = ''
offset = 0 # help translation
field_size = 0
flag = '\x00'
- stm_dont_track_raw_accesses = False
_immutable = False
def __init__(self, name, offset, field_size, flag,
@@ -147,9 +151,6 @@
def repr_of_descr(self):
return '<Field%s %s %s>' % (self.flag, self.name, self.offset)
- def stm_should_track_raw_accesses(self):
- return not self.stm_dont_track_raw_accesses
-
def get_field_descr(gccache, STRUCT, fieldname):
cache = gccache._cache_field
@@ -219,11 +220,13 @@
_immutable = False
def __init__(self, basesize, itemsize, lendescr, flag,
+ stm_dont_track_raw_accesses=False,
immutable=False):
self.basesize = basesize
self.itemsize = itemsize
self.lendescr = lendescr # or None, if no length
self.flag = flag
+ self.stm_dont_track_raw_accesses = stm_dont_track_raw_accesses
self._immutable = immutable
def is_immutable(self):
@@ -282,9 +285,12 @@
lendescr = None
else:
lendescr = get_field_arraylen_descr(gccache, ARRAY_OR_STRUCT)
+ stm_dont_track_raw_accesses = ARRAY_INSIDE._hints.get(
+ 'stm_dont_track_raw_accesses', False)
flag = get_type_flag(ARRAY_INSIDE.OF)
immutable = bool(ARRAY_INSIDE._immutable_field())
arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag,
+ stm_dont_track_raw_accesses,
immutable)
if ARRAY_OR_STRUCT._gckind == 'gc':
gccache.init_array_descr(ARRAY_OR_STRUCT, arraydescr)
diff --git a/rpython/jit/backend/llsupport/stmrewrite.py b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -1,5 +1,5 @@
from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler
-from rpython.jit.backend.llsupport.descr import CallDescr, FieldDescr
+from rpython.jit.backend.llsupport.descr import CallDescr, ArrayOrFieldDescr
from rpython.jit.metainterp.resoperation import ResOperation, rop
from rpython.jit.metainterp.history import BoxPtr, ConstInt
from rpython.rlib.objectmodel import specialize
@@ -70,8 +70,9 @@
if opnum in (rop.COPYSTRCONTENT, rop.COPYUNICODECONTENT):
self.handle_setters_for_pure_fields(op, 1)
return
- # ---------- raw getfields and setfields ----------
- if opnum in (rop.GETFIELD_RAW, rop.SETFIELD_RAW):
+ # ---------- raw getfields and setfields and arrays ----------
+ if opnum in (rop.GETFIELD_RAW, rop.SETFIELD_RAW,
+ rop.GETARRAYITEM_RAW, rop.SETARRAYITEM_RAW):
if self.maybe_handle_raw_accesses(op):
return
# ---------- labels ----------
@@ -168,7 +169,7 @@
def maybe_handle_raw_accesses(self, op):
descr = op.getdescr()
- assert isinstance(descr, FieldDescr)
+ assert isinstance(descr, ArrayOrFieldDescr)
if descr.stm_dont_track_raw_accesses:
self.newop(op)
return True
diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
--- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
@@ -44,8 +44,6 @@
words.append('ZERO_ARRAY')
words.append('ZERO_PTR_FIELD')
# these always turn inevitable
- words.append('GETARRAYITEM_RAW')
- words.append('SETARRAYITEM_RAW')
words.append('SETINTERIORFIELD_RAW')
words.append('RAW_LOAD')
words.append('RAW_STORE')
@@ -96,6 +94,7 @@
to_operations = to_operations .replace('$DUMMYALLOC', dummyalloc)
for name, value in self.gc_ll_descr.__dict__.items():
if name.endswith('descr') and name[1] == '2' and len(name) == 8:
+ assert name not in namespace
namespace[name] = value # "X2Ydescr"
self.gc_ll_descr.malloc_zero_filled = False
RewriteTests.check_rewrite(self, frm_operations, to_operations,
@@ -525,6 +524,55 @@
jump(i2)
""", fdescr=fdescr)
+ def test_setfield_raw_stm_dont_track_raw_accesses(self):
+ c1 = GcCache(True)
+ F = lltype.Struct('F', ('x', lltype.Signed),
+ hints={'stm_dont_track_raw_accesses': True})
+ fdescr = get_field_descr(c1, F, 'x')
+ self.check_rewrite("""
+ [i1]
+ setfield_raw(i1, 42, descr=fdescr)
+ jump(i1)
+ """, """
+ [i1]
+ setfield_raw(i1, 42, descr=fdescr)
+ $DUMMYALLOC
+ jump(i1)
+ """, fdescr=fdescr)
+
+ def test_getarrayitem_raw_stm_dont_track_raw_accesses(self):
+ c1 = GcCache(True)
+ A = lltype.Array(lltype.Signed, hints={'nolength': True,
+ 'stm_dont_track_raw_accesses': True})
+ aadescr = get_array_descr(c1, A)
+ assert not aadescr.stm_should_track_raw_accesses()
+ self.check_rewrite("""
+ [i1]
+ i2 = getarrayitem_raw(i1, 5, descr=aadescr)
+ jump(i2)
+ """, """
+ [i1]
+ i2 = getarrayitem_raw(i1, 5, descr=aadescr)
+ $DUMMYALLOC
+ jump(i2)
+ """, aadescr=aadescr)
+
+ def test_setarrayitem_raw_stm_dont_track_raw_accesses(self):
+ c1 = GcCache(True)
+ A = lltype.Array(lltype.Signed, hints={'nolength': True,
+ 'stm_dont_track_raw_accesses': True})
+ aadescr = get_array_descr(c1, A)
+ self.check_rewrite("""
+ [i1]
+ setarrayitem_raw(i1, 5, 42, descr=aadescr)
+ jump(i1)
+ """, """
+ [i1]
+ setarrayitem_raw(i1, 5, 42, descr=aadescr)
+ $DUMMYALLOC
+ jump(i1)
+ """, aadescr=aadescr)
+
def test_getfield_raw_over_label(self):
self.check_rewrite("""
[i1, i2]
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -112,7 +112,8 @@
pure))
def do_getarrayitem_raw(cpu, _, arraybox, indexbox, arraydescr):
- return _do_getarrayitem_raw(cpu, False, arraybox, indexbox, arraydescr)
+ pure = not arraydescr.stm_should_track_raw_accesses()
+ return _do_getarrayitem_raw(cpu, pure, arraybox, indexbox, arraydescr)
def do_getarrayitem_raw_pure(cpu, _, arraybox, indexbox, arraydescr):
return _do_getarrayitem_raw(cpu, True, arraybox, indexbox, arraydescr)
More information about the pypy-commit
mailing list