[pypy-commit] pypy optresult-unroll: start fighting the unrolling - step one is calling the short boxes

fijal noreply at buildbot.pypy.org
Mon Jul 6 10:37:03 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78447:966c24dd62ad
Date: 2015-07-06 10:37 +0200
http://bitbucket.org/pypy/pypy/changeset/966c24dd62ad/

Log:	start fighting the unrolling - step one is calling the short boxes

diff --git a/rpython/jit/metainterp/optimizeopt/generalize.py b/rpython/jit/metainterp/optimizeopt/generalize.py
deleted file mode 100644
--- a/rpython/jit/metainterp/optimizeopt/generalize.py
+++ /dev/null
@@ -1,22 +0,0 @@
-#from rpython.jit.metainterp.optimizeopt.optimizer import MININT, MAXINT
-
-
-class GeneralizationStrategy(object):
-    def __init__(self, optimizer):
-        self.optimizer = optimizer
-
-    def apply(self):
-        raise NotImplementedError
-
-
-class KillHugeIntBounds(GeneralizationStrategy):
-    def apply(self):
-        pass
-        #for v in self.optimizer.values.values():
-        #    if v.is_constant():
-        #        continue
-        #    if isinstance(v, IntOptValue):
-        #        if v.intbound.lower < MININT / 2:
-        #            v.intbound.lower = MININT
-        #        if v.intbound.upper > MAXINT / 2:
-        #            v.intbound.upper = MAXINT
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -218,7 +218,7 @@
         return recentops.lookup(self.optimizer, op)
 
     def produce_potential_short_preamble_ops(self, sb):
-        ops = sb.optimizer._newoperations
+        ops = self.optimizer._newoperations
         for i, op in enumerate(ops):
             if op.is_always_pure():
                 sb.add_potential(op)
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -23,6 +23,7 @@
 
         for op, preamble_op in self.potential_ops:
             self.produce_short_preamble_op(op, preamble_op)
+        return self.short_boxes
 
     def add_to_short(self, op, short_op):
         self.short_boxes[op] = short_op
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_short.py b/rpython/jit/metainterp/optimizeopt/test/test_short.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_short.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_short.py
@@ -62,3 +62,4 @@
         assert op1 in sb.short_boxes.values()
         assert op in sb.short_boxes.values()
         assert op in sb.short_boxes.keys()
+
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
@@ -13,7 +13,7 @@
 class FakeOptimizer(object):
     optearlyforce = None
      
-class TestUnroll(BaseTest, LLtypeMixin):
+class BaseTestUnroll(BaseTest, LLtypeMixin):
     enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
     
     def optimize(self, ops):
@@ -38,8 +38,9 @@
         start_state = self._do_optimize_loop(preamble, None,
                                              export_state=True)
         vs = preamble.operations[-1].getdescr().virtual_state
-        return start_state, vs, loop
+        return start_state, vs, loop, preamble
 
+class TestUnroll(BaseTestUnroll):
     def test_simple(self):
         loop = """
         [i0]
@@ -47,7 +48,7 @@
         guard_value(i1, 1) []
         jump(i1)
         """
-        es, vs, loop = self.optimize(loop)
+        es, vs, loop, preamble = self.optimize(loop)
         assert isinstance(vs.state[0], NotVirtualStateInfo)
         # the virtual state is constant, so we don't need to have it in
         # inputargs
@@ -56,6 +57,7 @@
         # we have exported values for i1, which happens to be an inputarg
         assert es.inputarg_mapping[0][1].getint() == 1
         assert isinstance(es.inputarg_mapping[0][1], ConstInt)
+        assert es.short_boxes == {}
 
     def test_not_constant(self):
         loop = """
@@ -63,6 +65,8 @@
         i1 = int_add(i0, 1)
         jump(i0)
         """
-        es, vs, loop = self.optimize(loop)
+        es, vs, loop, preamble = self.optimize(loop)
         assert isinstance(vs.state[0], NotVirtualStateInfo)
         assert vs.state[0].level == LEVEL_UNKNOWN
