[pypy-commit] pypy stm-thread-2: Finish the setfield tests.
arigo
noreply at buildbot.pypy.org
Tue Sep 11 14:35:40 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: stm-thread-2
Changeset: r57275:c89a58f37e1f
Date: 2012-09-11 14:13 +0200
http://bitbucket.org/pypy/pypy/changeset/c89a58f37e1f/
Log: Finish the setfield tests.
diff --git a/pypy/jit/backend/llsupport/stmrewrite.py b/pypy/jit/backend/llsupport/stmrewrite.py
--- a/pypy/jit/backend/llsupport/stmrewrite.py
+++ b/pypy/jit/backend/llsupport/stmrewrite.py
@@ -27,8 +27,16 @@
def __init__(self, *args):
GcRewriterAssembler.__init__(self, *args)
- self.known_local = set() # set of variables
+ self.known_category = {} # variable: letter (R, W, ...)
self.always_inevitable = False
+ self.more_precise_categories = {
+ 'P': {#'R': self.gc_ll_descr.P2Rdescr,
+ 'W': self.gc_ll_descr.P2Wdescr,
+ },
+ 'R': {#'W': self.gc_ll_descr.R2Wdescr,
+ },
+ 'W': {},
+ }
def rewrite(self, operations):
# overridden method from parent class
@@ -60,7 +68,7 @@
continue
# ---------- calls ----------
if op.is_call():
- self.known_local.clear()
+ self.known_category.clear()
if op.getopnum() == rop.CALL_RELEASE_GIL:
self.fallback_inevitable(op)
else:
@@ -73,7 +81,7 @@
continue
# ---------- labels ----------
if op.getopnum() == rop.LABEL:
- self.known_local.clear()
+ self.known_category.clear()
self.always_inevitable = False
self.newops.append(op)
continue
@@ -94,16 +102,22 @@
return self.newops
- def gen_write_barrier(self, v_base, cat):
+ def gen_write_barrier(self, v):
+ raise NotImplementedError
+
+ def gen_barrier(self, v_base, target_category):
v_base = self.unconstifyptr(v_base)
assert isinstance(v_base, BoxPtr)
- if v_base in self.known_local:
- return v_base # no write barrier needed
- write_barrier_descr = getattr(self.gc_ll_descr, '%sdescr' % (cat,))
+ source_category = self.known_category.get(v_base, 'P')
+ mpcat = self.more_precise_categories[source_category]
+ try:
+ write_barrier_descr = mpcat[target_category]
+ except KeyError:
+ return v_base # no barrier needed
args = [v_base, self.c_zero]
self.newops.append(ResOperation(rop.COND_CALL_GC_WB, args, None,
descr=write_barrier_descr))
- self.known_local.add(v_base)
+ self.known_category[v_base] = target_category
return v_base
def unconstifyptr(self, v):
@@ -117,12 +131,12 @@
def handle_setfield_operations(self, op):
lst = op.getarglist()
- lst[0] = self.gen_write_barrier(lst[0], 'P2W')
+ lst[0] = self.gen_barrier(lst[0], 'W')
self.newops.append(op.copy_and_change(op.getopnum(), args=lst))
def handle_malloc_operation(self, op):
GcRewriterAssembler.handle_malloc_operation(self, op)
- self.known_local.add(op.result)
+ self.known_category[op.result] = 'W'
def handle_getfield_operations(self, op):
lst = op.getarglist()
@@ -131,6 +145,7 @@
return
lst[0] = self.unconstifyptr(lst[0])
write_barrier_descr = self.gc_ll_descr.write_barrier_descr
+ XXX
op_before = ResOperation(rop.STM_READ_BEFORE, [lst[0]], None,
descr=write_barrier_descr)
op_after = ResOperation(rop.STM_READ_AFTER, [lst[0]], None)
diff --git a/pypy/jit/backend/llsupport/test/test_stmrewrite.py b/pypy/jit/backend/llsupport/test/test_stmrewrite.py
--- a/pypy/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/pypy/jit/backend/llsupport/test/test_stmrewrite.py
@@ -53,7 +53,7 @@
""", """
[p1, p2]
p3 = same_as(ConstPtr(t))
- cond_call_gc_wb(p3, 0, descr=wbdescr)
+ cond_call_gc_wb(p3, 0, descr=P2Wdescr)
setfield_gc(p3, p2, descr=tzdescr)
jump()
""")
@@ -81,9 +81,9 @@
jump()
""", """
[p1, p2, p3, p4]
- cond_call_gc_wb(p1, 0, descr=wbdescr)
+ cond_call_gc_wb(p1, 0, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
- cond_call_gc_wb(p3, 0, descr=wbdescr)
+ cond_call_gc_wb(p3, 0, descr=P2Wdescr)
setfield_gc(p3, p4, descr=tzdescr)
jump()
""")
@@ -96,7 +96,7 @@
jump()
""", """
[p1, p2, i3]
- cond_call_gc_wb(p1, 0, descr=wbdescr)
+ cond_call_gc_wb(p1, 0, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
setfield_gc(p1, i3, descr=tydescr)
jump()
@@ -111,10 +111,10 @@
jump(p1)
""", """
[p1, p2, i3]
- cond_call_gc_wb(p1, 0, descr=wbdescr)
+ cond_call_gc_wb(p1, 0, descr=P2Wdescr)
setfield_gc(p1, p2, descr=tzdescr)
label(p1, i3)
- cond_call_gc_wb(p1, 0, descr=wbdescr)
+ cond_call_gc_wb(p1, 0, descr=P2Wdescr)
setfield_gc(p1, i3, descr=tydescr)
jump(p1)
""")
More information about the pypy-commit
mailing list