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

fijal noreply at buildbot.pypy.org
Tue Jul 7 09:36:34 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78478:7b6353983251
Date: 2015-07-06 17:04 +0200
http://bitbucket.org/pypy/pypy/changeset/7b6353983251/

Log:	fix fix fix

diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -285,14 +285,6 @@
         else:
             zzz
 
-    def setinfo_from_preamble(self, op, old_info):
-        if isinstance(old_info, info.PtrInfo):
-            if op.is_constant():
-                return # nothing we can learn
-            known_class = old_info.get_known_class(self.cpu)
-            if known_class:
-                self.make_constant_class(op, known_class, False)
-
     def get_box_replacement(self, op):
         from rpython.jit.metainterp.optimizeopt.unroll import PreambleOp
 
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
@@ -81,7 +81,6 @@
         if expected_preamble:
             self.assert_equal(preamble, convert_old_style_to_targets(expected_preamble, jump=False),
                               text_right='expected preamble')
-            assert preamble.operations[-1].getdescr() == loop.operations[0].getdescr()
         if expected_short:
             short_preamble = TreeLoop('short preamble')
             assert short[0].getopnum() == rop.LABEL
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
@@ -10,6 +10,7 @@
 from rpython.jit.metainterp.compile import LoopCompileData
 from rpython.jit.metainterp.optimizeopt.virtualstate import \
      NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN
+from rpython.jit.codewriter import heaptracker
 
 class FakeOptimizer(object):
     optearlyforce = None
@@ -71,3 +72,16 @@
         assert vs.state[0].level == LEVEL_UNKNOWN
         op = preamble.operations[0]
         assert es.short_boxes == {op: op}
+
+    def test_guard_class(self):
+        loop = """
+        [p0]
+        guard_class(p0, ConstClass(node_vtable)) []
+        jump(p0)
+        """
+        es, loop, preamble = self.optimize(loop)
+        p0 = loop.inputargs[0]
+        assert (heaptracker.adr2int(self.node_vtable_adr) ==
+                es.exported_infos[p0]._known_class.getint())
+
+
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
@@ -513,7 +513,7 @@
                       loop.operations
     if not jump:
         assert newloop.operations[-1].getopnum() == rop.JUMP
-        newloop.operations[-1] = ResOperation(rop.LABEL, newloop.operations[-1].getarglist(), descr=FakeDescr())
+        newloop.operations = newloop.operations[:-1]
     return newloop
 
 # ____________________________________________________________
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
@@ -3,6 +3,7 @@
 from rpython.jit.metainterp.history import TargetToken, JitCellToken, Const
 from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes
 from rpython.jit.metainterp.optimize import InvalidLoop
+from rpython.jit.metainterp.optimizeopt import info
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
      Optimization
 from rpython.jit.metainterp.optimizeopt.virtualstate import (VirtualStateConstructor,
@@ -35,6 +36,15 @@
             preamble_op.info.make_guards(op, self.optunroll.short)
         return op
 
+    def setinfo_from_preamble(self, op, old_info):
+        op = self.get_box_replacement(op)
+        if isinstance(old_info, info.PtrInfo):
+            if op.is_constant():
+                return # nothing we can learn
+            known_class = old_info.get_known_class(self.cpu)
+            if known_class:
+                self.make_constant_class(op, known_class, False)
+
 
 class UnrollOptimizer(Optimization):
     """Unroll the loop into two iterations. The first one will
@@ -173,7 +183,11 @@
         inparg_mapping = [(start_label.getarg(i), end_args[i])
                           for i in range(len(end_args)) if
                           start_label.getarg(i) is not end_args[i]]
-        return ExportedState(inparg_mapping, virtual_state, [], sb.short_boxes)
+        infos = {}
+        for arg in end_args:
+            infos[arg] = self.optimizer.getinfo(arg)
+        return ExportedState(inparg_mapping, virtual_state, infos,
+                             sb.short_boxes)
 
 
         inputargs = virtual_state.make_inputargs(jump_args, self.optimizer)
@@ -224,7 +238,8 @@
         # the mapping between input args (from old label) and what we need
         # to actually emit
         for source, target in exported_state.inputarg_mapping:
-            xxx
+            if source is not target:
+                source.set_forwarded(target)
         # import the optimizer state, starting from boxes that can be produced
         # by short preamble
         for op, preamble_op in exported_state.short_boxes.items():
@@ -232,6 +247,9 @@
                 self.pure(op.getopnum(), PreambleOp(op, preamble_op, None))
             else:
                 yyy
+
+        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