Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r77760:692b8f945d3a
Date: 2015-06-02 15:19 +0200
http://bitbucket.org/pypy/pypy/changeset/692b8f945d3a/
Log: expanding variables/constants are not inlined before the instruction
but gathered in another list to be prepended to the label operation
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
@@ -39,7 +39,7 @@
def pack(self, loop, l, r):
return [Node(op,1+l+i) for i,op in enumerate(loop.operations[1+l:1+r])]
- def schedule(self, loop_orig, packs, vec_reg_size=16):
+ def schedule(self, loop_orig, packs, vec_reg_size=16,
prepend_invariant=False):
loop = get_model(False).ExtendedTreeLoop("loop")
loop.original_jitcell_token = loop_orig.original_jitcell_token
loop.inputargs = loop_orig.inputargs
@@ -53,6 +53,8 @@
for op in vsd.as_vector_operation(Pack(pack)):
ops.append(op)
loop.operations = ops
+ if prepend_invariant:
+ loop.operations = vsd.invariant_oplist + ops
return loop
def assert_operations_match(self, loop_a, loop_b):
@@ -100,7 +102,7 @@
i11 = int_add(i1, 73)
""")
pack1 = self.pack(loop1, 0, 2)
- loop2 = self.schedule(loop1, [pack1])
+ loop2 = self.schedule(loop1, [pack1], prepend_invariant=True)
loop3 = self.parse("""
v1[i64#2] = vec_box(2)
v2[i64#2] = vec_int_pack(v1[i64#2], i0, 0, 1)
@@ -115,7 +117,7 @@
f11 = float_add(f1, 73.0)
""")
pack1 = self.pack(loop1, 0, 2)
- loop2 = self.schedule(loop1, [pack1])
+ loop2 = self.schedule(loop1, [pack1], prepend_invariant=True)
loop3 = self.parse("""
v1[f64#2] = vec_box(2)
v2[f64#2] = vec_float_pack(v1[f64#2], f0, 0, 1)
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
@@ -941,8 +941,7 @@
box_pos, vbox = self.sched_data.getvector_of_box(arg)
if not vbox:
# constant/variable expand this box
- vbox = self.input_type.new_vector_box(len(ops))
- vbox = self.expand_box_to_vector_box(vbox, ops, arg, argidx)
+ vbox = self.expand(ops, arg, argidx)
box_pos = 0
# use the input as an indicator for the pack type
@@ -1049,39 +1048,43 @@
assert index.value + count.value <= result.item_count
assert result.item_count > arg0.item_count
- def expand_box_to_vector_box(self, vbox, nodes, arg, argidx):
- all_same_box = True
+ def expand(self, nodes, arg, argidx):
+ vbox = self.input_type.new_vector_box(len(nodes))
+ box_type = arg.type
+ invariant_ops = self.sched_data.invariant_oplist
+ invariant_vars = self.sched_data.invariant_vector_vars
+ if isinstance(arg, BoxVector):
+ box_type = arg.item_type
+
for i, node in enumerate(nodes):
op = node.getoperation()
if not arg.same_box(op.getarg(argidx)):
- all_same_box = False
break
i += 1
+ else:
+ expand_opnum = rop.VEC_FLOAT_EXPAND
+ if box_type == INT:
+ expand_opnum = rop.VEC_INT_EXPAND
+ op = ResOperation(expand_opnum, [arg], vbox)
+ invariant_ops.append(op)
+ invariant_vars.append(vbox)
+ return vbox
- box_type = arg.type
- if isinstance(arg, BoxVector):
- box_type = arg.item_type
- expand_opnum = rop.VEC_FLOAT_EXPAND
- if box_type == INT:
- expand_opnum = rop.VEC_INT_EXPAND
-
- if all_same_box:
- expand_op = ResOperation(expand_opnum, [arg], vbox)
- self.preamble_ops.append(expand_op)
- else:
- resop = ResOperation(rop.VEC_BOX, [ConstInt(len(nodes))], vbox)
- self.preamble_ops.append(resop)
- opnum = rop.VEC_FLOAT_PACK
- if arg.type == INT:
- opnum = rop.VEC_INT_PACK
- for i,node in enumerate(nodes):
- op = node.getoperation()
- arg = op.getarg(argidx)
- new_box = vbox.clonebox()
- resop = ResOperation(opnum,
- [vbox,arg,ConstInt(i),ConstInt(1)],
new_box)
- vbox = new_box
- self.preamble_ops.append(resop)
+ op = ResOperation(rop.VEC_BOX, [ConstInt(len(nodes))], vbox)
+ invariant_ops.append(op)
+ opnum = rop.VEC_FLOAT_PACK
+ if arg.type == INT:
+ opnum = rop.VEC_INT_PACK
+ for i,node in enumerate(nodes):
+ op = node.getoperation()
+ arg = op.getarg(argidx)
+ new_box = vbox.clonebox()
+ ci = ConstInt(i)
+ c1 = ConstInt(1)
+ op = ResOperation(opnum, [vbox,arg,ci,c1], new_box)
+ vbox = new_box
+ invariant_ops.append(op)
+ invariant_vars.append(vbox)
return vbox
class OpToVectorOpConv(OpToVectorOp):
@@ -1232,9 +1235,9 @@
class VecScheduleData(SchedulerData):
def __init__(self, vec_reg_size):
self.box_to_vbox = {}
- self.preamble_ops = None
- self.expansion_byte_count = -1
self.vec_reg_size = vec_reg_size
+ self.invariant_oplist = []
+ self.invariant_vector_vars = []
def as_vector_operation(self, pack):
op_count = len(pack.operations)
@@ -1247,7 +1250,7 @@
op0 = pack.operations[0].getoperation()
tovector = ROP_ARG_RES_VECTOR.get(op0.vector, None)
if tovector is None:
- raise NotImplementedError("missing vecop for '" + op0.getopname()
+ "'")
+ raise NotImplementedError("missing vecop for '%s'" %
(op0.getopname(),))
oplist = []
tovector.as_vector_operation(pack, self, oplist)
return oplist
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit