[pypy-commit] pypy stmgc-c7-rewindjmp: Fix the test and the code for stmrewrite
arigo
noreply at buildbot.pypy.org
Sun Aug 17 20:14:06 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7-rewindjmp
Changeset: r72853:477a18370cb0
Date: 2014-08-17 20:13 +0200
http://bitbucket.org/pypy/pypy/changeset/477a18370cb0/
Log: Fix the test and the code for stmrewrite
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
@@ -23,14 +23,6 @@
self.newops.append(op)
return
# ---------- transaction breaks ----------
- if opnum == rop.STM_SHOULD_BREAK_TRANSACTION:
- self.handle_should_break_transaction(op)
- return
- if opnum == rop.STM_TRANSACTION_BREAK:
- self.emitting_an_operation_that_can_collect()
- self.next_op_may_be_in_new_transaction()
- self.newops.append(op)
- return
if opnum == rop.STM_HINT_COMMIT_SOON:
self._do_stm_call('stm_hint_commit_soon', [], None,
op.stm_location)
@@ -84,14 +76,19 @@
self.next_op_may_be_in_new_transaction()
self.newops.append(op)
return
- # ---------- jumps, finish, other ignored ops ----------
- if opnum in (rop.JUMP, rop.FINISH, rop.FORCE_TOKEN,
+ # ---------- other ignored ops ----------
+ if opnum in (rop.STM_SHOULD_BREAK_TRANSACTION, rop.FORCE_TOKEN,
rop.READ_TIMESTAMP, rop.MARK_OPAQUE_PTR,
rop.JIT_DEBUG, rop.KEEPALIVE,
rop.QUASIIMMUT_FIELD, rop.RECORD_KNOWN_CLASS,
):
self.newops.append(op)
return
+ # ---------- jump, finish ----------
+ if opnum == rop.JUMP or opnum == rop.FINISH:
+ self.add_dummy_allocation()
+ self.newops.append(op)
+ return
# ---------- fall-back ----------
# Check that none of the ops handled here can collect.
# This is not done by the fallback here
@@ -122,7 +119,7 @@
self.newops.append(op1)
self.read_barrier_applied[v_ptr] = None
- def handle_should_break_transaction(self, op):
+ def add_dummy_allocation(self):
if not self.does_any_allocation:
# do a fake allocation since this is needed to check
# for requested safe-points:
@@ -134,9 +131,6 @@
assert self._op_malloc_nursery is None # no ongoing allocation
self.gen_malloc_nursery(size, v_result)
- self.newops.append(op)
-
-
def must_apply_write_barrier(self, val, v=None):
return val not in self.write_barrier_applied
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
@@ -65,8 +65,10 @@
def check_rewrite(self, frm_operations, to_operations, **namespace):
inev = ("call(ConstClass(stm_try_inevitable),"
" descr=stm_try_inevitable_descr)")
+ dummyalloc = "p999 = call_malloc_nursery(16)"
frm_operations = frm_operations.replace('$INEV', inev)
to_operations = to_operations .replace('$INEV', inev)
+ 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:
namespace[name] = value # "X2Ydescr"
@@ -94,6 +96,7 @@
[]
%s
call(123, descr=cd)
+ $DUMMYALLOC
jump()
""" % ("$INEV" if inev else "",), cd=calldescr)
@@ -106,6 +109,7 @@
[p1, p2]
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, p2, descr=tzdescr)
+ $DUMMYALLOC
jump()
""")
@@ -118,6 +122,7 @@
[p1, i2]
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, i2, descr=tzdescr)
+ $DUMMYALLOC
jump()
""")
@@ -132,6 +137,7 @@
[p1, p2]
cond_call_gc_wb(ConstPtr(t), descr=wbdescr)
setfield_gc(ConstPtr(t), p2, descr=tzdescr)
+ $DUMMYALLOC
jump()
""", t=NULL)
@@ -144,6 +150,7 @@
[p1]
p2 = getfield_gc(p1, descr=tzdescr)
stm_read(p1)
+ $DUMMYALLOC
jump()
""")
@@ -163,6 +170,7 @@
p5 = getfield_gc(p2, descr=tzdescr)
stm_read(p2)
p6 = getfield_gc(p1, descr=tzdescr)
+ $DUMMYALLOC
jump()
""")
@@ -177,6 +185,7 @@
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, i2, descr=tydescr)
p3 = getfield_gc(p1, descr=tzdescr)
+ $DUMMYALLOC
jump(p3)
""")
@@ -196,6 +205,7 @@
cond_call_gc_wb(p2, descr=wbdescr)
setfield_gc(p2, p0, descr=tzdescr)
p4 = getfield_gc(p1, descr=tzdescr)
+ $DUMMYALLOC
jump()
""", t=NULL)
@@ -274,6 +284,7 @@
setfield_gc(p1, p2, descr=tzdescr)
cond_call_gc_wb(p3, descr=wbdescr)
setfield_gc(p3, p4, descr=tzdescr)
+ $DUMMYALLOC
jump()
""")
@@ -288,6 +299,7 @@
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, p2, descr=tzdescr)
setfield_gc(p1, i3, descr=tydescr)
+ $DUMMYALLOC
jump()
""")
@@ -305,6 +317,7 @@
label(p1, i3)
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, i3, descr=tydescr)
+ $DUMMYALLOC
jump(p1)
""")
@@ -317,6 +330,7 @@
""", """
[i1, i2]
+ $DUMMYALLOC
jump()
""")
@@ -337,9 +351,10 @@
testcase = """
[i1, i2, p1, p2, f1]
%s
+ $DUMMYALLOC
finish()
""" % op
- self.check_rewrite(testcase, testcase)
+ self.check_rewrite(testcase.replace('$DUMMYALLOC', ''), testcase)
def test_rewrite_getfield_gc_const(self):
TP = lltype.GcArray(lltype.Signed)
@@ -352,9 +367,9 @@
[p1]
p2 = getfield_gc(ConstPtr(t), descr=tzdescr)
stm_read(ConstPtr(t))
+ $DUMMYALLOC
jump(p2)
""", t=NULL)
- # XXX could do better: G2Rdescr
def test_rewrite_getarrayitem_gc(self):
self.check_rewrite("""
@@ -365,6 +380,7 @@
[p1, i2]
i3 = getarrayitem_gc(p1, i2, descr=adescr)
stm_read(p1)
+ $DUMMYALLOC
jump(i3)
""")
@@ -377,6 +393,7 @@
[p1, i2]
i3 = getinteriorfield_gc(p1, i2, descr=intzdescr)
stm_read(p1)
+ $DUMMYALLOC
jump(i3)
""")
@@ -392,6 +409,7 @@
stm_read(p1)
i2 = getfield_gc(p2, descr=tydescr)
stm_read(p2)
+ $DUMMYALLOC
jump(p2, i2)
""")
@@ -411,7 +429,7 @@
i2 = int_add(i1, 1)
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, i2, descr=tydescr)
-
+ $DUMMYALLOC
jump(p1)
""")
@@ -438,6 +456,7 @@
call(p2, descr=calldescr1)
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, 5, descr=tydescr)
+ $DUMMYALLOC
jump(p2)
""", calldescr1=calldescr1)
@@ -454,7 +473,7 @@
i3 = getfield_raw(i1, descr=tydescr)
keepalive(i3)
i4 = getfield_raw(i2, descr=tydescr)
-
+ $DUMMYALLOC
jump(i3, i4)
""")
@@ -470,7 +489,7 @@
""", """
[i1]
i2 = getfield_raw(i1, descr=fdescr)
-
+ $DUMMYALLOC
jump(i2)
""", fdescr=fdescr)
@@ -488,7 +507,7 @@
label(i1, i2, i3)
$INEV
i4 = getfield_raw(i2, descr=tydescr)
-
+ $DUMMYALLOC
jump(i3, i4)
""")
@@ -503,7 +522,7 @@
$INEV
i3 = getarrayitem_raw(i1, 5, descr=adescr)
i4 = getarrayitem_raw(i2, i3, descr=adescr)
-
+ $DUMMYALLOC
jump(i3, i4)
""")
@@ -519,7 +538,7 @@
setarrayitem_gc(p1, i1, p2, descr=adescr)
cond_call_gc_wb_array(p3, i3, descr=wbdescr)
setarrayitem_gc(p3, i3, p4, descr=adescr)
-
+ $DUMMYALLOC
jump()
""")
@@ -537,7 +556,7 @@
i4 = read_timestamp()
cond_call_gc_wb_array(p1, i3, descr=wbdescr)
setarrayitem_gc(p1, i3, p3, descr=adescr)
-
+ $DUMMYALLOC
jump()
""")
@@ -555,7 +574,7 @@
i4 = read_timestamp()
cond_call_gc_wb_array(p1, i3, descr=wbdescr)
setinteriorfield_gc(p1, i3, p3, descr=intzdescr)
-
+ $DUMMYALLOC
jump()
""")
@@ -570,7 +589,7 @@
cond_call_gc_wb(p1, descr=wbdescr)
strsetitem(p1, i2, i3)
unicodesetitem(p1, i2, i3)
-
+ $DUMMYALLOC
jump()
""")
@@ -585,6 +604,7 @@
[i2, i3]
p1 = call_malloc_nursery_varsize(1, 1, i3, descr=strdescr)
setfield_gc(p1, i3, descr=strlendescr)
+ cond_call_gc_wb(p1, descr=wbdescr)
strsetitem(p1, i2, i3)
unicodesetitem(p1, i2, i3)
jump()
@@ -600,6 +620,7 @@
[p1, i2, i3]
i4=strgetitem(p1, i2)
i5=unicodegetitem(p1, i2)
+ $DUMMYALLOC
jump()
""")
@@ -623,6 +644,7 @@
cond_call_gc_wb(p7, descr=wbdescr)
setfield_gc(p7, 20, descr=tydescr)
+ $DUMMYALLOC
jump(i2, p7)
""", calldescr2=calldescr2)
@@ -651,6 +673,7 @@
cond_call_gc_wb(p7, descr=wbdescr)
setfield_gc(p7, 20, descr=tydescr)
+ $DUMMYALLOC
jump(i2, p7)
""" % op, calldescr2=calldescr2)
@@ -664,6 +687,7 @@
[p1, i1, i2, i3]
p2 = call_malloc_nursery_varsize(1, 1, i3, descr=strdescr)
setfield_gc(p2, i3, descr=strlendescr)
+ cond_call_gc_wb(p2, descr=wbdescr)
copystrcontent(p1, p2, i1, i2, i3)
jump()
""")
@@ -677,6 +701,7 @@
[p1, p2, i1, i2, i3]
cond_call_gc_wb(p2, descr=wbdescr)
copystrcontent(p1, p2, i1, i2, i3)
+ $DUMMYALLOC
jump()
""")
@@ -698,7 +723,7 @@
setfield_gc(p1, 10, descr=tydescr)
%s
setfield_gc(p1, 20, descr=tydescr)
-
+ $DUMMYALLOC
jump(p1)
""" % op)
@@ -734,6 +759,7 @@
cond_call_gc_wb(p1, descr=wbdescr)
setfield_gc(p1, 20, descr=tydescr)
+ $DUMMYALLOC
jump(p1)
""" % (op, guard, tr_break), calldescr2=calldescr2)
@@ -794,24 +820,18 @@
self.check_rewrite("""
[p1, p2]
i1 = ptr_eq(p1, NULL)
- jump(i1)
""", """
[p1, p2]
i1 = ptr_eq(p1, NULL)
-
- jump(i1)
""")
def test_ptr_eq(self):
self.check_rewrite("""
[p1, p2]
i1 = ptr_eq(p1, p2)
- jump(i1)
""", """
[p1, p2]
i1 = ptr_eq(p1, p2)
-
- jump(i1)
""")
def test_instance_ptr_eq(self):
@@ -822,7 +842,7 @@
""", """
[p1, p2]
i1 = instance_ptr_eq(p1, p2)
-
+ $DUMMYALLOC
jump(i1)
""")
@@ -830,24 +850,18 @@
self.check_rewrite("""
[p1, p2]
i1 = ptr_ne(p1, p2)
- jump(i1)
""", """
[p1, p2]
i1 = ptr_ne(p1, p2)
-
- jump(i1)
""")
def test_instance_ptr_ne(self):
self.check_rewrite("""
[p1, p2]
i1 = instance_ptr_ne(p1, p2)
- jump(i1)
""", """
[p1, p2]
i1 = instance_ptr_ne(p1, p2)
-
- jump(i1)
""")
# ----------- tests copied from rewrite.py -------------
@@ -856,10 +870,12 @@
self.check_rewrite("""
[p1]
p0 = new(descr=sdescr)
+ jump()
""", """
[p1]
p0 = call_malloc_nursery(%(sdescr.size)d)
setfield_gc(p0, 1234, descr=tiddescr)
+ jump()
""")
def test_rewrite_assembler_new3_to_malloc(self):
@@ -868,6 +884,7 @@
p0 = new(descr=sdescr)
p1 = new(descr=tdescr)
p2 = new(descr=sdescr)
+ jump()
""", """
[]
p0 = call_malloc_nursery( \
@@ -877,18 +894,21 @@
setfield_gc(p1, 5678, descr=tiddescr)
p2 = int_add(p1, %(tdescr.size)d)
setfield_gc(p2, 1234, descr=tiddescr)
+ jump()
""")
def test_rewrite_assembler_new_array_fixed_to_malloc(self):
self.check_rewrite("""
[]
p0 = new_array(10, descr=adescr)
+ jump()
""", """
[]
p0 = call_malloc_nursery( \
%(adescr.basesize + 10 * adescr.itemsize)d)
setfield_gc(p0, 4321, descr=tiddescr)
setfield_gc(p0, 10, descr=alendescr)
+ jump()
""")
def test_rewrite_assembler_new_and_new_array_fixed_to_malloc(self):
@@ -896,6 +916,7 @@
[]
p0 = new(descr=sdescr)
p1 = new_array(10, descr=adescr)
+ jump()
""", """
[]
p0 = call_malloc_nursery( \
@@ -905,17 +926,20 @@
p1 = int_add(p0, %(sdescr.size)d)
setfield_gc(p1, 4321, descr=tiddescr)
setfield_gc(p1, 10, descr=alendescr)
+ jump()
""")
def test_rewrite_assembler_round_up(self):
self.check_rewrite("""
[]
p0 = new_array(6, descr=bdescr)
+ jump()
""", """
[]
p0 = call_malloc_nursery(%(bdescr.basesize + 8)d)
setfield_gc(p0, 8765, descr=tiddescr)
setfield_gc(p0, 6, descr=blendescr)
+ jump()
""")
def test_rewrite_assembler_round_up_always(self):
@@ -925,6 +949,7 @@
p1 = new_array(5, descr=bdescr)
p2 = new_array(5, descr=bdescr)
p3 = new_array(5, descr=bdescr)
+ jump()
""", """
[]
p0 = call_malloc_nursery(%(4 * (bdescr.basesize + 8))d)
@@ -939,6 +964,7 @@
p3 = int_add(p2, %(bdescr.basesize + 8)d)
setfield_gc(p3, 8765, descr=tiddescr)
setfield_gc(p3, 5, descr=blendescr)
+ jump()
""")
def test_rewrite_assembler_minimal_size(self):
@@ -946,12 +972,14 @@
[]
p0 = new(descr=edescr)
p1 = new(descr=edescr)
+ jump()
""", """
[]
p0 = call_malloc_nursery(%(4*WORD)d)
setfield_gc(p0, 9000, descr=tiddescr)
p1 = int_add(p0, %(2*WORD)d)
setfield_gc(p1, 9000, descr=tiddescr)
+ jump()
""")
def test_rewrite_assembler_variable_size(self):
@@ -1086,6 +1114,7 @@
p1 = newunicode(10)
p2 = newunicode(i2)
p3 = newstr(i2)
+ jump()
""", """
[i2]
p0 = call_malloc_nursery( \
@@ -1093,15 +1122,20 @@
unicodedescr.basesize + 10 * unicodedescr.itemsize)d)
setfield_gc(p0, %(strdescr.tid)d, descr=tiddescr)
setfield_gc(p0, 14, descr=strlendescr)
+
p1 = int_add(p0, %(strdescr.basesize + 16 * strdescr.itemsize)d)
setfield_gc(p1, %(unicodedescr.tid)d, descr=tiddescr)
setfield_gc(p1, 10, descr=unicodelendescr)
+
p2 = call_malloc_nursery_varsize(2, 4, i2, \
descr=unicodedescr)
setfield_gc(p2, i2, descr=unicodelendescr)
+
p3 = call_malloc_nursery_varsize(1, 1, i2, \
descr=strdescr)
setfield_gc(p3, i2, descr=strlendescr)
+
+ jump()
""")
def test_label_makes_size_unknown(self):
@@ -1134,7 +1168,8 @@
[i0, f0]
p0 = new_array(5, descr=bdescr)
p1 = new_array(5, descr=bdescr)
- stm_transaction_break(1)
+ call_may_force(12345, descr=calldescr2) # stm_transaction_break
+ guard_not_forced() []
p2 = new_array(5, descr=bdescr)
""", """
[i0, f0]
@@ -1146,7 +1181,8 @@
setfield_gc(p1, 8765, descr=tiddescr)
setfield_gc(p1, 5, descr=blendescr)
- stm_transaction_break(1)
+ call_may_force(12345, descr=calldescr2) # stm_transaction_break
+ guard_not_forced() []
p2 = call_malloc_nursery( \
%(bdescr.basesize + 8)d)
@@ -1188,6 +1224,7 @@
%(comment)s stm_read(p1)
i4 = getarrayitem_gc%(pure)s(p4, i1, descr=vdescr)
%(comment)s stm_read(p4)
+ $DUMMYALLOC
jump(p2)
""" % d, uxdescr=uxdescr, vdescr=vdescr)
@@ -1195,24 +1232,20 @@
self.check_rewrite("""
[p1, p2]
setfield_gc(p1, p2, descr=tzdescr) {50}
- jump()
""", """
[p1, p2]
cond_call_gc_wb(p1, descr=wbdescr) {50}
setfield_gc(p1, p2, descr=tzdescr) {50}
- jump()
""")
def test_stm_location_2(self):
self.check_rewrite("""
[i1]
i3 = getfield_raw(i1, descr=tydescr) {52}
- jump(i3)
""", """
[i1]
$INEV {52}
i3 = getfield_raw(i1, descr=tydescr) {52}
- jump(i3)
""")
def test_stm_location_3(self):
@@ -1240,8 +1273,8 @@
jump(i1)
""", """
[]
- p99 = call_malloc_nursery(16)
i1 = stm_should_break_transaction()
+ $DUMMYALLOC
jump(i1)
""")
@@ -1267,9 +1300,9 @@
jump(i1, i2)
""", """
[]
- p99 = call_malloc_nursery(16)
i1 = stm_should_break_transaction()
i2 = stm_should_break_transaction()
+ $DUMMYALLOC
jump(i1, i2)
""")
@@ -1285,7 +1318,7 @@
p2 = call_malloc_nursery(%(tdescr.size)d)
setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
label()
- p99 = call_malloc_nursery(16)
i1 = stm_should_break_transaction()
+ $DUMMYALLOC
jump(i1)
""")
More information about the pypy-commit
mailing list