Author: Maciej Fijalkowski <[email protected]>
Branch: backend-vector-ops
Changeset: r52029:f51969a42502
Date: 2012-02-02 14:44 +0200
http://bitbucket.org/pypy/pypy/changeset/f51969a42502/
Log: guard support 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
@@ -176,3 +176,73 @@
"""
self.optimize_loop(ops, expected)
+ def test_guard_forces(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)
+ i2_1 = int_add(i2, 1)
+ f0_1 = getarrayitem_raw(p0, i0_1, descr=arraydescr)
+ f1_1 = getarrayitem_raw(p1, i1_1, descr=arraydescr)
+ f2_1 = float_add(f0_1, f1_1)
+ setarrayitem_raw(p2, i2_1, f2_1, descr=arraydescr)
+ guard_true(i2_1) [p0, p1, p2, i0_1, i1_1, i2_1]
+ finish(p0, p1, p2, i0_1, i1_1)
+ """
+ expected = """
+ [p0, p1, p2, i0, i1, i2]
+ i0_1 = int_add(i0, 1)
+ i1_1 = int_add(1, i1)
+ i2_1 = int_add(i2, 1)
+ vec0 = getarrayitem_vector_raw(p0, i0, descr=arraydescr)
+ vec1 = getarrayitem_vector_raw(p1, i1, descr=arraydescr)
+ vec2 = float_vector_add(vec0, vec1)
+ setarrayitem_vector_raw(p2, i2, vec2, descr=arraydescr)
+ guard_true(i2_1) [p0, p1, p2, i0_1, i1_1, i2_1]
+ finish(p0, p1, p2, i0_1, i1_1)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_guard_prevents(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)
+ guard_true(i1) [p0, p1, p2, i1, i0, i2, f1, f2]
+ i0_1 = int_add(i0, 1)
+ i1_1 = int_add(1, i1)
+ i2_1 = int_add(i2, 1)
+ f0_1 = getarrayitem_raw(p0, i0_1, descr=arraydescr)
+ f1_1 = getarrayitem_raw(p1, i1_1, 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, i2_1)
+ """
+ expected = """
+ [p0, p1, p2, i0, i1, 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)
+ guard_true(i1) [p0, p1, p2, i1, i0, i2, f1, f2]
+ i0_1 = int_add(i0, 1)
+ i2_1 = int_add(i2, 1)
+ f0_1 = getarrayitem_raw(p0, i0_1, descr=arraydescr)
+ f1_1 = getarrayitem_raw(p1, 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, 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
@@ -172,13 +172,14 @@
for arr, items in self.full.iteritems():
items[0].emit(self)
self.ops_so_far = []
-
+ self.reset()
+
def optimize_default(self, op):
# list operations that are fine, not that many
if op.opnum in [rop.JUMP, rop.FINISH, rop.LABEL]:
self.emit_vector_ops(op.getarglist())
elif op.is_guard():
- xxx
+ self.emit_vector_ops(op.getarglist() + op.getfailargs())
elif op.is_always_pure():
# in theory no side effect ops, but stuff like malloc
# can go in the way
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit