[pypy-commit] pypy optresult-unroll: another go, do it in two steps. There is an open question whether we're getting better results or we have bugs

fijal noreply at buildbot.pypy.org
Sun Jul 12 20:45:13 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78532:e127ddd8a9ec
Date: 2015-07-12 20:45 +0200
http://bitbucket.org/pypy/pypy/changeset/e127ddd8a9ec/

Log:	another go, do it in two steps. There is an open question whether
	we're getting better results or we have bugs

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
@@ -854,14 +854,13 @@
         jump(i1, p2, p2sub)
         """
         expected = """
-        [i1, p2, p2sub]
-        i3 = getfield_gc_i(p2sub, descr=valuedescr)
+        [i1, p2, i3]
         escape_n(i3)
         p1 = new_with_vtable(descr=nodesize)
         p3sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p3sub, i1, descr=valuedescr)
         setfield_gc(p1, p3sub, descr=nextdescr)
-        jump(i1, p1, p3sub)
+        jump(i1, p1, i1)
         """
         self.optimize_loop(ops, expected, preamble)
 
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
@@ -223,6 +223,8 @@
         infos = {}
         for arg in end_args:
             infos[arg] = self.optimizer.getinfo(arg)
+        for box in sb.short_boxes:
+            infos[box] = self.optimizer.getinfo(box)
         label_args = virtual_state.make_inputargs(end_args, self.optimizer)
         for arg in end_args:
             if arg.get_forwarded() is not None:
@@ -278,28 +280,32 @@
 
     def import_state(self, targetop, exported_state):
         # the mapping between input args (from old label) and what we need
-        # to actually emit
+        # to actually emit. Update the info
         self.ops_to_import = {}
         for source, target in exported_state.inputarg_mapping:
             if source is not target:
                 source.set_forwarded(target)
+            info = exported_state.exported_infos.get(target, None)
+            if info is not None:
+                self.optimizer.setinfo_from_preamble(source, info)
         # import the optimizer state, starting from boxes that can be produced
         # by short preamble
         for op, preamble_op in exported_state.short_boxes.items():
             self.ops_to_import[op] = preamble_op
             if preamble_op.is_always_pure():
-                self.pure(op.getopnum(), op)
+                self.pure(op.getopnum(), PreambleOp(op, preamble_op,
+                                exported_state.exported_infos.get(op, None)))
             else:
                 assert preamble_op.is_getfield()
                 optheap = self.optimizer.optheap
                 if optheap is None:
                     continue
                 opinfo = self.optimizer.ensure_ptr_info_arg0(preamble_op)
+                pre_info = exported_state.exported_infos[op]
+                pop = PreambleOp(op, preamble_op, pre_info)
                 assert not opinfo.is_virtual()
-                opinfo._fields[preamble_op.getdescr().get_index()] = op
+                opinfo._fields[preamble_op.getdescr().get_index()] = pop
 
-        for op, info in exported_state.exported_infos.iteritems():
-            self.optimizer.setinfo_from_preamble(op, info)
         return
         self.inputargs = targetop.getarglist()
         target_token = targetop.getdescr()


More information about the pypy-commit mailing list