Author: Armin Rigo <ar...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit