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