Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78507:bc0821d1703e
Date: 2015-07-09 10:48 +0200
http://bitbucket.org/pypy/pypy/changeset/bc0821d1703e/
Log: reviewed unrolling, and guard relaxation
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
@@ -103,7 +103,6 @@
self.packset = None
self.unroll_count = 0
self.smallest_type_bytes = 0
- self.early_exit_idx = -1
self.sched_data = None
self.cpu = metainterp_sd.cpu
self.costmodel = X86_CostModel(cost_threshold,
self.cpu.vector_register_size)
@@ -166,8 +165,8 @@
label_op = loop.operations[0].clone()
assert label_op.getopnum() == rop.LABEL
jump_op = loop.operations[op_count-1]
+ assert jump_op.getopnum() in (rop.LABEL, rop.JUMP)
# use the target token of the label
- assert jump_op.getopnum() in (rop.LABEL, rop.JUMP)
target_token = label_op.getdescr()
if not we_are_translated():
target_token.assumed_classes = {}
@@ -181,17 +180,14 @@
self.emit_unrolled_operation(label_op)
renamer = Renamer()
- oi = 0
pure = True
operations = []
ee_pos = -1
- ee_guard = None
for i in range(1,op_count-1):
op = loop.operations[i].clone()
opnum = op.getopnum()
if opnum == rop.GUARD_EARLY_EXIT:
ee_pos = i
- ee_guard = op
if op.is_guard():
assert isinstance(op, GuardResOp)
@@ -208,7 +204,7 @@
orig_jump_args = jump_op.getarglist()[:]
# it is assumed that #label_args == #jump_args
label_arg_count = len(orig_jump_args)
- for i in range(0, unroll_count):
+ for u in range(unroll_count):
# fill the map with the renaming boxes. keys are boxes from the
label
for i in range(label_arg_count):
la = label_op.getarg(i)
@@ -217,7 +213,7 @@
if la != ja:
renamer.start_renaming(la, ja)
#
- for oi, op in enumerate(operations):
+ for i, op in enumerate(operations):
if op.getopnum() in prohibit_opnums:
continue # do not unroll this operation twice
copied_op = op.clone()
@@ -229,33 +225,30 @@
copied_op.result = new_assigned_box
#
args = copied_op.getarglist()
- for i, arg in enumerate(args):
+ for a, arg in enumerate(args):
value = renamer.rename_box(arg)
- copied_op.setarg(i, value)
+ copied_op.setarg(a, value)
# not only the arguments, but also the fail args need
# to be adjusted. rd_snapshot stores the live variables
# that are needed to resume.
if copied_op.is_guard():
assert isinstance(copied_op, GuardResOp)
target_guard = copied_op
- # do not overwrite resume at loop header
- if target_guard.getdescr().guard_opnum !=
rop.GUARD_EARLY_EXIT:
+ descr = target_guard.getdescr()
+ exits_early = descr.guard_opnum == rop.GUARD_EARLY_EXIT
+ # early exits already have the right failargs set
+ if not exits_early:
descr = invent_fail_descr_for_op(copied_op.getopnum(),
self)
olddescr = copied_op.getdescr()
if olddescr:
descr.copy_all_attributes_from(olddescr)
copied_op.setdescr(descr)
-
- if oi < ee_pos:
- # do not clone the arguments, it is already an early
exit
- pass
- else:
+ # copy failargs/snapshot
copied_op.rd_snapshot = \
renamer.rename_rd_snapshot(copied_op.rd_snapshot,
clone=True)
renamed_failargs = \
- renamer.rename_failargs(copied_op,
- clone=True)
+ renamer.rename_failargs(copied_op, clone=True)
copied_op.setfailargs(renamed_failargs)
#
self.emit_unrolled_operation(copied_op)
@@ -267,14 +260,12 @@
for i, arg in enumerate(args):
value = renamer.rename_box(arg)
jump_op.setarg(i, value)
-
+ #
self.emit_unrolled_operation(jump_op)
def linear_find_smallest_type(self, loop):
# O(#operations)
for i,op in enumerate(loop.operations):
- if op.getopnum() == rop.GUARD_EARLY_EXIT:
- self.early_exit_idx = i
if op.is_raw_array_access():
descr = op.getdescr()
if not descr.is_array_of_pointers():
@@ -525,11 +516,13 @@
return arg
def analyse_index_calculations(self):
- if len(self.loop.operations) <= 1 or self.early_exit_idx == -1:
+ ee_pos = 1
+ ops = self.loop.operations
+ if len(ops) <= 2 or ops[ee_pos].getopnum() != rop.GUARD_EARLY_EXIT:
return
self.dependency_graph = graph = DependencyGraph(self.loop)
label_node = graph.getnode(0)
- ee_guard_node = graph.getnode(self.early_exit_idx)
+ ee_guard_node = graph.getnode(ee_pos)
guards = graph.guards
for guard_node in guards:
if guard_node is ee_guard_node:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit