[pypy-commit] pypy optresult-unroll: (arigo, fijal) fix const handling in the short preamble

fijal noreply at buildbot.pypy.org
Wed Aug 12 18:56:07 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78943:57b9a085d148
Date: 2015-08-12 17:56 +0200
http://bitbucket.org/pypy/pypy/changeset/57b9a085d148/

Log:	(arigo, fijal) fix const handling in the short preamble

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
@@ -323,14 +323,12 @@
 class ShortPreambleBuilder(object):
     def __init__(self, short_boxes, short_inputargs, exported_infos,
                  optimizer=None):
-        self.producable_ops = {}
         for produced_op in short_boxes:
             op = produced_op.short_op.res
             preamble_op = produced_op.preamble_op
             if isinstance(op, Const):
                 info = optimizer.getinfo(op)
             else:
-                self.producable_ops[op] = produced_op.preamble_op
                 info = exported_infos[op]
                 if info is None:
                     info = empty_info
@@ -340,11 +338,7 @@
         self.short_preamble_jump = []
         self.short_inputargs = short_inputargs
 
-    def use_box(self, box, optimizer=None):
-        preamble_op = self.producable_ops.get(box, None)
-        if preamble_op is None:
-            return
-        del self.producable_ops[box]
+    def use_box(self, box, preamble_op, optimizer=None):
         for arg in preamble_op.getarglist():
             if isinstance(arg, Const):
                 pass
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
@@ -7912,12 +7912,18 @@
         setfield_gc(p5, 1, descr=valuedescr)
         jump(p5)
         """
+        short = """
+        [p0]
+        i0 = getfield_gc_i(p0, descr=valuedescr)
+        guard_value(i0, 1) []
+        jump()
+        """
         expected = """
         [p5]
         call_n(1, descr=nonwritedescr)
         jump(p5)
         """
-        self.optimize_loop(ops, expected, preamble)
+        self.optimize_loop(ops, expected, preamble, expected_short=short)
 
     def test_dont_mixup_equal_boxes(self):
         ops = """
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
@@ -22,8 +22,11 @@
         if isinstance(preamble_op, PreambleOp):
             op = preamble_op.op
             self.optimizer.inparg_dict[op] = None # XXX ARGH
-            self.optunroll.short_preamble_producer.use_box(op, self)
-            self.optunroll.potential_extra_ops[op] = preamble_op
+            # special hack for int_add(x, accumulator-const) optimization
+            self.optunroll.short_preamble_producer.use_box(op,
+                                            preamble_op.preamble_op, self)
+            if not preamble_op.op.is_constant():
+                self.optunroll.potential_extra_ops[op] = preamble_op
             return op
         return preamble_op
 


More information about the pypy-commit mailing list