[pypy-commit] pypy backend-vector-ops: a test and a fix

fijal noreply at buildbot.pypy.org
Thu Feb 2 13:24:07 CET 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: backend-vector-ops
Changeset: r52027:4be184bcabec
Date: 2012-02-02 14:23 +0200
http://bitbucket.org/pypy/pypy/changeset/4be184bcabec/

Log:	a test and a fix

diff --git a/pypy/jit/metainterp/optimizeopt/test/test_vectorize.py b/pypy/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -35,3 +35,41 @@
         finish(p0, p1, p2, i0_1, i1_1, i2_1)        
         """
         self.optimize_loop(ops, expected)
+
+    def test_vectorize_unfit_trees(self):
+        ops = """
+        [p0, p1, p2, i0, i1, i2]
+        assert_aligned(p0, i0)
+        assert_aligned(p1, i1)
+        assert_aligned(p1, i2)
+        f0 = getarrayitem_raw(p0, i0, descr=arraydescr)
+        f1 = getarrayitem_raw(p1, i1, descr=arraydescr)
+        f2 = float_add(f0, f1)
+        setarrayitem_raw(p2, i2, f2, descr=arraydescr)
+        i0_1 = int_add(i0, 1)
+        i1_1 = int_add(1, i1)
+        i1_2 = int_add(1, i1_1)
+        i2_1 = int_add(i2, 1)
+        f0_1 = getarrayitem_raw(p0, i0_1, descr=arraydescr)
+        f1_1 = getarrayitem_raw(p1, i1_2, descr=arraydescr)
+        f2_1 = float_add(f0_1, f1_1)
+        setarrayitem_raw(p2, i2_1, f2_1, descr=arraydescr)
+        finish(p0, p1, p2, i0_1, i1_1, i2_1)
+        """
+        expected = """
+        [p0, p1, p2, i0, i1, i2]
+        i0_1 = int_add(i0, 1)
+        i1_1 = int_add(1, i1)
+        i1_2 = int_add(1, i1_1)
+        i2_1 = int_add(i2, 1)
+        f0 = getarrayitem_raw(p0, i0, descr=arraydescr)
+        f1 = getarrayitem_raw(p1, i1, descr=arraydescr)
+        f2 = float_add(f0, f1)
+        setarrayitem_raw(p2, i2, f2, descr=arraydescr)
+        f0_1 = getarrayitem_raw(p0, i0_1, descr=arraydescr)
+        f1_1 = getarrayitem_raw(p1, i1_2, descr=arraydescr)
+        f2_1 = float_add(f0_1, f1_1)
+        setarrayitem_raw(p2, i2_1, f2_1, descr=arraydescr)
+        finish(p0, p1, p2, i0_1, i1_1, i2_1)
+        """
+        self.optimize_loop(ops, expected)
diff --git a/pypy/jit/metainterp/optimizeopt/vectorize.py b/pypy/jit/metainterp/optimizeopt/vectorize.py
--- a/pypy/jit/metainterp/optimizeopt/vectorize.py
+++ b/pypy/jit/metainterp/optimizeopt/vectorize.py
@@ -16,10 +16,10 @@
         self.op = op
         self.index = index
 
-    def match(self, other):
+    def match(self, other, i):
         if not isinstance(other, Read):
             return False
-        return self.arr == other.arr
+        return self.arr == other.arr and other.index.index == i
 
     def emit(self, optimizer):
         box = BoxVector()
@@ -36,10 +36,10 @@
         self.v = v
         self.op = op
 
-    def match(self, other):
+    def match(self, other, i):
         if not isinstance(other, Write):
             return False
-        return self.v.match(other.v)
+        return self.v.match(other.v, i)
 
     def emit(self, optimizer):
         arg = self.v.emit(optimizer)
@@ -54,12 +54,13 @@
         self.left = left
         self.right = right
 
-    def match(self, other):
+    def match(self, other, i):
         if not isinstance(other, BinOp):
             return False
         if self.op.getopnum() != other.op.getopnum():
             return False
-        return self.left.match(other.left) and self.right.match(other.right)
+        return (self.left.match(other.left, i) and
+                self.right.match(other.right, i))
 
     def emit(self, optimizer):
         left_box = self.left.emit(optimizer)
@@ -141,6 +142,7 @@
         if index not in self.tracked_indexes or val not in self.track:
             self.emit_operation(op)
             return
+        self.ops_so_far.append(op)
         v = self.track[val]
         arr = self.getvalue(op.getarg(0))
         ti = self.tracked_indexes[index]
@@ -155,8 +157,9 @@
                 return
         if self.full:
             for arr, items in self.full.iteritems():
-                for item in items[1:]:
-                    if item is None or not items[0].match(item):
+                for i in range(1, len(items)):
+                    item = items[i]
+                    if item is None or not items[0].match(item, i):
                         self.reset()
                         return
                 # XXX Right now we blow up on any of the vectorizers not


More information about the pypy-commit mailing list