[pypy-commit] pypy vecopt2: introduced vec_getarrayitem_raw which was previously handled by vector raw load (was not correct)
plan_rich
noreply at buildbot.pypy.org
Tue May 5 09:46:10 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt2
Changeset: r77117:771fe82d7b07
Date: 2015-04-16 15:27 +0200
http://bitbucket.org/pypy/pypy/changeset/771fe82d7b07/
Log: introduced vec_getarrayitem_raw which was previously handled by
vector raw load (was not correct)
diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -684,6 +684,12 @@
def bh_vec_int_signext(self, vx, ext, count):
return [heaptracker.int_signext(_vx, ext) for _vx in vx]
+ def bh_vec_getarrayitem_raw(self, struct, offset, count, descr):
+ values = []
+ for i in range(count):
+ val = self.bh_getarrayitem_raw(struct, offset + i, descr)
+ values.append(val)
+ return values
def bh_vec_raw_load(self, struct, offset, count, descr):
values = []
stride = descr.get_item_size_in_bytes()
@@ -696,6 +702,9 @@
stride = descr.get_item_size_in_bytes()
for i in range(count):
self.bh_raw_store(struct, offset + i*stride, newvalues[i], descr)
+ def bh_vec_setarrayitem_raw(self, struct, offset, newvalues, count, descr):
+ for i in range(count):
+ self.bh_setarrayitem_raw(struct, offset + i, newvalues[i], descr)
def store_fail_descr(self, deadframe, descr):
diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1477,13 +1477,14 @@
assert kind == 'v'
return lltype.nullptr(rclass.OBJECTPTR.TO)
- def _prepare_resume_from_failure(self, opnum, deadframe):
+ def _prepare_resume_from_failure(self, opnum, deadframe, resumedescr):
from rpython.jit.metainterp.resoperation import rop
#
if opnum == rop.GUARD_FUTURE_CONDITION:
pass
elif opnum == rop.GUARD_NO_EARLY_EXIT:
- self.position = 0
+ self.position = resumedescr.rd_frame_info_list.pc
+ pass
elif opnum == rop.GUARD_TRUE:
# Produced directly by some goto_if_not_xxx() opcode that did not
# jump, but which must now jump. The pc is just after the opcode.
@@ -1656,7 +1657,7 @@
all_virtuals)
current_exc = blackholeinterp._prepare_resume_from_failure(
- resumedescr.guard_opnum, deadframe)
+ resumedescr.guard_opnum, deadframe, resumedescr)
_run_forever(blackholeinterp, current_exc)
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -338,12 +338,14 @@
rop.CALL_MALLOC_NURSERY_VARSIZE,
rop.CALL_MALLOC_NURSERY_VARSIZE_FRAME,
rop.LABEL,
+ rop.VEC_RAW_LOAD,
+ rop.VEC_RAW_STORE,
+ rop.VEC_GETARRAYITEM_RAW,
+ rop.VEC_SETARRAYITEM_RAW,
): # list of opcodes never executed by pyjitpl
continue
- # XXX this is temporary! after the algorithm works adjust the
- # black hole interpreter!
- if rop._VEC_ARITHMETIC_FIRST <= value <= rop._VEC_ARITHMETIC_LAST or \
- value == rop.VEC_RAW_LOAD or value == rop.VEC_RAW_STORE:
+ # trace will generate such an op
+ if rop._VEC_ARITHMETIC_FIRST <= value <= rop._VEC_ARITHMETIC_LAST:
continue
raise AssertionError("missing %r" % (key,))
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
@@ -556,7 +556,7 @@
def test_packset_init_simple(self):
ops = """
[p0,i0]
- i3 = getarrayitem_gc(p0, i0, descr=chararraydescr)
+ i3 = getarrayitem_raw(p0, i0, descr=chararraydescr)
i1 = int_add(i0, 1)
i2 = int_le(i1, 16)
guard_true(i2) [p0, i0]
@@ -601,7 +601,7 @@
i1 = int_add(i0, 1)
i2 = int_le(i1, 16)
guard_true(i2) [p0, i0]
- i3 = getarrayitem_gc(p0, i1, descr=chararraydescr)
+ i3 = getarrayitem_raw(p0, i1, descr=chararraydescr)
jump(p0,i1)
"""
loop = self.parse_loop(ops)
@@ -631,12 +631,12 @@
def test_isomorphic_operations(self):
ops_src = """
[p1,p0,i0]
- i3 = getarrayitem_gc(p0, i0, descr=chararraydescr)
+ i3 = getarrayitem_raw(p0, i0, descr=chararraydescr)
i1 = int_add(i0, 1)
i2 = int_le(i1, 16)
- i4 = getarrayitem_gc(p0, i1, descr=chararraydescr)
- i5 = getarrayitem_gc(p1, i1, descr=floatarraydescr)
- i6 = getarrayitem_gc(p0, i1, descr=floatarraydescr)
+ i4 = getarrayitem_raw(p0, i1, descr=chararraydescr)
+ i5 = getarrayitem_raw(p1, i1, descr=floatarraydescr)
+ i6 = getarrayitem_raw(p0, i1, descr=floatarraydescr)
guard_true(i2) [p0, i0]
jump(p1,p0,i1)
"""
@@ -657,7 +657,7 @@
i1 = int_add(i0, 1)
i2 = int_le(i1, 16)
guard_true(i2) [p0, i0]
- i3 = getarrayitem_gc(p0, i1, descr=chararraydescr)
+ i3 = getarrayitem_raw(p0, i1, descr=chararraydescr)
i4 = int_add(i3, 1)
jump(p0,i1)
"""
@@ -676,9 +676,9 @@
i1 = int_add(i0, 1)
i2 = int_le(i1, 16)
guard_true(i2) [p0, i0]
- i3 = getarrayitem_gc(p0, i1, descr=chararraydescr)
+ i3 = getarrayitem_raw(p0, i1, descr=chararraydescr)
i4 = int_mul(i3, 2)
- setarrayitem_gc(p0, i1, i4, descr=chararraydescr)
+ setarrayitem_raw(p0, i1, i4, descr=chararraydescr)
jump(p0,i1)
"""
loop = self.parse_loop(ops)
@@ -695,7 +695,7 @@
def test_packset_combine_simple(self,descr):
ops = """
[p0,i0]
- i3 = getarrayitem_gc(p0, i0, descr={descr}arraydescr)
+ i3 = getarrayitem_raw(p0, i0, descr={descr}arraydescr)
i1 = int_add(i0,1)
jump(p0,i1)
""".format(descr=descr)
@@ -736,9 +736,9 @@
def test_packset_combine_2_loads_one_redundant(self):
ops = """
[p0,i0]
- i3 = getarrayitem_gc(p0, i0, descr=floatarraydescr)
+ i3 = getarrayitem_raw(p0, i0, descr=floatarraydescr)
i1 = int_add(i0,1)
- i4 = getarrayitem_gc(p0, i1, descr=floatarraydescr)
+ i4 = getarrayitem_raw(p0, i1, descr=floatarraydescr)
jump(p0,i1)
"""
pytest.skip("loop unrolling must apply redundant loop unrolling")
@@ -762,7 +762,7 @@
ops = """
[p0,i0]
- i3 = getarrayitem_gc(p0, i0, descr=floatarraydescr)
+ i3 = getarrayitem_raw(p0, i0, descr=floatarraydescr)
jump(p0,i3)
"""
try:
@@ -826,10 +826,10 @@
guard_no_early_exit() []
i10 = int_le(i0, 128) # 1, 8, 15, 22
guard_true(i10) [p0,p1,p2,i0] # 2, 9, 16, 23
- i2 = getarrayitem_gc(p0, i0, descr={descr}arraydescr) # 3, 10, 17, 24
- i3 = getarrayitem_gc(p1, i0, descr={descr}arraydescr) # 4, 11, 18, 25
+ i2 = getarrayitem_raw(p0, i0, descr={descr}arraydescr) # 3, 10, 17, 24
+ i3 = getarrayitem_raw(p1, i0, descr={descr}arraydescr) # 4, 11, 18, 25
i4 = {op}(i2,i3) # 5, 12, 19, 26
- setarrayitem_gc(p2, i0, i4, descr={descr}arraydescr) # 6, 13, 20, 27
+ setarrayitem_raw(p2, i0, i4, descr={descr}arraydescr) # 6, 13, 20, 27
i1 = int_add(i0, {stride}) # 7, 14, 21, 28
jump(p0,p1,p2,i1) # 29
""".format(op=op,descr=descr,stride=1) # stride getarray is always 1
@@ -842,10 +842,10 @@
guard_true(i11) []
i12 = int_add(i1, {stride})
guard_no_early_exit() []
- v1 = vec_raw_load(p0, i0, 2, descr={descr}arraydescr)
- v2 = vec_raw_load(p1, i0, 2, descr={descr}arraydescr)
+ v1 = vec_getarrayitem_raw(p0, i0, 2, descr={descr}arraydescr)
+ v2 = vec_getarrayitem_raw(p1, i0, 2, descr={descr}arraydescr)
v3 = {op}(v1,v2,2)
- vec_raw_store(p2, i0, v3, 2, descr={descr}arraydescr)
+ vec_setarrayitem_raw(p2, i0, v3, 2, descr={descr}arraydescr)
jump(p0,p1,p2,i12)
""".format(op='vec_'+op,descr=descr,stride=1)
loop = self.parse_loop(ops)
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
@@ -497,9 +497,13 @@
def _vectorize_VEC_RAW_LOAD(self, vop):
self.vector_result(vop)
+ def _vectorize_VEC_GETARRAYITEM_RAW(self, vop):
+ self.vector_result(vop)
def _vectorize_VEC_RAW_STORE(self, vop):
self.vector_arg(vop, 2)
+ def _vectorize_VEC_SETARRAYITEM_RAW(self, vop):
+ self.vector_arg(vop, 2)
VecScheduleData._inspect_operation = \
make_dispatcher_method(VecScheduleData, '_vectorize_')
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -507,6 +507,7 @@
'GETARRAYITEM_GC/2d',
'GETARRAYITEM_RAW/2d',
+ 'VEC_GETARRAYITEM_RAW/3d',
'RAW_LOAD/2d',
'VEC_RAW_LOAD/3d',
'GETINTERIORFIELD_GC/2d',
@@ -530,6 +531,7 @@
'INCREMENT_DEBUG_COUNTER/1',
'SETARRAYITEM_GC/3d',
'SETARRAYITEM_RAW/3d',
+ 'VEC_SETARRAYITEM_RAW/4d',
'RAW_STORE/3d',
'VEC_RAW_STORE/4d',
'SETINTERIORFIELD_GC/3d',
@@ -705,12 +707,10 @@
}
_opvector = {
rop.RAW_LOAD: rop.VEC_RAW_LOAD,
- rop.GETARRAYITEM_RAW: rop.VEC_RAW_LOAD,
- rop.GETARRAYITEM_GC: rop.VEC_RAW_LOAD,
+ rop.GETARRAYITEM_RAW: rop.VEC_GETARRAYITEM_RAW,
rop.RAW_STORE: rop.VEC_RAW_STORE,
- rop.SETARRAYITEM_RAW: rop.VEC_RAW_STORE,
- rop.SETARRAYITEM_GC: rop.VEC_RAW_STORE,
+ rop.SETARRAYITEM_RAW: rop.VEC_SETARRAYITEM_RAW,
rop.INT_ADD: rop.VEC_INT_ADD,
rop.INT_SUB: rop.VEC_INT_SUB,
diff --git a/rpython/jit/metainterp/test/test_vectorize.py b/rpython/jit/metainterp/test/test_vectorize.py
--- a/rpython/jit/metainterp/test/test_vectorize.py
+++ b/rpython/jit/metainterp/test/test_vectorize.py
@@ -79,7 +79,7 @@
assert res == 42
self.check_trace_count(1)
- @py.test.mark.parametrize('i',[8])
+ @py.test.mark.parametrize('i',[1,2,3,8,17,128,500])
def test_vectorize_array_get_set(self,i):
myjitdriver = JitDriver(greens = [],
reds = ['i','d','va','vb','vc'],
@@ -112,7 +112,8 @@
return res
res = self.meta_interp(f, [i])
assert res == f(i)
- self.check_trace_count(1)
+ if i > 4:
+ self.check_trace_count(1)
class TestLLtype(VectorizeTest, LLJitMixin):
pass
More information about the pypy-commit
mailing list