Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79246:975bc5a56e3a
Date: 2015-08-27 11:42 +0200
http://bitbucket.org/pypy/pypy/changeset/975bc5a56e3a/

Log:    fix test_optimizeopt for the new virtualstate

diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -45,8 +45,18 @@
     enable_opts = 
"intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
 
     def optimize_loop(self, ops, expected, expected_preamble=None,
-                      call_pure_results=None, expected_short=None):
+                      call_pure_results=None, expected_short=None,
+                      jump_values=None):
         loop = self.parse(ops, postprocess=self.postprocess)
+        jump_op = loop.operations[-1]
+        if jump_values is not None:
+            for i, v in enumerate(jump_values):
+                if v is not None:
+                    jump_op.getarg(i).setref_base(v)
+        else:
+            for i, box in enumerate(jump_op.getarglist()):
+                if box.type == 'r' and not box.is_constant():
+                    box.setref_base(self.nodefulladdr)
         if expected != "crash!":
             expected = self.parse(expected)
         if expected_preamble:
@@ -796,7 +806,8 @@
         jump(i1, p3)
         """
         # We cannot track virtuals that survive for more than two iterations.
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble,
+                           jump_values=[None, self.nodefulladdr, None])
 
     def test_p123_nested(self):
         ops = """
@@ -829,7 +840,8 @@
         setfield_gc(p4, p1sub, descr=nextdescr)
         jump(i1, p4)
         """
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble,
+                      jump_values=[None, self.nodefulladdr, self.nodefulladdr])
 
     def test_p123_anti_nested(self):
         ops = """
@@ -865,7 +877,8 @@
         setfield_gc(p1, p3sub, descr=nextdescr)
         jump(i1, p1, p3sub, i1)
         """
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble,
+                jump_values=[None, self.nodefulladdr, self.nodefulladdr, None])
 
     def test_dont_delay_setfields(self):
         ops = """
@@ -902,7 +915,8 @@
         setfield_gc(p3, i2, descr=valuedescr)
         jump(p3, i2)
         """
-        self.optimize_loop(ops, expected, preamble, expected_short=short)
+        self.optimize_loop(ops, expected, preamble, expected_short=short,
+                           jump_values=[None, self.nodefulladdr])
 
     # ----------
 
@@ -1004,7 +1018,8 @@
         i1 = int_add(i2, i)
         jump(i, i1)
         """
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble,
+                           jump_values=[None, self.nodefulladdr])
 
     def test_virtual_float(self):
         ops = """
@@ -1477,7 +1492,7 @@
         p33 = new_array(0, descr=arraydescr)
         setfield_gc(p31, p33, descr=bdescr)
         p35 = new_with_vtable(descr=nodesize)
-        setfield_gc(p35, p31, descr=valuedescr)
+        setfield_gc(p35, p31, descr=nexttupledescr)
         jump(p0, p35)
         """
         expected = """
@@ -1493,7 +1508,7 @@
         guard_isnull(p18) [p0, p8]
         p31 = new(descr=ssize)
         p35 = new_with_vtable(descr=nodesize)
-        setfield_gc(p35, p31, descr=valuedescr)
+        setfield_gc(p35, p31, descr=nexttupledescr)
         jump(p0, p35)
         """
         expected = """
@@ -1508,7 +1523,7 @@
         guard_isnull(p18) [p0, p8]
         p31 = new(descr=ssize)
         p35 = new_with_vtable(descr=nodesize)
-        setfield_gc(p35, p31, descr=valuedescr)
+        setfield_gc(p35, p31, descr=nexttupledescr)
         jump(p0, p35, p19, p18)
         """
         expected = """
@@ -1553,7 +1568,8 @@
         i2 = int_add(25, i1)
         jump(i2)
         """
