Author: Richard Plangger <[email protected]>
Branch: vecopt-merge
Changeset: r79007:318a57aaddb8
Date: 2015-08-17 11:18 +0200
http://bitbucket.org/pypy/pypy/changeset/318a57aaddb8/
Log: moved post/pre unpacking from vectorize.py into schedule.py, this
removes unnecessary object allocations for each scheduling step,
makes things more readable
diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py
b/rpython/jit/metainterp/optimizeopt/schedule.py
--- a/rpython/jit/metainterp/optimizeopt/schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/schedule.py
@@ -244,7 +244,7 @@
self.output_type = None
self.costmodel = None
- def as_vector_operation(self, pack, sched_data, oplist):
+ def as_vector_operation(self, pack, sched_data, scheduler, oplist):
self.sched_data = sched_data
self.vecops = oplist
self.costmodel = sched_data.costmodel
@@ -257,7 +257,9 @@
#
if self.must_be_full_but_is_not(pack):
for op in pack.operations:
- self.vecops.append(op.getoperation())
+ operation = op.getoperation()
+ self.sched_data.unpack_from_vector(operation, scheduler)
+ self.vecops.append(operation)
else:
self.pack = pack
self.transform_pack()
@@ -757,15 +759,20 @@
renamer = scheduler.renamer
if candidate.pack:
for node in candidate.pack.operations:
- self.unpack_from_vector(candidate.getoperation(), renamer)
+ renamer.rename(node.getoperation())
scheduler.scheduled(node)
- #renamer.rename(node.getoperation())
self.as_vector_operation(scheduler, candidate.pack)
else:
- self.unpack_from_vector(candidate.getoperation(), renamer)
+ op = candidate.getoperation()
+ renamer.rename(op)
+ self.unpack_from_vector(op, scheduler)
scheduler.scheduled(candidate)
- #renamer.rename(candidate.getoperation())
op = candidate.getoperation()
+ #
+ # prevent some instructions in the resulting trace!
+ if op.getopnum() in (rop.DEBUG_MERGE_POINT,
+ rop.GUARD_EARLY_EXIT):
+ return
scheduler.oplist.append(op)
def as_vector_operation(self, scheduler, pack):
@@ -777,7 +784,7 @@
oplist = scheduler.oplist
position = len(oplist)
op = pack.operations[0].getoperation()
- determine_trans(op).as_vector_operation(pack, self, oplist)
+ determine_trans(op).as_vector_operation(pack, self, scheduler, oplist)
#
# XXX
if pack.is_accumulating():
@@ -786,16 +793,15 @@
for node in pack.operations:
op = node.getoperation()
assert op.result is not None
- preproc_renamer.start_renaming(op.result, box)
+ scheduler.renamer.start_renaming(op.result, box)
- def unpack_from_vector(self, op, renamer):
- renamer.rename(op)
+ def unpack_from_vector(self, op, scheduler):
args = op.getarglist()
# unpack for an immediate use
for i, arg in enumerate(op.getarglist()):
if isinstance(arg, Box):
- argument = self._unpack_from_vector(i, arg, renamer)
+ argument = self._unpack_from_vector(i, arg, scheduler)
if arg is not argument:
op.setarg(i, argument)
if op.result:
@@ -805,11 +811,11 @@
fail_args = op.getfailargs()
for i, arg in enumerate(fail_args):
if arg and isinstance(arg, Box):
- argument = self._unpack_from_vector(i, arg, renamer)
+ argument = self._unpack_from_vector(i, arg, scheduler)
if arg is not argument:
fail_args[i] = argument
- def _unpack_from_vector(self, i, arg, renamer):
+ def _unpack_from_vector(self, i, arg, scheduler):
if arg in self.seen or arg.type == 'V':
return arg
(j, vbox) = self.getvector_of_box(arg)
@@ -818,14 +824,14 @@
return arg
arg_cloned = arg.clonebox()
self.seen[arg_cloned] = None
- renamer.start_renaming(arg, arg_cloned)
+ scheduler.renamer.start_renaming(arg, arg_cloned)
self.setvector_of_box(arg_cloned, j, vbox)
cj = ConstInt(j)
ci = ConstInt(1)
opnum = getunpackopnum(vbox.gettype())
unpack_op = ResOperation(opnum, [vbox, cj, ci], arg_cloned)
self.costmodel.record_vector_unpack(vbox, j, 1)
- self.emit_operation(unpack_op)
+ scheduler.oplist.append(unpack_op)
return arg_cloned
return arg
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
@@ -144,14 +144,6 @@
if not self.costmodel.profitable():
raise NotAProfitableLoop()
- def emit_operation(self, op):
- if op.getopnum() == rop.DEBUG_MERGE_POINT:
- return
- if op.getopnum() == rop.GUARD_EARLY_EXIT:
- return
- self._last_emitted_op = op
- self._newoperations.append(op)
-
def emit_unrolled_operation(self, op):
self._last_emitted_op = op
self._newoperations.append(op)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit