Author: Richard Plangger <r...@pasra.at> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit