Author: Richard Plangger <r...@pasra.at>
Branch: vecopt
Changeset: r78325:2df6133da026
Date: 2015-06-26 16:56 +0200
http://bitbucket.org/pypy/pypy/changeset/2df6133da026/

Log:    test_vectorize passing again

diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py 
b/rpython/jit/metainterp/optimizeopt/schedule.py
--- a/rpython/jit/metainterp/optimizeopt/schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/schedule.py
@@ -294,15 +294,12 @@
         pass
 
     def transform_pack(self):
-        #self.off = 0
-        #while self.off < self.pack.opcount():
         op = self.pack.operations[0].getoperation()
         args = op.getarglist()
         #
         self.before_argument_transform(args)
         #
-        argument_infos = []
-        self.transform_arguments(args, argument_infos)
+        self.transform_arguments(args)
         #
         result = op.result
         result = self.transform_result(result)
@@ -313,22 +310,7 @@
             vop.setfailargs(op.getfailargs())
             vop.rd_snapshot = op.rd_snapshot
         self.preamble_ops.append(vop)
-        #stride = self.consumed_operations(argument_infos, result)
         self.costmodel.record_pack_savings(self.pack, self.pack.opcount())
-        #assert stride != 0
-        #self.off += stride
-
-    def consumed_operations(self, argument_infos, result):
-        ops = self.getoperations()
-        if len(argument_infos) == 0:
-            return result.getcount()
-        if len(argument_infos) == 1:
-            return argument_infos[0]
-        if not we_are_translated():
-            first = argument_infos[0]
-            for ai in argument_infos:
-                assert first == ai
-        return argument_infos[0]
 
     def transform_result(self, result):
         if result is None:
@@ -353,7 +335,7 @@
     def getoperations(self):
         return self.pack.operations
 
-    def transform_arguments(self, args, argument_info):
+    def transform_arguments(self, args):
         for i,arg in enumerate(args):
             if isinstance(arg, BoxVector):
                 continue
@@ -361,7 +343,6 @@
                 continue
             box_pos, vbox = self.sched_data.getvector_of_box(arg)
             if not vbox:
-                import pdb; pdb.set_trace()
                 # constant/variable expand this box
                 vbox = self.expand(arg, i)
                 self.sched_data.setvector_of_box(arg, 0, vbox)
@@ -379,9 +360,8 @@
             if packed > packable:
                 # the argument has more items than the operation is able to 
process!
                 # box_pos == 0 then it is already at the right place
-                argument_info.append(packable)
                 if box_pos != 0:
-                    args[i] = self.unpack(vbox, self.off, packable, 
self.input_type)
+                    args[i] = self.unpack(vbox, box_pos, packable, 
self.input_type)
                     self.update_arg_in_vector_pos(i, args[i])
                     #self.update_input_output(self.pack)
                     continue
@@ -394,20 +374,17 @@
                 # the argument is scattered along different vector boxes
                 args[i] = self.gather(vboxes, packable)
                 self.update_arg_in_vector_pos(i, args[i])
-                argument_info.append(args[i].item_count)
                 continue
             if box_pos != 0:
                 # The vector box is at a position != 0 but it
                 # is required to be at position 0. Unpack it!
-                args[i] = self.unpack(vbox, self.off, packable, 
self.input_type)
+                args[i] = self.unpack(vbox, box_pos, packable, self.input_type)
                 self.update_arg_in_vector_pos(i, args[i])
-                argument_info.append(args[i].item_count)
                 continue
                 #self.update_input_output(self.pack)
             #
             assert vbox is not None
             args[i] = vbox
-            argument_info.append(args[i].item_count)
 
     def gather(self, vboxes, target_count): # packed < packable and packed < 
stride:
         (_, box) = vboxes[0]
@@ -798,6 +775,7 @@
 
     def setvector_of_box(self, box, off, vector):
         assert off < vector.item_count
+        print "set" , box, "[",off,"] =", vector
         self.box_to_vbox[box] = (off, vector)
 
     def prepend_invariant_operations(self, oplist):
@@ -845,8 +823,8 @@
     def opcount(self):
         return len(self.operations)
 
-    def process_count(self):
-        return len(self.operations)
+    def leftmost(self):
+        return self.operations[0].getoperation()
 
     def is_full(self, vec_reg_size):
         """ if one input element times the opcount is equal
@@ -855,9 +833,15 @@
         ptype = self.input_type
         if self.input_type is None:
             # load does not have an input type, but only an output type
-            assert self.operations[0].getoperation().is_raw_load()
+            assert self.leftmost().is_raw_load()
             ptype = self.output_type
-        bytes = ptype.getsize() * self.process_count()
+
+        op = self.leftmost()
+        if op.casts_box():
+            assert self.output_type.getcount() <= ptype.getcount()
+            return self.output_type.getcount() <= ptype.getcount()
+
+        bytes = ptype.getsize() * len(self.operations)
         assert bytes <= vec_reg_size
         if bytes == vec_reg_size:
             return True
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
@@ -413,7 +413,7 @@
                         continue
                     # check if the pack is already full
                     if pack1.is_full(self.cpu.vector_register_size):
-                        pack1.update_pack_of_nodes()
+                        #pack1.update_pack_of_nodes()
                         right = pack1.operations[-1]
                         remove_left[right] = None
                         break
@@ -424,8 +424,8 @@
                         # this could miss some pack
                         j += 1
                 # set for each node to which pack it belongs
-                self.packset.packs[i].update_pack_of_nodes()
-
+                pack = self.packset.packs[i]
+                pack.update_pack_of_nodes()
                 j = 0
                 i += 1
             if len_before == len(self.packset.packs):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to