[pypy-commit] pypy vecopt: prepending invariant operations before the label
plan_rich
noreply at buildbot.pypy.org
Tue Jun 2 15:48:26 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77767:9a42391307c6
Date: 2015-06-02 15:48 +0200
http://bitbucket.org/pypy/pypy/changeset/9a42391307c6/
Log: prepending invariant operations before the label moved inlined ops
before header in the tests (vectorize)
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
@@ -30,12 +30,18 @@
jitdriver_sd = FakeJitDriverStaticData()
- def parse_loop(self, ops):
+ def parse_loop(self, ops, add_label=True):
loop = self.parse(ops, postprocess=self.postprocess)
token = JitCellToken()
- loop.operations = \
- [ResOperation(rop.LABEL, loop.inputargs, None, descr=TargetToken(token))] + \
- loop.operations
+ pre = []
+ tt = TargetToken(token)
+ if add_label:
+ pre = [ResOperation(rop.LABEL, loop.inputargs, None, descr=tt)]
+ else:
+ for i,op in enumerate(loop.operations):
+ if op.getopnum() == rop.LABEL:
+ op.setdescr(tt)
+ loop.operations = pre + loop.operations
if loop.operations[-1].getopnum() == rop.JUMP:
loop.operations[-1].setdescr(token)
return loop
@@ -988,6 +994,8 @@
"""
opt="""
[p0,i0]
+ v3 = vec_int_expand(42)
+ label(p0,i0,v3)
guard_early_exit() [p0,i0]
i20 = int_add(i0, 1)
i30 = int_lt(i20, 10)
@@ -997,12 +1005,11 @@
i4 = int_add(i0, 2)
i5 = int_lt(i2, 10)
v1 = vec_getarrayitem_raw(p0, i0, 2, descr=floatarraydescr)
- v3 = vec_int_expand(42)
v2 = vec_int_mul(v1, v3)
- jump(p0,i2)
+ jump(p0,i2,v3)
"""
vopt = self.vectorize(self.parse_loop(ops),1)
- self.assert_equal(vopt.loop, self.parse_loop(opt))
+ self.assert_equal(vopt.loop, self.parse_loop(opt,add_label=False))
def test_variable_expansion(self):
ops = """
@@ -1017,6 +1024,8 @@
"""
opt="""
[p0,i0,f3]
+ v3 = vec_float_expand(f3)
+ label(p0,i0,f3,v3)
guard_early_exit() [p0,i0]
i20 = int_add(i0, 1)
i30 = int_lt(i20, 10)
@@ -1026,12 +1035,11 @@
i4 = int_add(i0, 2)
i5 = int_lt(i2, 10)
v1 = vec_getarrayitem_raw(p0, i0, 2, descr=floatarraydescr)
- v3 = vec_float_expand(f3)
v2 = vec_int_mul(v1, v3)
- jump(p0,i2,f3)
+ jump(p0,i2,f3,v3)
"""
vopt = self.vectorize(self.parse_loop(ops),1)
- self.assert_equal(vopt.loop, self.parse_loop(opt))
+ self.assert_equal(vopt.loop, self.parse_loop(opt, add_label=False))
def test_element_f45_in_guard_failargs(self):
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
@@ -372,7 +372,8 @@
if not we_are_translated():
for node in self.dependency_graph.nodes:
assert node.emitted
- self.loop.operations = self._newoperations[:]
+ self.loop.operations = \
+ sched_data.prepend_invariant_operations(self._newoperations)
self.clear_newoperations()
def unpack_from_vector(self, op, sched_data, renamer):
@@ -1261,6 +1262,26 @@
def setvector_of_box(self, box, off, vector):
self.box_to_vbox[box] = (off, vector)
+ def prepend_invariant_operations(self, oplist):
+ if len(self.invariant_oplist) > 0:
+ label = oplist[0]
+ assert label.getopnum() == rop.LABEL
+ jump = oplist[-1]
+ assert jump.getopnum() == rop.JUMP
+
+ label_args = label.getarglist()
+ jump_args = jump.getarglist()
+ for var in self.invariant_vector_vars:
+ label_args.append(var)
+ jump_args.append(var)
+
+ oplist[0] = label.copy_and_change(label.getopnum(), label_args, None, label.getdescr())
+ oplist[-1] = jump.copy_and_change(jump.getopnum(), jump_args, None, jump.getdescr())
+
+ return self.invariant_oplist + oplist
+
+ return oplist
+
def isomorphic(l_op, r_op):
""" Subject of definition """
if l_op.getopnum() == r_op.getopnum():
More information about the pypy-commit
mailing list