[pypy-commit] pypy vecopt: correctly emitting normal guards not subject of the strengh opt

plan_rich noreply at buildbot.pypy.org
Thu May 28 16:45:33 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77655:f9c2fe944393
Date: 2015-05-28 15:50 +0200
http://bitbucket.org/pypy/pypy/changeset/f9c2fe944393/

Log:	correctly emitting normal guards not subject of the strengh opt
	copying failargs, descr and frame info on strength opt added some
	traces to test_vectorize

diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -347,7 +347,6 @@
         """
 
     def test_reduce_compile_only_once(self):
-        py.test.skip('TODO')
         self.compile_graph()
         reset_jit()
         i = self.code_mapping['reduce']
@@ -358,7 +357,6 @@
         assert len(get_stats().loops) == 1
 
     def test_reduce_axis_compile_only_once(self):
-        py.test.skip('TODO')
         self.compile_graph()
         reset_jit()
         i = self.code_mapping['axissum']
@@ -375,22 +373,12 @@
         """
 
     def test_prod(self):
-        py.test.skip('TODO')
         result = self.run("prod")
         expected = 1
         for i in range(30):
             expected *= i * 2
         assert result == expected
         self.check_trace_count(1)
-        self.check_simple_loop({
-            'float_mul': 1,
-            'guard_false': 1,
-            'guard_not_invalidated': 1,
-            'int_add': 2,
-            'int_ge': 1,
-            'jump': 1,
-            'raw_load': 1,
-        })
 
     def define_max():
         return """
@@ -400,38 +388,9 @@
         """
 
     def test_max(self):
-        py.test.skip('TODO')
         result = self.run("max")
         assert result == 128
         self.check_trace_count(3)
-        self.check_simple_loop({
-            'float_ge': 1,
-            'float_ne': 1,
-            'guard_false': 3,
-            'guard_not_invalidated': 1,
-            'int_add': 2,
-            'int_ge': 1,
-            'jump': 1,
-            'raw_load': 1,
-        })
-        self.check_resops({
-            'float_ge': 2,
-            'float_ne': 2,
-            'getfield_gc': 4,
-            'getfield_gc_pure': 30,
-            'guard_class': 1,
-            'guard_false': 8,
-            'guard_nonnull': 2,
-            'guard_nonnull_class': 2,
-            'guard_not_invalidated': 2,
-            'guard_true': 7,
-            'guard_value': 2,
-            'int_add': 8,
-            'int_ge': 4,
-            'int_is_true': 3,
-            'jump': 3,
-            'raw_load': 2,
-        })
 
     def define_min():
         return """
@@ -441,20 +400,9 @@
         """
 
     def test_min(self):
-        py.test.skip('TODO')
         result = self.run("min")
         assert result == -128
         self.check_trace_count(1)
-        self.check_simple_loop({
-            'float_le': 1,
-            'guard_false': 1,
-            'guard_not_invalidated': 1,
-            'guard_true': 1,
-            'int_add': 2,
-            'int_ge': 1,
-            'jump': 1,
-            'raw_load': 1,
-        })
 
     def define_any():
         return """
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
@@ -1278,6 +1278,25 @@
         opt = self.vectorize(self.parse_loop(trace))
         self.debug_print_operations(opt.loop)
 
+    def test_max(self):
+        trace = """
+        [p3, i4, p2, i5, f6, i7, i8]
+        guard_early_exit() [p2, f6, i4, i5, p3]
+        f9 = raw_load(i7, i5, descr=floatarraydescr)
+        guard_not_invalidated() [p2, f9, f6, i4, i5, p3]
+        i10 = float_ge(f6, f9)
+        guard_false(i10) [p2, f9, f6, None, i4, i5, p3]
+        i12 = float_ne(f6, f6)
+        guard_false(i12) [p2, f9, f6, None, i4, i5, p3]
+        i14 = int_add(i4, 1)
+        i16 = int_add(i5, 8)
+        i17 = int_ge(i14, i8)
+        guard_false(i17) [p2, i16, f9, i14, None, None, None, p3]
+        jump(p3, i14, p2, i16, f9, i7, i8)
+        """
+        opt = self.vectorize(self.parse_loop(trace))
+        self.debug_print_operations(opt.loop)
+
     def test_reduction_basic(self):
         trace = """
         [p5, i6, p2, i7, p1, p8, i9, i10, f11, i12, i13, i14]
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
@@ -35,10 +35,7 @@
         for i,op in enumerate(loop.operations):
             print "[",str(i).center(2," "),"]",op,
             if op.is_guard():
-                if op.rd_snapshot is not None:
-                    print ps(op.rd_snapshot)
-                else:
-                    print op.getfailargs()
+                print op.getfailargs()
             else:
                 print ""
 
@@ -356,13 +353,14 @@
         self.clear_newoperations()
         sched_data = VecScheduleData(self.metainterp_sd.cpu.vector_register_size)
         scheduler = Scheduler(self.dependency_graph, sched_data)
+        renamer = Renamer()
         while scheduler.has_more():
             position = len(self._newoperations)
             ops = scheduler.next(position)
             for op in ops:
                 if self.tried_to_pack:
-                    self.unpack_from_vector(op, sched_data)
-                self.emit_operation(op)
+                    self.unpack_from_vector(op, sched_data, renamer)
+                self.emit_operation(op), op.getfailargs()
 
         if not we_are_translated():
             for node in self.dependency_graph.nodes:
@@ -370,26 +368,27 @@
         self.loop.operations = self._newoperations[:]
         self.clear_newoperations()
 
-    def unpack_from_vector(self, op, sched_data):
+    def unpack_from_vector(self, op, sched_data, renamer):
+        renamer.rename(op)
         args = op.getarglist()
         for i, arg in enumerate(op.getarglist()):
             if isinstance(arg, Box):
-                argument = self._unpack_from_vector(i, arg, sched_data)
+                argument = self._unpack_from_vector(i, arg, sched_data, renamer)
                 if arg is not argument:
                     op.setarg(i, argument)
         if op.is_guard():
             fail_args = op.getfailargs()
             for i, arg in enumerate(fail_args):
                 if arg and isinstance(arg, Box):
-                    argument = self._unpack_from_vector(i, arg, sched_data)
+                    argument = self._unpack_from_vector(i, arg, sched_data, renamer)
                     if arg is not argument:
                         fail_args[i] = argument
 
-    def _unpack_from_vector(self, i, arg, sched_data):
-        arg = sched_data.unpack_rename(arg)
+    def _unpack_from_vector(self, i, arg, sched_data, renamer):
         (j, vbox) = sched_data.box_to_vbox.get(arg, (-1, None))
         if vbox:
             arg_cloned = arg.clonebox()
+            renamer.start_renaming(arg, arg_cloned)
             cj = ConstInt(j)
             ci = ConstInt(1)
             opnum = rop.VEC_FLOAT_UNPACK
@@ -397,8 +396,7 @@
                 opnum = rop.VEC_INT_UNPACK
             unpack_op = ResOperation(opnum, [vbox, cj, ci], arg_cloned)
             self.emit_operation(unpack_op)
-            sched_data.rename_unpacked(arg, arg_cloned)
-            arg = arg_cloned
+            return arg_cloned
         return arg
 
     def analyse_index_calculations(self):
@@ -665,16 +663,26 @@
                         guard = Guard(i, op, cmp_op,
                                       lhs, lhs_arg, rhs, rhs_arg)
                         if guard.implies(other, self):
+                            op.setfailargs(other.op.getfailargs())
+                            op.setdescr(other.op.getdescr())
+                            op.rd_frame_info_list = other.op.rd_frame_info_list
+                            op.rd_snapshot = other.op.rd_snapshot
+
                             strongest_guards[key] = guard
                             guard.stronger = True
                             guard.index = other.index
                             guards[other.index] = guard
+
                             # do not mark as emit
                             continue
                         elif other.implies(guard, self):
                             guard.implied = True
                         # mark as emit
                         guards[i] = guard
+                else:
+                    # emit non guard_true/false guards
+                    guards[i] = Guard(i, op, None, None, None, None, None)
+
         strongest_guards = None
         #
         self.renamer = Renamer()
@@ -703,7 +711,6 @@
         self.renamer.rename(op)
         self._newoperations.append(op)
 
-
 def must_unpack_result_to_exec(op, target_op):
     # TODO either move to resop or util
     if op.getoperation().vector != -1:
@@ -1106,17 +1113,10 @@
 class VecScheduleData(SchedulerData):
     def __init__(self, vec_reg_size):
         self.box_to_vbox = {}
-        self.unpack_rename_map = {}
         self.preamble_ops = None
         self.expansion_byte_count = -1
         self.vec_reg_size = vec_reg_size
 
-    def unpack_rename(self, arg):
-        return self.unpack_rename_map.get(arg, arg)
-
-    def rename_unpacked(self, arg, argdest):
-        self.unpack_rename_map[arg] = argdest
-
     def as_vector_operation(self, pack):
         op_count = len(pack.operations)
         assert op_count > 1


More information about the pypy-commit mailing list