+        op = preamble.operations[1]
+        assert es.short_boxes == {op: op}
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
@@ -1,9 +1,8 @@
 import sys
 
 from rpython.jit.metainterp.history import TargetToken, JitCellToken, Const
-from rpython.jit.metainterp.logger import LogOperations
+from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes
 from rpython.jit.metainterp.optimize import InvalidLoop
-from rpython.jit.metainterp.optimizeopt.generalize import KillHugeIntBounds
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
      Optimization
 from rpython.jit.metainterp.optimizeopt.virtualstate import (VirtualStateConstructor,
@@ -165,8 +164,6 @@
             self.close_bridge(start_label)
 
         self.optimizer.flush()
-        if export_state:
-            KillHugeIntBounds(self.optimizer).apply()
 
         loop.operations = self.optimizer.get_newoperations()
         if export_state:
@@ -211,8 +208,11 @@
         target_token = targetop.getdescr()
         assert isinstance(target_token, TargetToken)
         target_token.virtual_state = virtual_state
-        return ExportedState([(label_op.getarg(i), jump_args[i]) for i in range(len(jump_args))], [], [], [])
-        xxx
+        sb = ShortBoxes()
+        sb.create_short_boxes(self.optimizer, jump_args)
+        inparg_mapping = [(label_op.getarg(i), jump_args[i])
+                          for i in range(len(jump_args))]
+        return ExportedState(inparg_mapping, [], sb.short_boxes)
 
 
         inputargs = virtual_state.make_inputargs(jump_args, self.optimizer)
@@ -298,14 +298,11 @@
         #for source, target in exported_state.inputarg_setup_ops:
         #    source.set_forwarded(target)
 
-        #for op in self.short_boxes.operations():
-        #    if not op:
-        #        continue
-        #    if op.is_always_pure():
-        #        self.pure(op.getopnum(),
-        #                  PreambleOp(op, self.optimizer.getinfo(op)))
-        #    else:
-        #        yyy
+        for op, preamble_op in exported_state.short_boxes.iteritems():
+            if preamble_op.is_always_pure():
+                self.pure(op.getopnum(), PreambleOp(op, None))
+            else:
+                xxx
         return
         seen = {}
         for op in self.short_boxes.operations():
@@ -336,8 +333,8 @@
                     #    debug_print('  Falling back to add extra: ' +
                     #                self.optimizer.loop.logops.repr_of_resop(op))
 
-        self.optimizer.flush()
-        self.optimizer.emitting_dissabled = False
+        #self.optimizer.flush()
+        #self.optimizer.emitting_dissabled = False
 
     def close_bridge(self, start_label):
         inputargs = self.inputargs
@@ -709,28 +706,10 @@
                          as the first element and the second element being
                          what it maps to (potentially const)
     * exported_infos - a mapping from ops to infos, including inputargs
-    * pure operations - a list of pure operations that can produce various
-                        ops
-    * heap cache operations - an additional list of how to produce various
-                              ops
+    * short boxes - a mapping op -> preamble_op
     """
     
-    def __init__(self, inputarg_mapping, exported_infos, pure_ops,
-                 heap_cache_ops):
+    def __init__(self, inputarg_mapping, exported_infos, short_boxes):
         self.inputarg_mapping = inputarg_mapping
         self.exported_infos = exported_infos
-        self.pure_ops = pure_ops
-        self.heap_cache_ops = heap_cache_ops
-
-    def dump(self, metainterp_sd):
-        debug_start("jit-exported-state")
-        logops = LogOperations(metainterp_sd, False)
-        debug_print("   inputarg setup")
-        logops._log_operations([], self.inputarg_setup_ops)
-        debug_print("   short boxes")
-        self.short_boxes.dump(logops)
-        debug_print("   exported values")
-        for k, v in self.exported_values.iteritems():
-            debug_print("%s:%s" % (logops.repr_of_resop(k),
-                                   logops.repr_of_resop(v.box)))
-        debug_stop("jit-exported-state")
+        self.short_boxes = short_boxes


More information about the pypy-commit mailing list