Author: Richard Plangger <r...@pasra.at>
Branch: vecopt2
Changeset: r77076:b5bd7163629b
Date: 2015-03-12 17:32 +0100
http://bitbucket.org/pypy/pypy/changeset/b5bd7163629b/

Log:    added some more test cases. int_sub/int_mul is not supported to
        calculate the memory ref positions

diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py 
b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -1,4 +1,3 @@
-
 from rpython.jit.metainterp.resoperation import rop
 
 class Dependency(object):
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
@@ -91,6 +91,11 @@
         assert not m1.is_adjacent_to(m2)
         assert not m2.is_adjacent_to(m1)
 
+    def debug_print_operations(self, loop):
+        print('--- loop instr numbered ---')
+        for i,op in enumerate(loop.operations):
+            print(i,op)
+
 class BaseTestDependencyGraph(DepTestHelper):
     def test_dependency_1(self):
         ops = """
@@ -267,9 +272,6 @@
         jump(p0,i1)
         """
         vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),2)
-        print()
-        for i,op in enumerate(vopt.optimizer.loop.operations):
-            print(i,op)
         vopt.build_dependency_graph()
         self.assert_no_edge(vopt.dependency_graph, [(i,i) for i in range(6)])
         self.assert_def_use(vopt.dependency_graph, [(0,1),(2,3),(4,5)])
@@ -288,6 +290,121 @@
         assert mref1.is_adjacent_to(mref3)
         assert mref3.is_adjacent_to(mref1)
 
