[pypy-commit] pypy vecopt: generalized extend

plan_rich noreply at buildbot.pypy.org
Fri May 29 15:55:02 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77688:d89d708eeea2
Date: 2015-05-29 14:36 +0200
http://bitbucket.org/pypy/pypy/changeset/d89d708eeea2/

Log:	generalized extend dont overwrite resume at loop header descr in
	unrolling (this will lead to stronger dependencies)

diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -1300,18 +1300,19 @@
 
     def test_abc(self):
         trace ="""
-        [p0, p1, p5, i6, i7, p3, p8, i9, i10, i11, i12, i13, i14, p15]
-        guard_early_exit() [p3, p1, p0, i9, p5, p8, i6, i7, i10]
-        f16 = raw_load(i11, i7, descr=floatarraydescr)
-        guard_not_invalidated() [p3, p1, p0, f16, i9, p5, p8, i6, i7, i10]
-        raw_store(i12, i10, f16, descr=floatarraydescr)
-        i18 = int_add(i9, 1)
-        i19 = int_add(i10, i13)
-        i21 = int_add(i7, 8)
-        i22 = int_ge(i18, i14)
-        guard_false(i22) [p3, p1, p0, i21, i19, i18, None, p5, p8, i6, None, None]
-        i24 = arraylen_gc(p15, descr=floatarraydescr)
-        jump(p0, p1, p5, i6, i21, p3, p8, i18, i19, i11, i12, i13, i14, p15)
+        [p0, p9, i10, p2, i11, p12, i13, p7, i14, f15, p5, p6, i16, f17, i18, i19]
+        guard_early_exit() [p7, p6, p5, p2, p0, i10, i14, i11, p12, i13, f15, p9]
+        i20 = raw_load(i16, i11, descr=floatarraydescr)
+        guard_not_invalidated() [p7, p6, p5, p2, p0, i20, i10, i14, i11, p12, i13, None, p9]
+        f22 = cast_int_to_float(i20)
+        i24 = int_add(i11, 8)
+        f25 = float_add(f22, f17)
+        raw_store(i18, i14, f25, descr=floatarraydescr)
+        i27 = int_add(i13, 1)
+        i29 = int_add(i14, 8)
+        i30 = int_ge(i27, i19)
+        guard_false(i30) [p7, p6, p5, p2, p0, i24, i27, i29, f22, i10, None, None, p12, None, None, p9]
+        jump(p0, p9, i10, p2, i24, p12, i27, p7, i29, f22, p5, p6, i16, f17, i18, i19)
         """
         opt = self.vectorize(self.parse_loop(trace))
         self.debug_print_operations(opt.loop)
diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/vectorize.py
@@ -201,10 +201,12 @@
                 if copied_op.is_guard():
                     assert isinstance(copied_op, GuardResOp)
                     target_guard = copied_op
-                    descr = invent_fail_descr_for_op(copied_op.getopnum(), self)
-                    olddescr = copied_op.getdescr()
-                    descr.copy_all_attributes_from(olddescr)
-                    copied_op.setdescr(descr)
+                    if not isinstance(target_guard.getdescr(), ResumeAtLoopHeaderDescr):
+                        # do not overwrite resume at loop header
+                        descr = invent_fail_descr_for_op(copied_op.getopnum(), self)
+                        olddescr = copied_op.getdescr()
+                        descr.copy_all_attributes_from(olddescr)
+                        copied_op.setdescr(descr)
 
                     if oi < ee_pos:
                         # do not clone the arguments, it is already an early exit
@@ -871,6 +873,15 @@
             vbox = self.expand_box_to_vector_box(vbox, ops, arg, argidx)
             box_pos = 0
 
+        enforced_type = self.ptype
+        # convert type f -> i, i -> f
+        # if enforced_type.gettype() != vbox.gettype():
+        #     raise NotImplementedError("cannot yet convert between types")
+
+        # convert size i64 -> i32, i32 -> i64, ...
+        if enforced_type.getsize() != vbox.getsize():
+            vbox = self.extend(vbox, self.ptype)
+
         # use the input as an indicator for the pack type
         arg_ptype = PackType.of(vbox)
         packable = self.sched_data.vec_reg_size // arg_ptype.getsize()
@@ -884,24 +895,30 @@
         elif packed > packable:
             # the argument has more items than the operation is able to process!
             vbox = self.unpack(vbox, off, packable, arg_ptype)
-            vbox = self.extend(vbox, arg_ptype)
-            # continue to handle the rest of the vbox
         #
-        # The instruction takes less items than the vector has.
-        # Unpack if not at off 0
         if off != 0 and box_pos != 0:
+            # The original box is at a position != 0 but it
+            # is required to be at position 0. Unpack it!
             vbox = self.unpack(vbox, off, len(ops), arg_ptype)
         #
         return vbox
 
-    def extend(self, vbox, arg_ptype):
+    def extend(self, vbox, newtype):
         if vbox.item_count * vbox.item_size == self.sched_data.vec_reg_size:
             return vbox
-        size = arg_ptype.getsize()
-        assert (vbox.item_count * size) == self.sched_data.vec_reg_size
-        opnum = rop.VEC_INT_SIGNEXT
-        vbox_cloned = arg_ptype.new_vector_box(vbox.item_count)
-        op = ResOperation(opnum, [vbox, ConstInt(size), ConstInt(vbox.item_count)], vbox_cloned)
+        assert vbox.gettype() == newtype.gettype()
+        assert (vbox.item_count * newtype.getsize()) == \
+               self.sched_data.vec_reg_size
+        if vbox.gettype() == INT:
+            return self.extend_int(vbox, newtype)
+        else:
+            raise NotImplementedError("cannot yet extend float")
+
+    def extend_int(self, vbox, newtype):
+        vbox_cloned = newtype.new_vector_box(vbox.item_count)
+        op = ResOperation(rop.VEC_INT_SIGNEXT, 
+                          [vbox, ConstInt(newtype.getsize())],
+                          vbox_cloned)
         self.preamble_ops.append(op)
         return vbox_cloned
 


More information about the pypy-commit mailing list