-        self.optimize_loop(ops, expected)
+        jump_values = [self.arrayref]
+        self.optimize_loop(ops, expected, jump_values=jump_values)
 
     def test_varray_alloc_and_set(self):
         ops = """
@@ -1651,7 +1667,8 @@
         guard_value(i3, 15) []
         jump(5)
         """
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble,
+                           jump_values=[None, self.arrayref])
 
     def test_p123_array(self):
         ops = """
@@ -1677,7 +1694,8 @@
         jump(i1, p1)
         """
         # We cannot track virtuals that survive for more than two iterations.
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble,
+                           jump_values=[None, self.arrayref, None])
 
     def test_varray_forced_1(self):
         ops = """
@@ -1720,7 +1738,8 @@
         escape_n(i1)
         jump(i1)
         """
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble,
+                           jump_values=[None, self.tupleaddr])
 
     def test_p123_vstruct(self):
         ops = """
@@ -1746,7 +1765,8 @@
         jump(i1, p1)
         """
         # We cannot track virtuals that survive for more than two iterations.
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble,
+                           jump_values=[None, self.tupleaddr, None])
 
     def test_virtual_raw_malloc_basic(self):
         ops = """
@@ -2764,7 +2784,8 @@
         p3 = escape_r()
         jump(i0, p3)
         """
-        self.optimize_loop(ops, expected)
+        self.optimize_loop(ops, expected,
+                           jump_values=[None, self.array2ref])
 
     def test_bug_3(self):
         ops = """
@@ -3284,9 +3305,9 @@
     def test_ovf_guard_in_short_preamble1(self):
         ops = """
         [p8, p11, i24]
-        p26 = new_with_vtable(descr=nodesize)
+        p26 = new(descr=ssize)
         setfield_gc(p26, i24, descr=adescr)
-        i34 = getfield_gc_pure_i(p11, descr=valuedescr)
+        i34 = getfield_gc_pure_i(p11, descr=abisdescr)
         i35 = getfield_gc_pure_i(p26, descr=adescr)
         i36 = int_add_ovf(i34, i35)
         guard_no_overflow() []
@@ -3336,7 +3357,8 @@
         guard_no_overflow() []
         jump(p0, p1, i16, p3, i17, i7, i11)
         """
-        self.optimize_loop(ops, expected)
+        self.optimize_loop(ops, expected,
+                           jump_values=[None, None, self.tupleaddr])
 
     def test_int_and_or_with_zero(self):
         ops = """
@@ -6143,7 +6165,8 @@
         []
         jump()
         """
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble, jump_values=
+                           [self.immutaddr])
 
     def test_immutable_constantfold_recursive(self):
         ops = """
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -94,11 +94,15 @@
     cpu = runner.LLGraphCPU(None)
 
     NODE = lltype.GcForwardReference()
+    S = lltype.GcForwardReference()
     NODE.become(lltype.GcStruct('NODE', ('parent', OBJECT),
                                         ('value', lltype.Signed),
                                         ('floatval', lltype.Float),
                                         ('charval', lltype.Char),
+                                        ('nexttuple', lltype.Ptr(S)),
                                         ('next', lltype.Ptr(NODE))))
+    S.become(lltype.GcStruct('TUPLE', ('a', lltype.Signed), ('abis', 
lltype.Signed),
+                        ('b', lltype.Ptr(NODE))))
     NODE2 = lltype.GcStruct('NODE2', ('parent', NODE),
                                      ('other', lltype.Ptr(NODE)))
 
@@ -130,6 +134,7 @@
     floatdescr = cpu.fielddescrof(NODE, 'floatval')
     chardescr = cpu.fielddescrof(NODE, 'charval')
     nextdescr = cpu.fielddescrof(NODE, 'next')
+    nexttupledescr = cpu.fielddescrof(NODE, 'nexttuple')
     otherdescr = cpu.fielddescrof(NODE2, 'other')
     valuedescr3 = cpu.fielddescrof(NODE3, 'value')
     nextdescr3 = cpu.fielddescrof(NODE3, 'next')
@@ -164,6 +169,8 @@
     intobj_immut_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
     noimmut_intval = cpu.fielddescrof(INTOBJ_NOIMMUT, 'intval')
     immut_intval = cpu.fielddescrof(INTOBJ_IMMUT, 'intval')
+    immut = lltype.malloc(INTOBJ_IMMUT, zero=True)
+    immutaddr = lltype.cast_opaque_ptr(llmemory.GCREF, immut)
     noimmut_descr = cpu.sizeof(INTOBJ_NOIMMUT, intobj_noimmut_vtable)
     immut_descr = cpu.sizeof(INTOBJ_IMMUT, intobj_immut_vtable)
 
@@ -175,12 +182,18 @@
     immut_ptrval = cpu.fielddescrof(PTROBJ_IMMUT, 'ptrval')
 
     arraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Signed))
