[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