Author: Richard Plangger <[email protected]>
Branch: vecopt2
Changeset: r77076:b5bd7163629b
Date: 2015-03-12 17:32 +0100
http://bitbucket.org/pypy/pypy/changeset/b5bd7163629b/
Log: added some more test cases. int_sub/int_mul is not supported to
calculate the memory ref positions
diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py
b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -1,4 +1,3 @@
-
from rpython.jit.metainterp.resoperation import rop
class Dependency(object):
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
@@ -91,6 +91,11 @@
assert not m1.is_adjacent_to(m2)
assert not m2.is_adjacent_to(m1)
+ def debug_print_operations(self, loop):
+ print('--- loop instr numbered ---')
+ for i,op in enumerate(loop.operations):
+ print(i,op)
+
class BaseTestDependencyGraph(DepTestHelper):
def test_dependency_1(self):
ops = """
@@ -267,9 +272,6 @@
jump(p0,i1)
"""
vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),2)
- print()
- for i,op in enumerate(vopt.optimizer.loop.operations):
- print(i,op)
vopt.build_dependency_graph()
self.assert_no_edge(vopt.dependency_graph, [(i,i) for i in range(6)])
self.assert_def_use(vopt.dependency_graph, [(0,1),(2,3),(4,5)])
@@ -288,6 +290,121 @@
assert mref1.is_adjacent_to(mref3)
assert mref3.is_adjacent_to(mref1)
+ def test_array_memory_ref_1(self):
+ ops = """
+ [p0,i0]
+ i3 = raw_load(p0,i0,descr=chararraydescr)
+ jump(p0,i0)
+ """
+ vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+ vopt.build_dependency_graph()
+ vopt.find_adjacent_memory_refs()
+ mref1 = vopt.vec_info.memory_refs[1]
+ assert isinstance(mref1, MemoryRef)
+ assert mref1.factor_c == 1
+ assert mref1.factor_d == 0
+
+ def test_array_memory_ref_2(self):
+ ops = """
+ [p0,i0]
+ i1 = int_add(i0,1)
+ i3 = raw_load(p0,i1,descr=chararraydescr)
+ jump(p0,i1)
+ """
+ vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+ vopt.build_dependency_graph()
+ vopt.find_adjacent_memory_refs()
+ mref1 = vopt.vec_info.memory_refs[2]
+ assert isinstance(mref1, MemoryRef)
+ assert mref1.factor_c == 1
+ assert mref1.factor_d == 1
+
+ def test_array_memory_ref_sub_index(self):
+ ops = """
+ [p0,i0]
+ i1 = int_sub(i0,1)
+ i3 = raw_load(p0,i1,descr=chararraydescr)
+ jump(p0,i1)
+ """
+ vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+ vopt.build_dependency_graph()
+ vopt.find_adjacent_memory_refs()
+ mref1 = vopt.vec_info.memory_refs[2]
+ assert isinstance(mref1, MemoryRef)
+ assert mref1.factor_c == 1
+ assert mref1.factor_d == -1
+
+ def test_array_memory_ref_add_mul_index(self):
+ ops = """
+ [p0,i0]
+ i1 = int_add(i0,1)
+ i2 = int_mul(i1,3)
+ i3 = raw_load(p0,i2,descr=chararraydescr)
+ jump(p0,i1)
+ """
+ vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+ vopt.build_dependency_graph()
+ vopt.find_adjacent_memory_refs()
+ mref1 = vopt.vec_info.memory_refs[3]
+ assert isinstance(mref1, MemoryRef)
+ assert mref1.factor_c == 3
+ assert mref1.factor_d == 3
+
+ def test_array_memory_ref_add_mul_index_interleaved(self):
+ ops = """
+ [p0,i0]
+ i1 = int_add(i0,1)
+ i2 = int_mul(i1,3)
+ i3 = int_add(i2,5)
+ i4 = int_mul(i3,6)
+ i5 = raw_load(p0,i4,descr=chararraydescr)
+ jump(p0,i4)
+ """
+ vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+ vopt.build_dependency_graph()
+ vopt.find_adjacent_memory_refs()
+ mref1 = vopt.vec_info.memory_refs[5]
+ assert isinstance(mref1, MemoryRef)
+ assert mref1.factor_c == 18
+ assert mref1.factor_d == 48
+
+ ops = """
+ [p0,i0]
+ i1 = int_add(i0,1)
+ i2 = int_mul(i1,3)
+ i3 = int_add(i2,5)
+ i4 = int_mul(i3,6)
+ i5 = int_add(i4,30)
+ i6 = int_mul(i5,57)
+ i7 = raw_load(p0,i6,descr=chararraydescr)
+ jump(p0,i6)
+ """
+ vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+ vopt.build_dependency_graph()
+ vopt.find_adjacent_memory_refs()
+ mref1 = vopt.vec_info.memory_refs[7]
+ assert isinstance(mref1, MemoryRef)
+ assert mref1.factor_c == 1026
+ assert mref1.factor_d == 57*(30) + 57*6*(5) + 57*6*3*(1)
+
+ def test_array_memory_ref_sub_mul_index_interleaved(self):
+ ops = """
+ [p0,i0]
+ i1 = int_add(i0,1)
+ i2 = int_mul(i1,3)
+ i3 = int_sub(i2,3)
+ i4 = int_mul(i3,2)
+ i5 = raw_load(p0,i4,descr=chararraydescr)
+ jump(p0,i4)
+ """
+ vopt = self.vec_optimizer_unrolled(self.parse_loop(ops),1)
+ vopt.build_dependency_graph()
+ vopt.find_adjacent_memory_refs()
+ mref1 = vopt.vec_info.memory_refs[5]
+ assert isinstance(mref1, MemoryRef)
+ assert mref1.factor_c == 6
+ assert mref1.factor_d == 0
+
def test_array_memory_ref_not_adjacent_1(self):
ops = """
[p0,i0,i4]
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
@@ -161,17 +161,12 @@
operations = loop.operations
integral_mod = IntegralMod(self.optimizer)
for opidx,memref in self.vec_info.memory_refs.items():
- print("trying ref", memref, "op idx", opidx)
+ integral_mod.reset()
while True:
- op = operations[opidx]
- if op.getopnum() == rop.LABEL:
- break
- print("checking op at idx", opidx)
for dep in self.dependency_graph.instr_dependencies(opidx):
# this is a use, thus if dep is not a defintion
# it points back to the definition
- print(memref.origin, " == ", dep.defined_arg)
if memref.origin == dep.defined_arg and not
dep.is_definition:
# if is_definition is false the params is swapped
# idx_to attributes points to definer
@@ -183,9 +178,10 @@
raise RuntimeError("a variable usage does not have a " +
" definition. Cannot continue!")
- print("reset")
- integral_mod.reset()
- print("inspect ", def_op)
+ op = operations[opidx]
+ if op.getopnum() == rop.LABEL:
+ break
+
integral_mod.inspect_operation(def_op)
if integral_mod.is_const_mod:
integral_mod.update_memory_ref(memref)
@@ -221,8 +217,23 @@
self.factor_d = 0
self.used_box = None
+ def operation_INT_SUB(self, op):
+ box_a0 = op.getarg(0)
+ box_a1 = op.getarg(1)
+ a0 = self.optimizer.getvalue(box_a0)
+ a1 = self.optimizer.getvalue(box_a1)
+ if a0.is_constant() and a1.is_constant():
+ raise NotImplementedError()
+ elif a0.is_constant():
+ self.is_const_mod = True
+ self.factor_d -= box_a0.getint() * self.factor_c
+ self.used_box = box_a1
+ elif a1.is_constant():
+ self.is_const_mod = True
+ self.factor_d -= box_a1.getint() * self.factor_c
+ self.used_box = box_a0
+
def operation_INT_ADD(self, op):
- print("int_add")
box_a0 = op.getarg(0)
box_a1 = op.getarg(1)
a0 = self.optimizer.getvalue(box_a0)
@@ -230,23 +241,44 @@
if a0.is_constant() and a1.is_constant():
# this means that the overall array offset is not
# added to a variable, but is constant
- self.is_const_mod = True
- self.factor_d += box_a1.getint() + box_a0.getint()
- self.used_box = None
+ raise NotImplementedError()
elif a0.is_constant():
self.is_const_mod = True
- self.factor_d += box_a0.getint()
+ self.factor_d += box_a0.getint() * self.factor_c
self.used_box = box_a1
elif a1.is_constant():
self.is_const_mod = True
- self.factor_d += box_a1.getint()
+ print('add', box_a1.getint(), self.factor_c)
+ self.factor_d += box_a1.getint() * self.factor_c
+ self.used_box = box_a0
+
+ def operation_INT_MUL(self, op):
+ """ Whenever a multiplication occurs this only alters the
+ factor_c. When later a plus occurs, factor_c multiplies the added
+ operand. """
+ box_a0 = op.getarg(0)
+ box_a1 = op.getarg(1)
+ a0 = self.optimizer.getvalue(box_a0)
+ a1 = self.optimizer.getvalue(box_a1)
+ if a0.is_constant() and a1.is_constant():
+ # this means that the overall array offset is not
+ # added to a variable, but is constant
+ raise NotImplementedError()
+ elif a0.is_constant():
+ self.is_const_mod = True
+ self.factor_c *= box_a0.getint()
+ self.used_box = box_a1
+ elif a1.is_constant():
+ self.is_const_mod = True
+ self.factor_c *= box_a1.getint()
self.used_box = box_a0
def update_memory_ref(self, memref):
+ #print("updating memory ref pre: ", memref)
memref.factor_d = self.factor_d
memref.factor_c = self.factor_c
memref.origin = self.used_box
- print("update", memref.factor_d, memref.factor_c, memref.origin)
+ #print("updating memory ref post: ", memref)
def default_operation(self, operation):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit