[pypy-commit] pypy vecopt: prepending invariant operations before the label

plan_rich noreply at buildbot.pypy.org
Tue Jun 2 15:48:26 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77767:9a42391307c6
Date: 2015-06-02 15:48 +0200
http://bitbucket.org/pypy/pypy/changeset/9a42391307c6/

Log:	prepending invariant operations before the label moved inlined ops
	before header in the tests (vectorize)

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
@@ -30,12 +30,18 @@
 
     jitdriver_sd = FakeJitDriverStaticData()
 
-    def parse_loop(self, ops):
+    def parse_loop(self, ops, add_label=True):
         loop = self.parse(ops, postprocess=self.postprocess)
         token = JitCellToken()
-        loop.operations = \
-            [ResOperation(rop.LABEL, loop.inputargs, None, descr=TargetToken(token))] + \
-            loop.operations
+        pre = []
+        tt = TargetToken(token)
+        if add_label:
+            pre = [ResOperation(rop.LABEL, loop.inputargs, None, descr=tt)]
+        else:
+            for i,op in enumerate(loop.operations):
+                if op.getopnum() == rop.LABEL:
+                    op.setdescr(tt)
+        loop.operations = pre + loop.operations
         if loop.operations[-1].getopnum() == rop.JUMP:
             loop.operations[-1].setdescr(token)
         return loop
@@ -988,6 +994,8 @@
         """
         opt="""
         [p0,i0]
+        v3 = vec_int_expand(42)
+        label(p0,i0,v3)
         guard_early_exit() [p0,i0]
         i20 = int_add(i0, 1)
         i30 = int_lt(i20, 10)
@@ -997,12 +1005,11 @@
         i4 = int_add(i0, 2)
         i5 = int_lt(i2, 10)
         v1 = vec_getarrayitem_raw(p0, i0, 2, descr=floatarraydescr)
-        v3 = vec_int_expand(42)
         v2 = vec_int_mul(v1, v3)
-        jump(p0,i2)
+        jump(p0,i2,v3)
         """
         vopt = self.vectorize(self.parse_loop(ops),1)
-        self.assert_equal(vopt.loop, self.parse_loop(opt))
+        self.assert_equal(vopt.loop, self.parse_loop(opt,add_label=False))
 
     def test_variable_expansion(self):
         ops = """
@@ -1017,6 +1024,8 @@
         """
         opt="""
         [p0,i0,f3]
+        v3 = vec_float_expand(f3)
+        label(p0,i0,f3,v3)
         guard_early_exit() [p0,i0]
         i20 = int_add(i0, 1)
         i30 = int_lt(i20, 10)
@@ -1026,12 +1035,11 @@
         i4 = int_add(i0, 2)
         i5 = int_lt(i2, 10)
         v1 = vec_getarrayitem_raw(p0, i0, 2, descr=floatarraydescr)
-        v3 = vec_float_expand(f3)
         v2 = vec_int_mul(v1, v3)
-        jump(p0,i2,f3)
+        jump(p0,i2,f3,v3)
         """
         vopt = self.vectorize(self.parse_loop(ops),1)
-        self.assert_equal(vopt.loop, self.parse_loop(opt))
+        self.assert_equal(vopt.loop, self.parse_loop(opt, add_label=False))
 
     def test_element_f45_in_guard_failargs(self):
         ops = """
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
@@ -372,7 +372,8 @@
         if not we_are_translated():
             for node in self.dependency_graph.nodes:
                 assert node.emitted
-        self.loop.operations = self._newoperations[:]
+        self.loop.operations = \
+            sched_data.prepend_invariant_operations(self._newoperations)
         self.clear_newoperations()
 
     def unpack_from_vector(self, op, sched_data, renamer):
@@ -1261,6 +1262,26 @@
     def setvector_of_box(self, box, off, vector):
         self.box_to_vbox[box] = (off, vector)
 
+    def prepend_invariant_operations(self, oplist):
+        if len(self.invariant_oplist) > 0:
+            label = oplist[0]
+            assert label.getopnum() == rop.LABEL
+            jump = oplist[-1]
+            assert jump.getopnum() == rop.JUMP
+
+            label_args = label.getarglist()
+            jump_args = jump.getarglist()
+            for var in self.invariant_vector_vars:
+                label_args.append(var)
+                jump_args.append(var)
+
+            oplist[0] = label.copy_and_change(label.getopnum(), label_args, None, label.getdescr())
+            oplist[-1] = jump.copy_and_change(jump.getopnum(), jump_args, None, jump.getdescr())
+
+            return self.invariant_oplist + oplist
+
+        return oplist
+
 def isomorphic(l_op, r_op):
     """ Subject of definition """
     if l_op.getopnum() == r_op.getopnum():


More information about the pypy-commit mailing list