[pypy-commit] pypy optresult-unroll: fix the same_as on inputargs I think

fijal noreply at buildbot.pypy.org
Thu Aug 13 16:40:58 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78970:dd3b2a28fc96
Date: 2015-08-13 16:40 +0200
http://bitbucket.org/pypy/pypy/changeset/dd3b2a28fc96/

Log:	fix the same_as on inputargs I think

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
@@ -60,6 +60,8 @@
             info.produce_short_preamble_ops(structbox, descr, index, optimizer,
                                             shortboxes)
         return
+
+        XXXXX
         for structvalue in self._cached_fields_getfield_op.keys():
             op = self._cached_fields_getfield_op[structvalue]
             if not 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
@@ -1,6 +1,6 @@
 
 from rpython.jit.metainterp.resoperation import ResOperation, OpHelpers,\
-     rop, AbstractResOp
+     rop, AbstractResOp, AbstractInputArg
 from rpython.jit.metainterp.history import Const, make_hashable_int,\
      TreeLoop
 from rpython.jit.metainterp.optimizeopt import info
@@ -185,12 +185,16 @@
 dummy_short_op = ProducedShortOp(None, None)
 
 
-class ShortInputArg(AbstractProducedShortOp):
-    def __init__(self, preamble_op):
+class ShortInputArg(AbstractShortOp):
+    def __init__(self, res, preamble_op):
+        self.res = res
         self.preamble_op = preamble_op
 
-    def produce_op(self, opt, exported_infos):
-        pass
+    def add_op_to_short(self, sb):
+        return ProducedShortOp(self, self.preamble_op)
+
+    def produce_op(self, opt, preamble_op, exported_infos, invented_name):
+        assert not invented_name
 
     def __repr__(self):
         return "INP(%r)" % (self.preamble_op,)
@@ -213,7 +217,7 @@
         for box in inputargs:
             if box in label_d:
                 renamed = OpHelpers.inputarg_from_tp(box.type)
-                self.produced_short_boxes[box] = ShortInputArg(renamed)
+                self.potential_ops[box] = ShortInputArg(box, renamed)
 
         optimizer.produce_potential_short_preamble_ops(self)
 
@@ -317,7 +321,7 @@
 
     def add_heap_op(self, op, getfield_op):
         # or an inputarg
-        if isinstance(op, Const) or op in self.produced_short_boxes:
+        if isinstance(op, Const):
             self.const_short_boxes.append(HeapOp(op, getfield_op))
             return # we should not be called from anywhere
         self.add_potential_op(op, HeapOp(op, getfield_op))
@@ -352,7 +356,7 @@
 
     def use_box(self, box, preamble_op, optimizer=None):
         for arg in preamble_op.getarglist():
-            if isinstance(arg, Const):
+            if isinstance(arg, Const) or isinstance(arg, AbstractInputArg):
                 pass
             elif arg.get_forwarded() is None:
                 pass
@@ -362,7 +366,6 @@
                 if info is not empty_info:
                     info.make_guards(arg, self.short)
                 arg.set_forwarded(None)
-                #self.force_info_from(arg) <- XXX?
         self.short.append(preamble_op)
         if preamble_op.is_ovf():
             self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, [], None))
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
@@ -853,17 +853,17 @@
         p2sub = new_with_vtable(descr=nodesize2)
         setfield_gc(p2sub, i1, descr=valuedescr)
         setfield_gc(p2, p2sub, descr=nextdescr)
-        # i4 = same_as_i(i1) <- investigate
-        jump(i1, p2, p2sub)
-        """
-        expected = """
-        [i1, p2, p10]
-        escape_n(i1)
+        i4 = same_as_i(i1)
+        jump(i1, p2, p2sub, i4)
+        """
+        expected = """
+        [i1, p2, p10, i10]
+        escape_n(i10)
         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, p3sub, i1)
         """
         self.optimize_loop(ops, expected, preamble)
 
@@ -2241,6 +2241,7 @@
         """
         expected = """
         [p1, i1, i2]
+        setfield_gc(p1, i2, descr=valuedescr)
         jump(p1, i1, i2)
         """
         # in this case, all setfields are removed, because we can prove
