[pypy-commit] pypy stmgc-c7: delay stm_read until it needs to be done in stmrewrite. limited because we
Raemi
noreply at buildbot.pypy.org
Thu Apr 17 17:28:28 CEST 2014
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: stmgc-c7
Changeset: r70705:10a78b65a5a9
Date: 2014-04-17 17:28 +0200
http://bitbucket.org/pypy/pypy/changeset/10a78b65a5a9/
Log: delay stm_read until it needs to be done in stmrewrite. limited
because we have to do it before every guard
diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -81,11 +81,15 @@
continue
# ---------- fallback case (overwritten in stmrewrite) -----------
self.other_operation(op)
+ self.flush_caches()
return self.newops
def other_operation(self, op):
self.newops.append(op)
+ def flush_caches(self):
+ pass
+
# ----------
def handle_malloc_operation(self, op):
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
@@ -4,10 +4,8 @@
from rpython.jit.metainterp.resoperation import ResOperation, rop
from rpython.jit.metainterp.history import BoxPtr, ConstPtr, ConstInt
from rpython.rlib.objectmodel import specialize
-from rpython.rlib.objectmodel import we_are_translated
from rpython.rlib.debug import (have_debug_prints, debug_start, debug_stop,
debug_print)
-from rpython.jit.codewriter.effectinfo import EffectInfo
class GcStmRewriterAssembler(GcRewriterAssembler):
@@ -18,6 +16,7 @@
GcRewriterAssembler.__init__(self, *args)
self.always_inevitable = False
self.read_barrier_applied = {}
+ self.read_barrier_cache = []
def other_operation(self, op):
opnum = op.getopnum()
@@ -35,6 +34,10 @@
return
# ---------- pure operations, guards ----------
if op.is_always_pure() or op.is_guard() or op.is_ovf():
+ if op.is_guard():
+ # XXX: store this info on the guard descr
+ # to be able to do the stm_reads in resume
+ self.flush_read_barrier_cache()
self.newops.append(op)
return
# ---------- non-pure getfields ----------
@@ -83,7 +86,11 @@
self.newops.append(op)
return
# ---------- jumps, finish, other ignored ops ----------
- if opnum in (rop.JUMP, rop.FINISH, rop.FORCE_TOKEN,
+ if opnum in (rop.JUMP, rop.FINISH):
+ self.flush_read_barrier_cache()
+ self.newops.append(op)
+ return
+ if opnum in (rop.FORCE_TOKEN,
rop.READ_TIMESTAMP, rop.MARK_OPAQUE_PTR,
rop.JIT_DEBUG, rop.KEEPALIVE,
rop.QUASIIMMUT_FIELD, rop.RECORD_KNOWN_CLASS,
@@ -94,6 +101,7 @@
# Check that none of the ops handled here can collect.
# This is not done by the fallback here
assert not op.is_call() and not op.is_malloc()
+ self.flush_caches()
self.fallback_inevitable(op)
def handle_call_assembler(self, op):
@@ -102,10 +110,28 @@
self.next_op_may_be_in_new_transaction()
GcRewriterAssembler.handle_call_assembler(self, op)
+ def emitting_an_operation_that_can_collect(self):
+ self.flush_read_barrier_cache()
+ GcRewriterAssembler.emitting_an_operation_that_can_collect(self)
+
def next_op_may_be_in_new_transaction(self):
+ self.flush_read_barrier_cache()
self.always_inevitable = False
self.read_barrier_applied.clear()
+ def flush_caches(self):
+ self.flush_read_barrier_cache()
+
+ def flush_read_barrier_cache(self):
+ for v_ptr in self.read_barrier_cache:
+ if (v_ptr not in self.read_barrier_applied # if multiple times in this list
+ and v_ptr not in self.write_barrier_applied):
+ op1 = ResOperation(rop.STM_READ, [v_ptr], None)
+ self.newops.append(op1)
+ self.read_barrier_applied[v_ptr] = None
+
+ del self.read_barrier_cache[:]
+
def handle_getfields(self, op):
# XXX missing optimitations: the placement of stm_read should
# ideally be delayed for a bit longer after the getfields; if we
@@ -116,9 +142,7 @@
v_ptr = op.getarg(0)
if (v_ptr not in self.read_barrier_applied and
v_ptr not in self.write_barrier_applied):
- op1 = ResOperation(rop.STM_READ, [v_ptr], None)
- self.newops.append(op1)
- self.read_barrier_applied[v_ptr] = None
+ self.read_barrier_cache.append(v_ptr)
def must_apply_write_barrier(self, val, v=None):
@@ -142,7 +166,6 @@
debug_print("fallback for", op.repr())
def maybe_handle_raw_accesses(self, op):
- from rpython.jit.backend.llsupport.descr import FieldDescr
descr = op.getdescr()
assert isinstance(descr, FieldDescr)
if descr.stm_dont_track_raw_accesses:
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
@@ -157,11 +157,11 @@
""", """
[p1, p2]
p3 = getfield_gc(p1, descr=tzdescr)
- stm_read(p1)
p4 = getfield_gc(p1, descr=tzdescr)
p5 = getfield_gc(p2, descr=tzdescr)
+ p6 = getfield_gc(p1, descr=tzdescr)
+ stm_read(p1)
stm_read(p2)
- p6 = getfield_gc(p1, descr=tzdescr)
jump()
""")
@@ -191,10 +191,10 @@
""", """
[p0, p1, p2]
p3 = getfield_gc(p1, descr=tzdescr)
- stm_read(p1)
cond_call_gc_wb(p2, descr=wbdescr)
setfield_gc(p2, p0, descr=tzdescr)
p4 = getfield_gc(p1, descr=tzdescr)
+ stm_read(p1)
jump()
""", t=NULL)
@@ -388,8 +388,8 @@
""", """
[p1]
p2 = getfield_gc(p1, descr=tzdescr)
+ i2 = getfield_gc(p2, descr=tydescr)
stm_read(p1)
- i2 = getfield_gc(p2, descr=tydescr)
stm_read(p2)
jump(p2, i2)
""")
@@ -406,7 +406,6 @@
""", """
[p1]
i1 = getfield_gc(p1, descr=tydescr)
- stm_read(p1)
i2 = int_add(i1, 1)
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, i2, descr=tydescr)
@@ -767,7 +766,7 @@
""", """
[i0, f0, p1]
p2 = getfield_gc(p1, descr=tzdescr)
- stm_read(p1)
+
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, p2, descr=tzdescr)
@@ -782,7 +781,6 @@
guard_not_forced() []
p3 = getfield_gc(p1, descr=tzdescr)
- stm_read(p1)
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, p3, descr=tzdescr)
""")
@@ -1182,8 +1180,8 @@
""" % d, """
[p1, p3, i1, p4]
p2 = getfield_gc%(pure)s(p1, descr=uxdescr)
+ i4 = getarrayitem_gc%(pure)s(p4, i1, descr=vdescr)
%(comment)s stm_read(p1)
- i4 = getarrayitem_gc%(pure)s(p4, i1, descr=vdescr)
%(comment)s stm_read(p4)
jump(p2)
""" % d, uxdescr=uxdescr, vdescr=vdescr)
More information about the pypy-commit
mailing list