Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79364:587467d78277
Date: 2015-09-01 21:14 +0200
http://bitbucket.org/pypy/pypy/changeset/587467d78277/

Log:    hack sliiightly differently

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
@@ -100,6 +100,9 @@
             # need any _lazy_setfield: the heap value is already right.
             # Note that this may reset to None a non-None lazy_setfield,
             # cancelling its previous effects with no side effect.
+            
+            # Now, we have to force the item in the short preamble
+            self._getfield(structinfo, op.getdescr(), optheap)
             self._lazy_setfield = None
 
     def getfield_from_cache(self, optheap, opinfo, descr):
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
@@ -30,7 +30,7 @@
             op = self.lst[i]
             if op is None:
                 break
-            if opt.get_box_replacement(op.getarg(0)).same_box(box0) and 
op.getdescr() is descr:
+            if box0.same_box(opt.get_box_replacement(op.getarg(0))) and 
op.getdescr() is descr:
                 op = self.force_preamble_op(opt, op, i)
                 return opt.get_box_replacement(op)
         return None
@@ -40,8 +40,9 @@
             op = self.lst[i]
             if op is None:
                 break
-            if (opt.get_box_replacement(op.getarg(0)).same_box(box0) and 
opt.get_box_replacement(op.getarg(1)).same_box(box1)
-                and op.getdescr() is descr):
+            if (box0.same_box(opt.get_box_replacement(op.getarg(0))) and
+                box1.same_box(opt.get_box_replacement(op.getarg(1))) and
+                op.getdescr() is descr):
                 op = self.force_preamble_op(opt, op, i)
                 return opt.get_box_replacement(op)
         return None
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
@@ -99,7 +99,11 @@
         optpure = opt.optimizer.optpure
         if optpure is None:
             return
-        op = self.res
+        if invented_name:
+            op = self.orig_op.copy_and_change(self.orig_op.getopnum())
+            op.set_forwarded(self.res)
+        else:
+            op = self.res
         if preamble_op.is_call():
             optpure.extra_call_pure.append(PreambleOp(op, preamble_op,
                                                       invented_name))
@@ -199,8 +203,7 @@
         return ProducedShortOp(self, self.preamble_op)
 
     def produce_op(self, opt, preamble_op, exported_infos, invented_name):
-        pass
-        #assert not invented_name
+        assert not invented_name
 
     def __repr__(self):
         return "INP(%r -> %r)" % (self.res, self.preamble_op)
@@ -233,8 +236,7 @@
             self.add_op_to_short(shortop)
         #
         for op, produced_op in self.produced_short_boxes.iteritems():
-            if not isinstance(produced_op, ShortInputArg):
-                short_boxes.append(produced_op)
+            short_boxes.append(produced_op)
 
         for short_op in self.const_short_boxes:
             getfield_op = short_op.getfield_op
@@ -262,13 +264,13 @@
         else:
             return None
 
-    def _pick_op_index(self, lst, pick_inparg=True):
+    def _pick_op_index(self, lst, pick_other=True):
         index = -1
         for i, item in enumerate(lst):
             if (not isinstance(item.short_op, HeapOp) and
-                (pick_inparg or not isinstance(item.short_op, ShortInputArg))):
+                (pick_other or isinstance(item.short_op, ShortInputArg))):
                 if index != -1:
-                    assert pick_inparg
+                    assert pick_other
                     return self._pick_op_index(lst, False)
                 index = i
         if index == -1:
@@ -293,7 +295,9 @@
                         opnum = OpHelpers.same_as_for_type(shortop.res.type)
                         new_name = ResOperation(opnum, [shortop.res])
                         assert lst[i].short_op is not pop.short_op
+                        orig_op = lst[i].short_op.res
                         lst[i].short_op.res = new_name
+                        lst[i].short_op.orig_op = orig_op
                         lst[i].invented_name = True
                         self.produced_short_boxes[new_name] = lst[i]
             else:
@@ -389,9 +393,6 @@
                     info = empty_info
             preamble_op.set_forwarded(info)
         self.short = []
-        self.label_dict = {}
-        for arg in label_args:
-            self.label_dict[arg] = None
         self.used_boxes = []
         self.short_preamble_jump = []
         self.extra_same_as = []
@@ -401,12 +402,9 @@
         """ Notice that we're actually using the preamble_op, add it to
         label and jump
         """
+        op = preamble_op.op.get_box_replacement()
         if preamble_op.invented_name:
-            self.extra_same_as.append(preamble_op.op)
-        op = preamble_op.op
-        if op in self.label_dict:
-            return
-        self.label_dict[op] = None
+            self.extra_same_as.append(op)
         self.used_boxes.append(op)
         self.short_preamble_jump.append(preamble_op.preamble_op)
 
@@ -434,12 +432,12 @@
         self.label_args = label_args
 
     def add_preamble_op(self, preamble_op):
+        """ Notice that we're actually using the preamble_op, add it to
+        label and jump
+        """
+        op = preamble_op.op.get_box_replacement()
         if preamble_op.invented_name:
-            self.extra_same_as.append(preamble_op.op)
-        op = preamble_op.op
-        if op in self.sb.label_dict:
-            return
-        self.sb.label_dict[op] = None
+            self.extra_same_as.append(op)
         self.label_args.append(op)
         self.jump_args.append(preamble_op.preamble_op)
 
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
@@ -2400,16 +2400,15 @@
         guard_true(i3) []
         i4 = int_neg(i2)
         setfield_gc(p1, i2, descr=valuedescr)
-        #i7 = same_as(i2) # This same_as should be killed by backend
-        #i6 = same_as(i4)
-        jump(p1, i1, i2, i4) #, i6)
-        """
-        expected = """
-        [p1, i1, i2, i4] #, i5]
+        i6 = same_as_i(i4)
+        jump(p1, i1, i2, i4, i6)
+        """
+        expected = """
+        [p1, i1, i2, i4, i5]
         setfield_gc(p1, i1, descr=valuedescr)
         guard_true(i4) []
         setfield_gc(p1, i2, descr=valuedescr)
-        jump(p1, i1, i2, 1) # , i5)
+        jump(p1, i1, i2, i5, i5)
         """
         self.optimize_loop(ops, expected, preamble)
 
@@ -2432,16 +2431,15 @@
         i4 = int_neg(i2)
         setfield_gc(p1, NULL, descr=nextdescr)
         escape_n()
-        #i5 = same_as(i4)
-        jump(p1, i2, i4)
-        """
-        expected = """
-        [p1, i2, i4] # i5
+        i5 = same_as_i(i4)
+        jump(p1, i2, i4, i5)
+        """
+        expected = """
+        [p1, i2, i4, i5]
         guard_true(i4) [p1]
         setfield_gc(p1, NULL, descr=nextdescr)
         escape_n()
-        jump(p1, i2, 1)
-        #jump(p1, i2, i5, i5)
+        jump(p1, i2, i5, i5)
         """
         self.optimize_loop(ops, expected, preamble)
 
@@ -2467,11 +2465,11 @@
         jump(p1, i2, i4) #, i5)
         """
         expected = """
-        [p1, i2, i4] #, i5]
+        [p1, i2, i4, i5]
         guard_true(i4) [i2, p1]
         setfield_gc(p1, NULL, descr=nextdescr)
         escape_n()
-        jump(p1, i2, 1) #, i5)
+        jump(p1, i2, i5, i5)
         """
         self.optimize_loop(ops, expected)
 
@@ -2494,17 +2492,16 @@
         guard_true(i5) []
         i4 = int_neg(i2)
         setfield_gc(p1, i2, descr=valuedescr)
-        #i8 = same_as(i2) # This same_as should be killed by backend
-        #i7 = same_as(i4)
-        jump(p1, i1, i2, i4) #, i7)
-        """
-        expected = """
-        [p1, i1, i2, i4] #, i7]
+        i7 = same_as_i(i4)
+        jump(p1, i1, i2, i4, i7)
+        """
+        expected = """
+        [p1, i1, i2, i4, i7]
         setfield_gc(p1, i1, descr=valuedescr)
         i5 = int_eq(i4, 5)
         guard_true(i5) []
         setfield_gc(p1, i2, descr=valuedescr)
-        jump(p1, i1, i2, 5) # , i7)
+        jump(p1, i1, i2, i7, i7)
         """
         self.optimize_loop(ops, expected, preamble)
 
@@ -2723,16 +2720,16 @@
         p2 = new_with_vtable(descr=nodesize)
         setfield_gc(p2, p4, descr=nextdescr)
         setfield_gc(p1, p2, descr=nextdescr)
-        #i101 = same_as(i4)
-        jump(p1, i2, i4, p4) #, i101)
-        """
-        expected = """
-        [p1, i2, i4, p4] #, i5]
+        i101 = same_as_i(i4)
+        jump(p1, i2, i4, p4, i101)
+        """
+        expected = """
+        [p1, i2, i4, p4, i5]
         guard_true(i4) [p1, p4]
         p2 = new_with_vtable(descr=nodesize)
         setfield_gc(p2, p4, descr=nextdescr)
         setfield_gc(p1, p2, descr=nextdescr)
-        jump(p1, i2, 1, p4) #, i5)
+        jump(p1, i2, i5, p4, i5)
         """
         self.optimize_loop(ops, expected, preamble)
 
@@ -3697,16 +3694,17 @@
         jump(p1, i4, i3)
         '''
         expected = '''
-        [p1, i4, i3]
-        setfield_gc(p1, i3, descr=valuedescr)
-        jump(p1, i3, i3)
+        [p1, i4, i3, i5]
+        setfield_gc(p1, i5, descr=valuedescr)
+        jump(p1, i3, i5, i5)
         '''
         preamble = '''
         [p1, i1, i4]
         setfield_gc(p1, i1, descr=valuedescr)
         i3 = call_i(p1, descr=elidablecalldescr)
         setfield_gc(p1, i3, descr=valuedescr)
-        jump(p1, i4, i3)
+        ifoo = same_as_i(i3)
+        jump(p1, i4, i3, ifoo)
         '''
         self.optimize_loop(ops, expected, preamble)
 
@@ -3723,9 +3721,9 @@
         jump(p1, i4, i3)
         '''
         expected = '''
-        [p1, i4, i3]
-        setfield_gc(p1, i3, descr=valuedescr)
-        jump(p1, i3, i3)
+        [p1, i4, i3, i5]
+        setfield_gc(p1, i5, descr=valuedescr)
+        jump(p1, i3, i5, i5)
         '''
         preamble = '''
         [p1, i1, i4]
@@ -3733,9 +3731,8 @@
         i3 = call_i(p1, descr=elidable2calldescr)
         guard_no_exception() []
         setfield_gc(p1, i3, descr=valuedescr)
-        #i148 = same_as(i3)
-        #i147 = same_as(i3)
-        jump(p1, i4, i3) #, i148)
+        i147 = same_as_i(i3)
+        jump(p1, i4, i3, i147)
         '''
         self.optimize_loop(ops, expected, preamble)
 
@@ -3781,16 +3778,16 @@
         jump(p1, i4, i3)
         '''
         expected = '''
-        [p1, i4, i3]
+        [p1, i4, i3, i5]
         setfield_gc(p1, i4, descr=valuedescr)
-        jump(p1, i3, i3)
+        jump(p1, i3, i5, i5)
         '''
         preamble = '''
         [p1, i1, i4]
         setfield_gc(p1, i1, descr=valuedescr)
         i3 = call_i(p1, descr=elidablecalldescr)
-        # i151 = same_as_i(i3)
-        jump(p1, i4, i3)
+        i151 = same_as_i(i3)
+        jump(p1, i4, i3, i151)
         '''
         self.optimize_loop(ops, expected, preamble)
 
@@ -3810,14 +3807,14 @@
         escape_n(i1)
         escape_n(i2)
         i4 = call_i(123456, 4, i0, 6, descr=elidablecalldescr)
-        # i153 = same_as_i(i4)
-        jump(i0, i4)
+        i153 = same_as_i(i4)
+        jump(i0, i4, i153)
         '''
         expected = '''
-        [i0, i4]
+        [i0, i4, i5]
         escape_n(42)
         escape_n(i4)
-        jump(i0, i4)
+        jump(i0, i5, i5)
         '''
         self.optimize_loop(ops, expected, preamble, call_pure_results)
 
@@ -3834,12 +3831,13 @@
         escape_n(i0)
         i3 = call_i(123456, p0, descr=elidable2calldescr)
         guard_no_exception() []
-        jump(p0, i3)
+        ifoo = same_as_i(i3)
+        jump(p0, i3, ifoo)
         '''
         expected = '''
-        [p0, i3]
+        [p0, i3, ifoo]
         escape_n(i3)
-        jump(p0, i3)
+        jump(p0, ifoo, ifoo)
         '''
         self.optimize_loop(ops, expected, preamble)
 
@@ -4686,7 +4684,6 @@
         [i0, p0]
         p1 = new_array(i0, descr=gcarraydescr)
         i1 = arraylen_gc(p1)
-        ifoo = arraylen_gc(p0, descr=gcarraydescr)
         setarrayitem_gc(p0, 0, p1, descr=gcarraydescr)
         jump(i0, p0)
         """
@@ -6421,12 +6418,13 @@
         [p1, i1, i2, i3]
         escape_n(i3)
         i4 = int_sub(i2, i1)
-        jump(p1, i1, i2, i4)
-        """
-        expected = """
-        [p1, i1, i2, i3]
+        i5 = same_as_i(i4)
+        jump(p1, i1, i2, i4, i5)
+        """
+        expected = """
+        [p1, i1, i2, i3, i5]
         escape_n(i3)
-        jump(p1, i1, i2, i3)
+        jump(p1, i1, i2, i5, i5)
         """
         self.optimize_strunicode_loop(ops, expected, preamble)
 
@@ -8156,9 +8154,9 @@
         jump(i1, i3)
         """
         expected = """
-        [i1, i2, i3]
+        [i1, i2, i3, i4]
         call_n(i3, descr=nonwritedescr)
-        jump(i1, i2, i3)
+        jump(i1, i2, i3, i4)
         """
         short = """
         [i1, i2]
@@ -8166,7 +8164,7 @@
         i4 = int_add(i3, i3)
         i5 = int_add(i4, i4)
         i6 = int_add(i5, i5)
-        jump(i6)
+        jump(i6, i3)
         """
         self.optimize_loop(ops, expected, expected_short=short)
 
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
@@ -21,8 +21,10 @@
             self.optunroll.short_preamble_producer.use_box(op,
                                                 preamble_op.preamble_op, self)
             if not preamble_op.op.is_constant():
+                if preamble_op.invented_name:
+                    op = self.get_box_replacement(op)
                 self.optunroll.potential_extra_ops[op] = preamble_op
-            return op
+            return preamble_op.op
         return preamble_op
 
     def setinfo_from_preamble_list(self, lst, infos):
diff --git a/rpython/jit/metainterp/resoperation.py 
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -80,6 +80,11 @@
     def getopnum(self):
         return self.opnum
 
+    #def same_box(self, other):
+    #    if self.is_same_as():
+    #        return self is other or self.getarg(0).same_box(other)
+    #    return self is other
+
     def get_forwarded(self):
         return self._forwarded
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to