@@ -7347,29 +7348,31 @@
         ops = """
         [p0, p1, ii, ii2]
         i1 = getfield_gc_i(p0, descr=valuedescr)
-        i2 = getfield_gc_i(p1, descr=otherdescr)
+        i2 = getfield_gc_i(p1, descr=chardescr)
         i3 = int_add(i1, i2)
         setfield_gc(p0, ii, descr=valuedescr)
-        setfield_gc(p1, ii, descr=otherdescr)
+        setfield_gc(p1, ii, descr=chardescr)
         i4 = getfield_gc_i(p0, descr=valuedescr)
-        i5 = getfield_gc_i(p1, descr=otherdescr)
+        i5 = getfield_gc_i(p1, descr=chardescr)
         jump(p0, p1, ii2, ii)
         """
         preamble = """
         [p0, p1, ii, ii2]
         i1 = getfield_gc_i(p0, descr=valuedescr)
-        i2 = getfield_gc_i(p1, descr=otherdescr)
+        i2 = getfield_gc_i(p1, descr=chardescr)
         i3 = int_add(i1, i2)
         setfield_gc(p0, ii, descr=valuedescr)
-        setfield_gc(p1, ii, descr=otherdescr)
-        jump(p0, p1, ii2, ii, ii, ii)
-        """
-        expected = """
-        [p0, p1, ii, ii2, i1, i2]
-        i3 = int_add(i1, i2)
-        setfield_gc(p0, ii, descr=valuedescr)
-        setfield_gc(p1, ii, descr=otherdescr)
-        jump(p0, p1, ii2, ii, ii, ii)
+        setfield_gc(p1, ii, descr=chardescr)
+        i10 = same_as_i(ii)
+        i11 = same_as_i(ii)
+        jump(p0, p1, ii2, ii, i10, i11)
+        """
+        expected = """
+        [p0, p1, i1, i2, i7, i8]
+        i3 = int_add(i7, i8)
+        setfield_gc(p0, i1, descr=valuedescr)
+        setfield_gc(p1, i1, descr=chardescr)
+        jump(p0, p1, i2, i1, i1, i1)
         """
         self.optimize_loop(ops, expected, preamble)
 
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
@@ -474,7 +474,7 @@
         preamble = TreeLoop('preamble')
         preamble.inputargs = start_state.renamed_inputargs
         start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs)
-        inputargs = start_state.end_args + loop_info.extra_label_args
+        inputargs = loop_info.label_args[:]
         emit_end_label = ResOperation(rop.LABEL, inputargs)
         preamble.operations = ([start_label] + preamble_ops +
                                loop_info.extra_same_as + [emit_end_label])
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
@@ -117,29 +117,29 @@
                                     self.optimizer, force_boxes=True)
         extra_jump_args = self.inline_short_preamble(jump_args)
         # remove duplicates, removes stuff from used boxes too
-        extra_jump_args, used_boxes = self.filter_extra_jump_args(
-            self.short_preamble_producer, jump_args,
-            extra_jump_args)
-        jump_args += extra_jump_args
+        label_args, jump_args = self.filter_extra_jump_args(
+            start_label.getarglist() + self.short_preamble_producer.used_boxes,
+            jump_args + extra_jump_args)
         jump_op = ResOperation(rop.JUMP, jump_args)
         self.optimizer._newoperations.append(jump_op)
         return (UnrollInfo(self.short_preamble_producer.build_short_preamble(),
-                           used_boxes,
+                           label_args,
                            self.short_preamble_producer.extra_same_as),
                 self.optimizer._newoperations)
 
-    def filter_extra_jump_args(self, sp, jump_args, extra_jump_args):
+    def filter_extra_jump_args(self, label_args, jump_args):
+        new_label_args = []
+        new_jump_args = []
+        assert len(label_args) == len(jump_args)
         d = {}
-        for arg in jump_args:
+        for i in range(len(label_args)):
+            arg = label_args[i]
+            if arg in d:
+                continue
+            new_label_args.append(arg)
+            new_jump_args.append(jump_args[i])
             d[arg] = None
-        new_jump_args = []
-        new_used_boxes = []
-        for i in range(len(extra_jump_args)):
-            if extra_jump_args[i] in d:
-                continue
-            new_jump_args.append(extra_jump_args[i])
-            new_used_boxes.append(sp.used_boxes[i])
-        return new_jump_args, new_used_boxes
+        return new_label_args, new_jump_args
 
     def inline_short_preamble(self, jump_args):
         sb = self.short_preamble_producer
@@ -222,12 +222,12 @@
     """ A state after optimizing the peeled loop, contains the following:
 
     * short_preamble - list of operations that go into short preamble
-    * extra_label_args - additional things to put in the label
+    * label_args - additional things to put in the label
     * extra_same_as - list of extra same as to add at the end of the preamble
     """
-    def __init__(self, short_preamble, extra_label_args, extra_same_as):
+    def __init__(self, short_preamble, label_args, extra_same_as):
         self.short_preamble = short_preamble
-        self.extra_label_args = extra_label_args
+        self.label_args = label_args
         self.extra_same_as = extra_same_as
             
 class ExportedState(LoopInfo):


More information about the pypy-commit mailing list