[pypy-commit] pypy jit-constptr-2: more tests, and store the descr of guards and finish operations

arigo pypy.commits at gmail.com
Thu Mar 31 06:42:31 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-constptr-2
Changeset: r83454:e7787f9361a4
Date: 2016-03-31 11:47 +0100
http://bitbucket.org/pypy/pypy/changeset/e7787f9361a4/

Log:	more tests, and store the descr of guards and finish operations

diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -2,6 +2,7 @@
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.rlib.rarithmetic import ovfcheck, highest_bit
 from rpython.rtyper.lltypesystem import llmemory, lltype, rstr
+from rpython.rtyper.annlowlevel import cast_instance_to_gcref
 from rpython.jit.metainterp import history
 from rpython.jit.metainterp.history import ConstInt, ConstPtr
 from rpython.jit.metainterp.resoperation import ResOperation, rop, OpHelpers
@@ -94,6 +95,7 @@
         op = self.get_box_replacement(op)
         orig_op = op
         replaced = False
+        opnum = op.getopnum()
         for i in range(op.numargs()):
             orig_arg = op.getarg(i)
             arg = self.get_box_replacement(orig_arg)
@@ -101,16 +103,19 @@
                 arg = self.remove_constptr(arg)
             if orig_arg is not arg:
                 if not replaced:
-                    op = op.copy_and_change(op.getopnum())
+                    op = op.copy_and_change(opnum)
                     orig_op.set_forwarded(op)
                     replaced = True
                 op.setarg(i, arg)
-        if rop.is_guard(op.opnum):
+        if rop.is_guard(opnum):
             if not replaced:
-                op = op.copy_and_change(op.getopnum())
+                op = op.copy_and_change(opnum)
                 orig_op.set_forwarded(op)
             op.setfailargs([self.get_box_replacement(a, True)
                             for a in op.getfailargs()])
+        if rop.is_guard(opnum) or opnum == rop.FINISH:
+            llref = cast_instance_to_gcref(op.getdescr())
+            self.gcrefs_output_list.append(llref)
         self._newops.append(op)
 
     def replace_op_with(self, op, newop):
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -79,6 +79,7 @@
         tzdescr = get_field_descr(self.gc_ll_descr, T, 'z')
         myT = lltype.cast_opaque_ptr(llmemory.GCREF,
                                      lltype.malloc(T, zero=True))
+        self.myT = myT
         #
         A = lltype.GcArray(lltype.Signed)
         adescr = get_array_descr(self.gc_ll_descr, A)
@@ -116,6 +117,10 @@
         zdescr = get_field_descr(self.gc_ll_descr, R1, 'z')
         myR1 = lltype.cast_opaque_ptr(llmemory.GCREF,
                                       lltype.malloc(R1, zero=True))
+        myR1b = lltype.cast_opaque_ptr(llmemory.GCREF,
+                                       lltype.malloc(R1, zero=True))
+        self.myR1 = myR1
+        self.myR1b = myR1b
         #
         E = lltype.GcStruct('Empty')
         edescr = get_size_descr(self.gc_ll_descr, E)
@@ -178,9 +183,10 @@
         ops = parse(frm_operations, namespace=namespace)
         expected = parse(to_operations % Evaluator(namespace),
                          namespace=namespace)
+        self.gcrefs = []
         operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
                                                         ops.operations,
-                                                        [])
+                                                        self.gcrefs)
         remap = {}
         for a, b in zip(ops.inputargs, expected.inputargs):
             remap[b] = a
@@ -1297,6 +1303,7 @@
             gc_store(p0, %(xdescr.offset)s, i1, %(xdescr.field_size)s)
             jump()
         """)
+        assert self.gcrefs == [self.myR1]
 
     def test_load_from_gc_table_1p(self):
         self.check_rewrite("""
@@ -1310,6 +1317,7 @@
             gc_store(p0, %(tzdescr.offset)s, i1, %(tzdescr.field_size)s)
             jump()
         """)
+        assert self.gcrefs == [self.myT]
 
     def test_load_from_gc_table_2(self):
         self.check_rewrite("""
@@ -1324,6 +1332,7 @@
             gc_store(p0, %(ydescr.offset)s, f2, %(ydescr.field_size)s)
             jump()
         """)
+        assert self.gcrefs == [self.myR1]
 
     def test_load_from_gc_table_3(self):
         self.check_rewrite("""
@@ -1341,3 +1350,34 @@
             gc_store(p1, %(ydescr.offset)s, f2, %(ydescr.field_size)s)
             jump()
         """)
+        assert self.gcrefs == [self.myR1]
+
+    def test_load_from_gc_table_4(self):
+        self.check_rewrite("""
+            [i1, f2]
+            setfield_gc(ConstPtr(myR1), i1, descr=xdescr)
+            setfield_gc(ConstPtr(myR1b), f2, descr=ydescr)
+            jump()
+        """, """
+            [i1, f2]
+            p0 = load_from_gc_table(0)
+            gc_store(p0, %(xdescr.offset)s, i1, %(xdescr.field_size)s)
+            p1 = load_from_gc_table(1)
+            gc_store(p1, %(ydescr.offset)s, f2, %(ydescr.field_size)s)
+            jump()
+        """)
+        assert self.gcrefs == [self.myR1, self.myR1b]
+
+    def test_guard_in_gcref(self):
+        self.check_rewrite("""
+            [i1, i2]
+            guard_true(i1) []
+            guard_true(i2) []
+            jump()
+        """, """
+            [i1, i2]
+            guard_true(i1) []
+            guard_true(i2) []
+            jump()
+        """)
+        assert len(self.gcrefs) == 2


More information about the pypy-commit mailing list