+    array = lltype.malloc(lltype.GcArray(lltype.Signed), 15, zero=True)
+    arrayref = lltype.cast_opaque_ptr(llmemory.GCREF, array)
+    array2 = lltype.malloc(lltype.GcArray(lltype.Ptr(S)), 15, zero=True)
+    array2ref = lltype.cast_opaque_ptr(llmemory.GCREF, array2)
     gcarraydescr = cpu.arraydescrof(lltype.GcArray(llmemory.GCREF))
     floatarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Float))
 
     # a GcStruct not inheriting from OBJECT
-    S = lltype.GcStruct('TUPLE', ('a', lltype.Signed), ('abis', lltype.Signed),
-                        ('b', lltype.Ptr(NODE)))
+    tpl = lltype.malloc(S, zero=True)
+    tupleaddr = lltype.cast_opaque_ptr(llmemory.GCREF, tpl)
+    nodefull2 = lltype.malloc(NODE, zero=True)
+    nodefull2addr = lltype.cast_opaque_ptr(llmemory.GCREF, nodefull2)
     ssize = cpu.sizeof(S, None)
     adescr = cpu.fielddescrof(S, 'a')
     abisdescr = cpu.fielddescrof(S, 'abis')
@@ -270,6 +283,11 @@
     u2array = lltype.GcArray(rffi.USHORT)
     u2arraydescr = cpu.arraydescrof(u2array)
 
+    nodefull = lltype.malloc(NODE2, zero=True)
+    nodefull.parent.next = lltype.cast_pointer(lltype.Ptr(NODE), nodefull)
+    nodefull.parent.nexttuple = tpl
+    nodefulladdr = lltype.cast_opaque_ptr(llmemory.GCREF, nodefull)
+
     # array of structs (complex data)
     complexarray = lltype.GcArray(
         lltype.Struct("complex",
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -35,13 +35,22 @@
             bad = {}
         self.bad = bad
 
+    def get_runtime_item(self, box, descr, i):
+        array = box.getref_base()
+        if descr.is_array_of_pointers():
+            return InputArgRef(self.cpu.bh_getarrayitem_gc_r(array, i, descr))
+        elif descr.is_array_of_floats():
+            return InputArgFloat(self.cpu.bh_getarrayitem_gc_f(array, i, 
descr))
+        else:
+            return InputArgInt(self.cpu.bh_getarrayitem_gc_i(array, i, descr))
+
     def get_runtime_field(self, box, descr):
+        struct = box.getref_base()
         if descr.is_pointer_field():
-            xxx
+            return InputArgRef(self.cpu.bh_getfield_gc_r(struct, descr))
         elif descr.is_float_field():
-            yyy
+            return InputArgFloat(self.cpu.bh_getfield_gc_f(struct, descr))
         else:
-            struct = box.getref_base()
             return InputArgInt(self.cpu.bh_getfield_gc_i(struct, descr))
 
 class AbstractVirtualStateInfo(object):
@@ -204,8 +213,7 @@
     def __init__(self, arraydescr):
         self.arraydescr = arraydescr
 
-    def _generate_guards(self, other, box, opinfo, state):
-        xxx
+    def _generate_guards(self, other, box, runtime_box, state):
         if not isinstance(other, VArrayStateInfo):
             raise VirtualStatesCantMatch("other is not an array")
         if self.arraydescr is not other.arraydescr:
@@ -213,14 +221,16 @@
         if len(self.fieldstate) != len(other.fieldstate):
             raise VirtualStatesCantMatch("other has a different length")
         fieldbox = None
-        fieldinfo = None
+        fieldbox_runtime = None
         for i in range(len(self.fieldstate)):
-            if box is not None:
+            if runtime_box is not None:
+                opinfo = state.optimizer.getptrinfo(box)
                 assert isinstance(opinfo, info.ArrayPtrInfo)
                 fieldbox = opinfo._items[i]
-                fieldinfo = get_forwarded(fieldbox)
+                fieldbox_runtime = state.get_runtime_item(runtime_box,
+                                            self.arraydescr, i)
             self.fieldstate[i].generate_guards(other.fieldstate[i],
-                                            fieldbox, fieldinfo, state)
+                                            fieldbox, fieldbox_runtime, state)
 
     def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
         box = optimizer.get_box_replacement(box)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to