[pypy-commit] pypy optresult-unroll: fix test_bug_3

fijal noreply at buildbot.pypy.org
Tue Aug 11 16:56:48 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78910:7c3ad0460623
Date: 2015-08-11 14:53 +0200
http://bitbucket.org/pypy/pypy/changeset/7c3ad0460623/

Log:	fix test_bug_3

diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -128,6 +128,9 @@
         assert not self.is_virtual()
         self._fields = [None] * len(self._fields)
 
+    def all_items(self):
+        return self._fields
+
     def setfield(self, descr, struct, op, optheap=None, cf=None):
         self.init_fields(descr.get_parent_descr(), descr.get_index())
         assert isinstance(op, AbstractValue)
@@ -175,7 +178,6 @@
         getfield_op = ResOperation(opnum, [structbox], descr=descr)
         shortboxes.add_heap_op(op, getfield_op)
 
-
 class InstancePtrInfo(AbstractStructPtrInfo):
     _attrs_ = ('_known_class',)
     _fields = None
@@ -193,6 +195,14 @@
         assert self.is_virtual()
         return visitor.visit_virtual(self.vdescr, fielddescrs)
 
+    def make_guards(self, op, short):
+        if self._known_class is not None:
+            op = ResOperation(rop.GUARD_NONNULL_CLASS, [op, self._known_class],
+                              None)
+            short.append(op)
+        else:
+            AbstractStructPtrInfo.make_guards(self, op, short)
+
 class StructPtrInfo(AbstractStructPtrInfo):
     def __init__(self, vdescr=None):
         self.vdescr = vdescr
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
@@ -2776,7 +2776,7 @@
         p3 = getfield_gc_r(p1, descr=otherdescr)
         guard_nonnull(ConstPtr(nodeaddr)) []
         guard_class(p3, ConstClass(node_vtable)) []
-        setfield_gc(p3, p2, descr=otherdescr)
+        setfield_gc(p3, p2, descr=nextdescr)
         p1a = new_with_vtable(descr=nodesize2)
         p2a = new_with_vtable(descr=nodesize)
         p3a = new_with_vtable(descr=nodesize)
@@ -2793,7 +2793,7 @@
         p3 = getfield_gc_r(p1, descr=otherdescr)
         guard_class(p3, ConstClass(node_vtable)) []
         p3a = new_with_vtable(descr=nodesize)
-        setfield_gc(p3, p2, descr=otherdescr)
+        setfield_gc(p3, p2, descr=nextdescr)
         escape_n(p3a)
         jump(p3a)
         """
@@ -2807,7 +2807,7 @@
         # p2a = new_with_vtable(descr=nodesize)
         p3anew = new_with_vtable(descr=nodesize)
         p2 = new_with_vtable(descr=nodesize)
-        setfield_gc(p3a, p2, descr=otherdescr) # p3a.other = p2a
+        setfield_gc(p3a, p2, descr=nextdescr) # p3a.other = p2a
         escape_n(p3anew)
         jump(p3anew)
         """
@@ -2819,10 +2819,10 @@
         guard_nonnull(p1) []
         guard_class(p1, ConstClass(node_vtable2)) []
         p2 = getfield_gc_r(p1, descr=nextdescr)
-        guard_nonnull(12) []
+        guard_nonnull(ConstPtr(nodeaddr)) []
         guard_class(p2, ConstClass(node_vtable)) []
         p3 = getfield_gc_r(p1, descr=otherdescr)
-        guard_nonnull(12) []
+        guard_nonnull(ConstPtr(nodeaddr)) []
         guard_class(p3, ConstClass(node_vtable)) []
         p1a = new_with_vtable(descr=nodesize2)
         p2a = new_with_vtable(descr=nodesize)
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -26,12 +26,22 @@
             return op
         return preamble_op
 
-    def setinfo_from_preamble(self, op, preamble_info):
+    def setinfo_from_preamble_list(self, lst, infos):
+        for item in lst:
+            if item is None:
+                continue
+            i = infos.get(item, None)
+            if i is not None:
+                self.setinfo_from_preamble(item, i, infos)
+
+    def setinfo_from_preamble(self, op, preamble_info, exported_infos):
         op = self.get_box_replacement(op)
         if isinstance(preamble_info, info.PtrInfo):
             if preamble_info.is_virtual():
                 # XXX do we want to sanitize this?
                 op.set_forwarded(preamble_info)
+                self.setinfo_from_preamble_list(preamble_info.all_items(),
+                                          exported_infos)
                 return
             if op.is_constant():
                 return # nothing we can learn
@@ -245,6 +255,8 @@
         for arg in end_args:
             infos[arg] = self.optimizer.getinfo(arg)
         label_args = virtual_state.make_inputargs(end_args, self.optimizer)
+        for arg in label_args:
+            infos[arg] = self.optimizer.getinfo(arg)            
         sb = ShortBoxes()
         short_boxes = sb.create_short_boxes(self.optimizer, renamed_inputargs,
                                             label_args)
@@ -314,7 +326,8 @@
                 source.set_forwarded(target)
             info = exported_state.exported_infos.get(target, None)
             if info is not None:
-                self.optimizer.setinfo_from_preamble(source, info)
+                self.optimizer.setinfo_from_preamble(source, info,
+                                        exported_state.exported_infos)
         # import the optimizer state, starting from boxes that can be produced
         # by short preamble
         self.short_preamble_producer = ShortPreambleBuilder(


More information about the pypy-commit mailing list