Author: Armin Rigo <ar...@tunes.org> Branch: stm-jit Changeset: r56665:5c1d01b84795 Date: 2012-08-09 20:43 +0200 http://bitbucket.org/pypy/pypy/changeset/5c1d01b84795/
Log: Start to draft the tests for the GcStmReviewerAssembler as a llsupport subclass of GcRewriterAssembler. Unsure yet if this is the ideal level. diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py --- a/pypy/jit/backend/llsupport/gc.py +++ b/pypy/jit/backend/llsupport/gc.py @@ -16,7 +16,6 @@ from pypy.jit.backend.llsupport.descr import GcCache, get_field_descr from pypy.jit.backend.llsupport.descr import get_array_descr from pypy.jit.backend.llsupport.descr import get_call_descr -from pypy.jit.backend.llsupport.rewrite import GcRewriterAssembler from pypy.rpython.memory.gctransform import asmgcroot # ____________________________________________________________ @@ -103,6 +102,11 @@ gcrefs_output_list.append(p) def rewrite_assembler(self, cpu, operations, gcrefs_output_list): + if not self.stm: + from pypy.jit.backend.llsupport.rewrite import GcRewriterAssembler + else: + from pypy.jit.backend.llsupport import stmrewrite + GcRewriterAssembler = stmrewrite.GcStmReviewerAssembler rewriter = GcRewriterAssembler(self, cpu) newops = rewriter.rewrite(operations) # record all GCREFs, because the GC (or Boehm) cannot see them and @@ -658,10 +662,10 @@ GcLLDescription.__init__(self, gcdescr, translator, rtyper) self.translator = translator self.llop1 = llop1 - try: - self.stm = translator.config.translation.stm - except AttributeError: - pass # keep the default of False + #try: + self.stm = gcdescr.config.translation.stm + #except AttributeError: + # pass # keep the default of False if really_not_translated: assert not self.translate_support_code # but half does not work self._initialize_for_tests() diff --git a/pypy/jit/backend/llsupport/test/test_gc.py b/pypy/jit/backend/llsupport/test/test_gc.py --- a/pypy/jit/backend/llsupport/test/test_gc.py +++ b/pypy/jit/backend/llsupport/test/test_gc.py @@ -305,6 +305,7 @@ gcrootfinder = 'asmgcc' gctransformer = 'framework' gcremovetypeptr = False + stm = False class FakeTranslator(object): config = config_ class FakeCPU(object): @@ -405,6 +406,7 @@ assert self.llop1.record == [('barrier', s_adr)] def test_gen_write_barrier(self): + from pypy.jit.backend.llsupport.rewrite import GcRewriterAssembler gc_ll_descr = self.gc_ll_descr llop1 = self.llop1 # diff --git a/pypy/jit/backend/llsupport/test/test_rewrite.py b/pypy/jit/backend/llsupport/test/test_rewrite.py --- a/pypy/jit/backend/llsupport/test/test_rewrite.py +++ b/pypy/jit/backend/llsupport/test/test_rewrite.py @@ -26,6 +26,7 @@ tdescr = get_size_descr(self.gc_ll_descr, T) tdescr.tid = 5678 tzdescr = get_field_descr(self.gc_ll_descr, T, 'z') + tydescr = get_field_descr(self.gc_ll_descr, T, 'y') # A = lltype.GcArray(lltype.Signed) adescr = get_array_descr(self.gc_ll_descr, A) @@ -209,6 +210,7 @@ gcrootfinder = 'asmgcc' gctransformer = 'framework' gcremovetypeptr = False + stm = False gcdescr = get_description(config_) self.gc_ll_descr = GcLLDescr_framework(gcdescr, None, None, None, really_not_translated=True) diff --git a/pypy/jit/backend/llsupport/test/test_stmrewrite.py b/pypy/jit/backend/llsupport/test/test_stmrewrite.py new file mode 100644 --- /dev/null +++ b/pypy/jit/backend/llsupport/test/test_stmrewrite.py @@ -0,0 +1,332 @@ +from pypy.jit.backend.llsupport.gc import * +from pypy.jit.metainterp.gc import get_description +from pypy.jit.backend.llsupport.test.test_rewrite import RewriteTests + + +class TestStm(RewriteTests): + def setup_method(self, meth): + class config_(object): + class translation(object): + stm = True + gc = 'stmgc' + gcrootfinder = 'stm' + gctransformer = 'framework' + gcremovetypeptr = False + gcdescr = get_description(config_) + self.gc_ll_descr = GcLLDescr_framework(gcdescr, None, None, None, + really_not_translated=True) + # + class FakeCPU(object): + def sizeof(self, STRUCT): + descr = SizeDescrWithVTable(104) + descr.tid = 9315 + return descr + self.cpu = FakeCPU() + + def test_rewrite_one_setfield_gc(self): + self.check_rewrite(""" + [p1, p2] + setfield_gc(p1, p2, descr=tzdescr) + jump() + """, """ + [p1] + p3 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setfield_gc(p3, p2, descr=tzdescr) + jump() + """) + + def test_rewrite_unrelated_setfield_gcs(self): + self.check_rewrite(""" + [p1, p2, p3, p4] + setfield_gc(p1, p2, descr=tzdescr) + setfield_gc(p3, p4, descr=tzdescr) + jump() + """, """ + [p1, p2, p3, p4] + p5 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setfield_gc(p5, p2, descr=tzdescr) + p6 = cond_call_gc_wb(p3, 0, descr=wbdescr) + setfield_gc(p6, p4, descr=tzdescr) + jump() + """) + + def test_rewrite_several_setfield_gcs(self): + self.check_rewrite(""" + [p1, p2, i3] + setfield_gc(p1, p2, descr=tzdescr) + setfield_gc(p1, i3, descr=tydescr) + jump() + """, """ + [p1, p2, i3] + p4 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setfield_gc(p4, p2, descr=tzdescr) + setfield_gc(p4, i3, descr=tydescr) + jump() + """) + + def test_rewrite_several_setfield_gcs_over_label(self): + self.check_rewrite(""" + [p1, p2, i3] + setfield_gc(p1, p2, descr=tzdescr) + label(p1, i3) + setfield_gc(p1, i3, descr=tydescr) + jump(p1) + """, """ + [p1, p2, i3] + p4 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setfield_gc(p4, p2, descr=tzdescr) + label(p4, i3) + p5 = cond_call_gc_wb(p4, 0, descr=wbdescr) + setfield_gc(p5, i3, descr=tydescr) + jump(p5) + """) + + def test_ignore_some_operations(self): + oplist = [ + "guard_true(i1) [i2]", # all guards + "i3 = int_add(i1, i2)", # all pure operations + "f3 = float_abs(f1)", + "i3 = ptr_eq(p1, p2)", + "i3 = force_token()", + "i3 = read_timestamp()", + "i3 = mark_opaque_ptr(p1)", + "debug_merge_point(i1, i2)", + "jit_debug(i1, i2)", + "keepalive(i1)", + "i3 = int_sub_ovf(i1, i2)", # is_ovf operations + ] + for op in oplist: + testcase = """ + [i1, i2, p1, p2, f1] + %s + jump(i2) + """ % op + self.check_rewrite(testcase, testcase) + + def test_rewrite_getfield_gc(self): + self.check_rewrite(""" + [p1] + p2 = getfield_gc(p1, descr=tzdescr) + jump(p2) + """, """ + ? + """) + + def test_rewrite_getarrayitem_gc(self): + self.check_rewrite(""" + [p1, i2] + i3 = getarrayitem_gc(p1, i2, descr=adescr) + jump(i3) + """, """ + ? + """) + + def test_rewrite_getinteriorfield_gc(self): + self.check_rewrite(""" + [p1, i2] + i3 = getinteriorfield_gc(p1, ...) + jump(i3) + """, """ + ? + """) + + def test_getfield_raw(self): + self.check_rewrite(""" + [i1, i2] + i3 = getfield_raw(i1, descr=?) + keepalive(i3) # random ignored operation + i4 = getfield_raw(i2, descr=?) + jump(i3, i4) + """, """ + [i1, i2] + call(521) # stm_become_inevitable + i3 = getfield_raw(i1, descr=?) + keepalive(i3) + i4 = getfield_raw(i2, descr=?) + jump(i3, i4) + """) + + def test_getfield_raw_over_label(self): + self.check_rewrite(""" + [i1, i2] + i3 = getfield_raw(i1, descr=?) + label(i1, i2, i3) + i4 = getfield_raw(i2, descr=?) + jump(i3, i4) + """, """ + [i1, i2] + call(521) # stm_become_inevitable + i3 = getfield_raw(i1, descr=?) + label(i1, i2, i3) + call(521) # stm_become_inevitable + i4 = getfield_raw(i2, descr=?) + jump(i3, i4) + """) + + def test_getarrayitem_raw(self): + self.check_rewrite(""" + [i1, i2] + i3 = getarrayitem_raw(i1, 5, descr=?) + i4 = getarrayitem_raw(i2, i3, descr=?) + jump(i3, i4) + """, """ + [i1, i2] + call(521) # stm_become_inevitable + i3 = getarrayitem_raw(i1, 5, descr=?) + i4 = getarrayitem_raw(i2, i3, descr=?) + jump(i3, i4) + """) + + def test_getinteriorfield_raw(self): + self.check_rewrite(""" + [i1, i2] + i3 = getinteriorfield_raw(i1, 5, descr=?) + i4 = getinteriorfield_raw(i2, i3, descr=?) + jump(i3, i4) + """, """ + [i1, i2] + call(521) # stm_become_inevitable + i3 = getinteriorfield_raw(i1, 5, descr=?) + i4 = getinteriorfield_raw(i2, i3, descr=?) + jump(i3, i4) + """) + + def test_new_turns_into_malloc(self): + self.check_rewrite(""" + [] + p0 = new(descr=sdescr) + jump(p0) + """, """ + [] + p0 = call_malloc_nursery(%(sdescr.size)d) + setfield_gc(p0, 1234, descr=tiddescr) + jump(p0) + """) + + def test_rewrite_unrelated_setarrayitem_gcs(self): + self.check_rewrite(""" + [p1, i1, p2, p3, i3, p4] + setarrayitem_gc(p1, i1, p2, descr=?) + setarrayitem_gc(p3, i3, p4, descr=?) + jump() + """, """ + [p1, i1, p2, p3, i3, p4] + p5 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setarrayitem_gc(p5, i1, p2, descr=?) + p6 = cond_call_gc_wb(p3, 0, descr=wbdescr) + setarrayitem_gc(p6, i3, p4, descr=?) + jump() + """) + + def test_rewrite_several_setarrayitem_gcs(self): + self.check_rewrite(""" + [p1, p2, i3, i2, i3] + setarrayitem_gc(p1, i2, p2, descr=?) + setarrayitem_gc(p1, i3, i3, descr=?) + jump() + """, """ + [p1, p1, i3] + p4 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setarrayitem_gc(p4, i2, p2, descr=?) + setarrayitem_gc(p4, i3, p3, descr=?) + jump() + """) + + def test_rewrite_several_setinteriorfield_gc(self): + self.check_rewrite(""" + [p1, p2, i3, i2, i3] + setinteriorfield_gc(p1, i2, p2, descr=?) + setinteriorfield_gc(p1, i3, i3, descr=?) + jump() + """, """ + [p1, p1, i3] + p4 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setinteriorfield_gc(p4, i2, p2, descr=?) + setinteriorfield_gc(p4, i3, p3, descr=?) + jump() + """) + + def test_rewrite_strsetitem_unicodesetitem(self): + self.check_rewrite(""" + [p1, i2, i3] + strsetitem(p1, i2, i3) + unicodesetitem(p1, i2, i3) + jump() + """, """ + [p1, p2, i3] + p4 = cond_call_gc_wb(p1, 0, descr=wbdescr) + strsetitem(p4, i2, i3) + unicodesetitem(p4, i2, i3) + jump() + """) + + def test_fallback_to_inevitable(self): + oplist = [ + "setfield_raw(i1, i2, descr=?)", + "setarrayitem_raw(i1, i2, i3, descr=?)", + "setinteriorfield_raw(i1, i2, i3, descr=?)", + "call_release_gil(123, descr=calldescr2)", + "escape(i1)", # a generic unknown operation + ] + for op in oplist: + self.check_rewrite(""" + [i1, i2, i3, p7] + setfield_gc(p7, 10, descr=tydescr) + %s + setfield_gc(p7, 20, descr=tydescr) + jump(i2, p7) + """ % op, """ + [i1, i2, i3, p7] + p8 = cond_call_gc_wb(p7, 0, descr=wbdescr) + setfield_gc(p8, 10, descr=tydescr) + call(521) # stm_become_inevitable + %s + p9 = cond_call_gc_wb(p8, 0, descr=wbdescr) + setfield_gc(p9, 10, descr=tydescr) + jump(i2, p9) + """ % op) + + def test_copystrcontent(self): + xxx #? + + def test_call_dont_force(self): + for op in ["call(123, descr=calldescr1)", + "call_may_force(123, descr=calldescr1)", + "call_loopinvariant(123, descr=calldescr1)", + ]: + self.check_rewrite(""" + [p1] + setfield_gc(p1, 10, descr=tydescr) + %s + setfield_gc(p1, 20, descr=tydescr) + jump(p1) + """ % op, """ + [p1] + p2 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setfield_gc(p2, 10, descr=tydescr) + %s + setfield_gc(p2, 20, descr=tydescr) + jump(p2) + """ % op) + + def test_call_force(self): + for op in ["call(123, descr=calldescr2)", + "call_assembler(123, descr=loopdescr)", + "call_may_force(123, descr=calldescr2)", + "call_loopinvariant(123, descr=calldescr2)", + ]: + self.check_rewrite(""" + [p1] + setfield_gc(p1, 10, descr=tydescr) + %s + setfield_gc(p1, 20, descr=tydescr) + jump(p1) + """ % op, """ + [p1] + p2 = cond_call_gc_wb(p1, 0, descr=wbdescr) + setfield_gc(p2, 10, descr=tydescr) + %s + p3 = cond_call_gc_wb(p2, 0, descr=wbdescr) + setfield_gc(p3, 20, descr=tydescr) + jump(p3) + """ % op) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit