[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