[pypy-commit] pypy optresult-unroll: handle consts better

fijal noreply at buildbot.pypy.org
Mon Jul 13 17:20:00 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78546:cde47437fc67
Date: 2015-07-13 17:20 +0200
http://bitbucket.org/pypy/pypy/changeset/cde47437fc67/

Log:	handle consts better

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -58,9 +58,7 @@
             op = optimizer.get_box_replacement(op)
             opnum = OpHelpers.getfield_for_descr(descr)
             getfield_op = ResOperation(opnum, [structbox], descr=descr)
-            if not op.is_constant():
-                # XXXX why?
-                shortboxes.add_potential(op, getfield_op)
+            shortboxes.add_potential(op, getfield_op)
         return
         for structvalue in self._cached_fields_getfield_op.keys():
             op = self._cached_fields_getfield_op[structvalue]
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
@@ -8,6 +8,7 @@
 class ShortBoxes(object):
     def __init__(self):
         self.potential_ops = []
+        self.produced_short_boxes = {}
         self.ops_used = {}
         self.extra_same_as = []
 
@@ -16,21 +17,25 @@
             self.ops_used[box] = None
         optimizer.produce_potential_short_preamble_ops(self)
 
-        self.short_boxes = {}
-        # short boxes has a map of "op from preamble" ->
-        # "op going to short preamble", where "op from preamble" can be
-        # anything, but the one going to short_preamble has to be either pure
+        self.short_boxes = []
+        # short boxes is a list of (op, preamble_op)
+        # where op can be
+        # anything, but the preamble_op has to be either pure
         # or a heap cache op
 
         for op, preamble_op in self.potential_ops:
             self.produce_short_preamble_op(op, preamble_op)
+        self.produced_short_boxes = None
         return self.short_boxes
 
     def add_to_short(self, op, short_op):
-        self.short_boxes[op] = short_op
+        self.short_boxes.append((op, short_op))
+        self.produced_short_boxes[op] = None
 
     def produce_short_preamble_op(self, op, preamble_op):
-        if isinstance(op, AbstractInputArg):
+        if isinstance(op, Const):
+            pass
+        elif isinstance(op, AbstractInputArg):
             if op not in self.ops_used:
                 return
         else:
@@ -41,7 +46,7 @@
                     pass
                 else:
                     return # can't produce
-        if op in self.short_boxes:
+        if op in self.produced_short_boxes:
             opnum = OpHelpers.same_as_for_type(op.type)
             same_as_op = ResOperation(opnum, [op])
             self.extra_same_as.append(same_as_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
@@ -28,7 +28,7 @@
         op = ResOperation(rop.INT_ADD, [i0, i1])
         sb = ShortBoxes()
         sb.create_short_boxes(Opt([op]), [i0, i1])
-        assert sb.short_boxes == {op: op}
+        assert sb.short_boxes == [(op, op)]
 
     def test_pure_ops_does_not_work(self):
         i0 = InputArgInt()
@@ -36,7 +36,7 @@
         op = ResOperation(rop.INT_ADD, [i0, i1])
         sb = ShortBoxes()
         sb.create_short_boxes(Opt([op]), [i0])
-        assert sb.short_boxes == {}
+        assert sb.short_boxes == []
 
     def test_multiple_similar_ops(self):
         """ This can happen e.g. if heap cache and pure ops produce
@@ -56,10 +56,9 @@
         sb = ShortBoxes()
         sb.create_short_boxes(Opt([op, (op, op1)]), [i0, i1])
         assert len(sb.short_boxes) == 2
-        l = [x.getopnum() for x in sb.short_boxes.keys()]
+        l = [x.getopnum() for x, _ in sb.short_boxes]
         l.sort()
         assert l == [rop.INT_ADD, rop.SAME_AS_I]
-        assert op1 in sb.short_boxes.values()
-        assert op in sb.short_boxes.values()
-        assert op in sb.short_boxes.keys()
+        assert [x for x, y in sb.short_boxes][0] == op
+        assert [y for x, y in sb.short_boxes] == [op, op1]
 
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
@@ -69,7 +69,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 == {}
+        assert es.short_boxes == []
 
     def test_not_constant(self):
         loop = """
@@ -82,7 +82,7 @@
         assert isinstance(vs.state[0], NotVirtualStateInfo)
         assert vs.state[0].level == LEVEL_UNKNOWN
         op = preamble.operations[0]
-        assert es.short_boxes == {op: op}
+        assert es.short_boxes == [(op, op)]
 
     def test_guard_class(self):
         loop = """
@@ -131,7 +131,7 @@
         jump(p0, i0)
         """
         es, loop, preamble = self.optimize(loop)
-        assert es.short_boxes[preamble.operations[0]]
+        assert es.short_boxes[0][0] == preamble.operations[0]
 
     def test_int_is_true(self):
         loop = """
@@ -142,5 +142,14 @@
         """
         es, loop, preamble = self.optimize(loop)
         op = preamble.operations[0]
-        assert es.short_boxes == {op:op}
+        assert es.short_boxes == [(op,op)]
         assert es.exported_infos[op].is_constant()
+
+    def test_only_setfield(self):
+        loop = """
+        [p0]
+        setfield_gc(p0, 5, descr=valuedescr)
+        jump(p0)
+        """
+        es, loop, preamble = self.optimize(loop)
+        assert es.short_boxes[0][0] == preamble.operations[0].getarg(1)
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
@@ -235,8 +235,9 @@
         infos = {}
         for arg in end_args:
             infos[arg] = self.optimizer.getinfo(arg)
-        for box in sb.short_boxes:
-            infos[box] = self.optimizer.getinfo(box)
+        for box, _ in sb.short_boxes:
+            if not isinstance(box, Const):
+                infos[box] = self.optimizer.getinfo(box)
         label_args = virtual_state.make_inputargs(end_args, self.optimizer)
         self.optimizer._clean_optimization_info(end_args)
         self.optimizer._clean_optimization_info(start_label.getarglist())
@@ -300,8 +301,9 @@
                 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
+        for op, preamble_op in exported_state.short_boxes:
+            if not isinstance(op, Const):
+                self.ops_to_import[op] = preamble_op
             if preamble_op.is_always_pure():
                 self.pure(op.getopnum(), PreambleOp(op, preamble_op,
                                 exported_state.exported_infos.get(op, None)))
@@ -311,7 +313,7 @@
                 if optheap is None:
                     continue
                 opinfo = self.optimizer.ensure_ptr_info_arg0(preamble_op)
-                pre_info = exported_state.exported_infos[op]
+                pre_info = exported_state.exported_infos.get(op, None)
                 pop = PreambleOp(op, preamble_op, pre_info)
                 assert not opinfo.is_virtual()
                 opinfo._fields[preamble_op.getdescr().get_index()] = pop


More information about the pypy-commit mailing list