[pypy-commit] pypy backend-vector-ops: always pure operations don't have to reset anything. Add float vector_sub
fijal
noreply at buildbot.pypy.org
Thu Feb 2 13:37:44 CET 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: backend-vector-ops
Changeset: r52028:9d52e03206ff
Date: 2012-02-02 14:37 +0200
http://bitbucket.org/pypy/pypy/changeset/9d52e03206ff/
Log: always pure operations don't have to reset anything. Add float
vector_sub
diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -273,7 +273,8 @@
# ____________________________________________________________
-IGNORED = ['FLOAT_VECTOR_ADD', 'GETARRAYITEM_VECTOR_RAW',
+IGNORED = ['FLOAT_VECTOR_ADD', 'FLOAT_VECTOR_SUB',
+ 'GETARRAYITEM_VECTOR_RAW',
'SETARRAYITEM_VECTOR_RAW', 'ASSERT_ALIGNED']
def _make_execute_list():
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
@@ -4,7 +4,7 @@
class TestVectorize(BaseTestBasic, LLtypeMixin):
enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll:vectorize"
- def test_vectorize_basic(self):
+ def test_basic(self):
ops = """
[p0, p1, p2, i0, i1, i2]
assert_aligned(p0, i0)
@@ -36,7 +36,41 @@
"""
self.optimize_loop(ops, expected)
- def test_vectorize_unfit_trees(self):
+ def test_basic_sub(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_sub(f0, f1)
+ setarrayitem_raw(p2, i2, f2, descr=arraydescr)
+ i0_1 = int_add(i0, 1)
+ i1_1 = int_add(1, i1)
+ i3 = int_sub(i1_1, 2)
+ 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_sub(f0_1, f1_1)
+ setarrayitem_raw(p2, i2_1, f2_1, descr=arraydescr)
+ finish(p0, p1, p2, i0_1, i1_1, i2_1, i3)
+ """
+ expected = """
+ [p0, p1, p2, i0, i1, i2]
+ i0_1 = int_add(i0, 1)
+ i1_1 = int_add(1, i1)
+ i3 = int_sub(i1_1, 2)
+ 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_sub(vec0, vec1)
+ setarrayitem_vector_raw(p2, i2, vec2, descr=arraydescr)
+ finish(p0, p1, p2, i0_1, i1_1, i2_1, i3)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_unfit_trees(self):
ops = """
[p0, p1, p2, i0, i1, i2]
assert_aligned(p0, i0)
@@ -73,3 +107,72 @@
finish(p0, p1, p2, i0_1, i1_1, i2_1)
"""
self.optimize_loop(ops, expected)
+
+ def test_unfit_trees_2(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)
+ setarrayitem_raw(p2, i2_1, f0_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)
+ 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)
+ setarrayitem_raw(p2, i2_1, f0_1, descr=arraydescr)
+ finish(p0, p1, p2, i0_1, i1_1, i2_1)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_unfit_trees_3(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_sub(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)
+ 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_1, descr=arraydescr)
+ f2_1 = float_sub(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
@@ -5,7 +5,8 @@
from pypy.jit.metainterp.history import BoxVector
VECTOR_SIZE = 2
-VEC_MAP = {rop.FLOAT_ADD: rop.FLOAT_VECTOR_ADD}
+VEC_MAP = {rop.FLOAT_ADD: rop.FLOAT_VECTOR_ADD,
+ rop.FLOAT_SUB: rop.FLOAT_VECTOR_SUB}
class BaseTrack(object):
pass
@@ -125,7 +126,7 @@
return
self.tracked_indexes[self.getvalue(op.result)] = self.tracked_indexes[index].advance()
- def optimize_FLOAT_ADD(self, op):
+ def _optimize_binop(self, op):
left = self.getvalue(op.getarg(0))
right = self.getvalue(op.getarg(1))
if left not in self.track or right not in self.track:
@@ -136,6 +137,9 @@
rt = self.track[right]
self.track[self.getvalue(op.result)] = BinOp(lt, rt, op)
+ optimize_FLOAT_ADD = _optimize_binop
+ optimize_FLOAT_SUB = _optimize_binop
+
def optimize_SETARRAYITEM_RAW(self, op):
index = self.getvalue(op.getarg(1))
val = self.getvalue(op.getarg(2))
@@ -175,6 +179,10 @@
self.emit_vector_ops(op.getarglist())
elif op.is_guard():
xxx
+ elif op.is_always_pure():
+ # in theory no side effect ops, but stuff like malloc
+ # can go in the way
+ pass
else:
self.reset()
self.emit_operation(op)
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -417,6 +417,7 @@
'FLOAT_NEG/1',
'FLOAT_ABS/1',
'FLOAT_VECTOR_ADD/2',
+ 'FLOAT_VECTOR_SUB/2',
'CAST_FLOAT_TO_INT/1', # don't use for unsigned ints; we would
'CAST_INT_TO_FLOAT/1', # need some messy code in the backend
'CAST_FLOAT_TO_SINGLEFLOAT/1',
More information about the pypy-commit
mailing list