[pypy-commit] pypy stm-jit: Start to draft the tests for the GcStmReviewerAssembler as
arigo
noreply at buildbot.pypy.org
Thu Aug 9 20:44:03 CEST 2012
Author: Armin Rigo <arigo at 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)
More information about the pypy-commit
mailing list