+    def test_array_memory_ref_1(self):
+        ops = """
+        [p0,i0]
+        i3 = raw_load(p0,i0,descr=chararraydescr)
+        jump(p0,i0)
+        """
+        vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+        vopt.build_dependency_graph()
+        vopt.find_adjacent_memory_refs()
+        mref1 = vopt.vec_info.memory_refs[1]
+        assert isinstance(mref1, MemoryRef)
+        assert mref1.factor_c == 1
+        assert mref1.factor_d == 0
+
+    def test_array_memory_ref_2(self):
+        ops = """
+        [p0,i0]
+        i1 = int_add(i0,1)
+        i3 = raw_load(p0,i1,descr=chararraydescr)
+        jump(p0,i1)
+        """
+        vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+        vopt.build_dependency_graph()
+        vopt.find_adjacent_memory_refs()
+        mref1 = vopt.vec_info.memory_refs[2]
+        assert isinstance(mref1, MemoryRef)
+        assert mref1.factor_c == 1
+        assert mref1.factor_d == 1
+
+    def test_array_memory_ref_sub_index(self):
+        ops = """
+        [p0,i0]
+        i1 = int_sub(i0,1)
+        i3 = raw_load(p0,i1,descr=chararraydescr)
+        jump(p0,i1)
+        """
+        vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+        vopt.build_dependency_graph()
+        vopt.find_adjacent_memory_refs()
+        mref1 = vopt.vec_info.memory_refs[2]
+        assert isinstance(mref1, MemoryRef)
+        assert mref1.factor_c == 1
+        assert mref1.factor_d == -1
+
+    def test_array_memory_ref_add_mul_index(self):
+        ops = """
+        [p0,i0]
+        i1 = int_add(i0,1)
+        i2 = int_mul(i1,3)
+        i3 = raw_load(p0,i2,descr=chararraydescr)
+        jump(p0,i1)
+        """
+        vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+        vopt.build_dependency_graph()
+        vopt.find_adjacent_memory_refs()
+        mref1 = vopt.vec_info.memory_refs[3]
+        assert isinstance(mref1, MemoryRef)
+        assert mref1.factor_c == 3
+        assert mref1.factor_d == 3
+
+    def test_array_memory_ref_add_mul_index_interleaved(self):
+        ops = """
+        [p0,i0]
+        i1 = int_add(i0,1)
+        i2 = int_mul(i1,3)
+        i3 = int_add(i2,5)
+        i4 = int_mul(i3,6)
+        i5 = raw_load(p0,i4,descr=chararraydescr)
+        jump(p0,i4)
+        """
+        vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+        vopt.build_dependency_graph()
+        vopt.find_adjacent_memory_refs()
+        mref1 = vopt.vec_info.memory_refs[5]
+        assert isinstance(mref1, MemoryRef)
+        assert mref1.factor_c == 18
+        assert mref1.factor_d == 48
+
+        ops = """
+        [p0,i0]
+        i1 = int_add(i0,1)
+        i2 = int_mul(i1,3)
+        i3 = int_add(i2,5)
+        i4 = int_mul(i3,6)
+        i5 = int_add(i4,30)
+        i6 = int_mul(i5,57)
+        i7 = raw_load(p0,i6,descr=chararraydescr)
+        jump(p0,i6)
+        """
+        vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+        vopt.build_dependency_graph()
+        vopt.find_adjacent_memory_refs()
+        mref1 = vopt.vec_info.memory_refs[7]
+        assert isinstance(mref1, MemoryRef)
+        assert mref1.factor_c == 1026
+        assert mref1.factor_d == 57*(30) + 57*6*(5) + 57*6*3*(1)
+
+    def test_array_memory_ref_sub_mul_index_interleaved(self):
+        ops = """
+        [p0,i0]
+        i1 = int_add(i0,1)
+        i2 = int_mul(i1,3)
+        i3 = int_sub(i2,3)
+        i4 = int_mul(i3,2)
+        i5 = raw_load(p0,i4,descr=chararraydescr)
+        jump(p0,i4)
+        """
+        vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+        vopt.build_dependency_graph()
+        vopt.find_adjacent_memory_refs()
+        mref1 = vopt.vec_info.memory_refs[5]
+        assert isinstance(mref1, MemoryRef)
+        assert mref1.factor_c == 6
+        assert mref1.factor_d == 0
+
     def test_array_memory_ref_not_adjacent_1(self):
         ops = """
         [p0,i0,i4]
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
@@ -161,17 +161,12 @@
         operations = loop.operations
         integral_mod = IntegralMod(self.optimizer)
         for opidx,memref in self.vec_info.memory_refs.items():
-            print("trying ref", memref, "op idx", opidx)
+            integral_mod.reset()
             while True:
-                op = operations[opidx]
-                if op.getopnum() == rop.LABEL:
-                    break
 
-                print("checking op at idx", opidx)
                 for dep in self.dependency_graph.instr_dependencies(opidx):
                     # this is a use, thus if dep is not a defintion
                     # it points back to the definition
-                    print(memref.origin, " == ", dep.defined_arg)
                     if memref.origin == dep.defined_arg and not 
dep.is_definition:
                         # if is_definition is false the params is swapped
                         # idx_to attributes points to definer
@@ -183,9 +178,10 @@
                     raise RuntimeError("a variable usage does not have a " +
                              " definition. Cannot continue!")
 
-                print("reset")
-                integral_mod.reset()
-                print("inspect ", def_op)
+                op = operations[opidx]
+                if op.getopnum() == rop.LABEL:
+                    break
+
                 integral_mod.inspect_operation(def_op)
                 if integral_mod.is_const_mod:
                     integral_mod.update_memory_ref(memref)
@@ -221,8 +217,23 @@
         self.factor_d = 0
         self.used_box = None
 
+    def operation_INT_SUB(self, op):
+        box_a0 = op.getarg(0)
+        box_a1 = op.getarg(1)
+        a0 = self.optimizer.getvalue(box_a0)
+        a1 = self.optimizer.getvalue(box_a1)
+        if a0.is_constant() and a1.is_constant():
+            raise NotImplementedError()
+        elif a0.is_constant():
+            self.is_const_mod = True
+            self.factor_d -= box_a0.getint() * self.factor_c
+            self.used_box = box_a1
+        elif a1.is_constant():
+            self.is_const_mod = True
+            self.factor_d -= box_a1.getint() * self.factor_c
+            self.used_box = box_a0
+
     def operation_INT_ADD(self, op):
-        print("int_add")
         box_a0 = op.getarg(0)
         box_a1 = op.getarg(1)
         a0 = self.optimizer.getvalue(box_a0)
@@ -230,23 +241,44 @@
         if a0.is_constant() and a1.is_constant():
             # this means that the overall array offset is not
             # added to a variable, but is constant
-            self.is_const_mod = True
-            self.factor_d += box_a1.getint() + box_a0.getint()
-            self.used_box = None
+            raise NotImplementedError()
         elif a0.is_constant():
             self.is_const_mod = True
-            self.factor_d += box_a0.getint()
+            self.factor_d += box_a0.getint() * self.factor_c
             self.used_box = box_a1
         elif a1.is_constant():
             self.is_const_mod = True
-            self.factor_d += box_a1.getint()
+            print('add', box_a1.getint(), self.factor_c)
+            self.factor_d += box_a1.getint() * self.factor_c
+            self.used_box = box_a0
+
+    def operation_INT_MUL(self, op):
+        """ Whenever a multiplication occurs this only alters the
+        factor_c. When later a plus occurs, factor_c multiplies the added
+        operand. """
+        box_a0 = op.getarg(0)
+        box_a1 = op.getarg(1)
+        a0 = self.optimizer.getvalue(box_a0)
+        a1 = self.optimizer.getvalue(box_a1)
+        if a0.is_constant() and a1.is_constant():
+            # this means that the overall array offset is not
+            # added to a variable, but is constant
+            raise NotImplementedError()
+        elif a0.is_constant():
+            self.is_const_mod = True
+            self.factor_c *= box_a0.getint()
+            self.used_box = box_a1
+        elif a1.is_constant():
+            self.is_const_mod = True
+            self.factor_c *= box_a1.getint()
             self.used_box = box_a0
 
     def update_memory_ref(self, memref):
+        #print("updating memory ref pre: ", memref)
         memref.factor_d = self.factor_d
         memref.factor_c = self.factor_c
         memref.origin = self.used_box
-        print("update", memref.factor_d, memref.factor_c, memref.origin)
+        #print("updating memory ref post: ", memref)
 
     def default_operation(self, operation):
         pass
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to