Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78483:6080a2b3e0bf
Date: 2015-07-07 11:37 +0200
http://bitbucket.org/pypy/pypy/changeset/6080a2b3e0bf/
Log: add an option to rename inputargs
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -433,12 +433,16 @@
else:
return CONST_0
- def propagate_all_forward(self, inputargs, ops, call_pure_results=None):
- newargs = []
- for inparg in inputargs:
- new_arg = OpHelpers.inputarg_from_tp(inparg.type)
- inparg.set_forwarded(new_arg)
- newargs.append(new_arg)
+ def propagate_all_forward(self, inputargs, ops, call_pure_results=None,
+ rename_inputargs=True):
+ if rename_inputargs:
+ newargs = []
+ for inparg in inputargs:
+ new_arg = OpHelpers.inputarg_from_tp(inparg.type)
+ inparg.set_forwarded(new_arg)
+ newargs.append(new_arg)
+ else:
+ newargs = inputargs
self.init_inparg_dict_from(newargs)
self.call_pure_results = call_pure_results
for op in ops:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
@@ -30,7 +30,6 @@
operations = operations[:-1]
preamble = TreeLoop('preamble')
- preamble.inputargs = inputargs
token = JitCellToken()
start_label = ResOperation(rop.LABEL, inputargs,
descr=TargetToken(token))
@@ -38,6 +37,7 @@
compile_data = LoopCompileData(start_label, stop_label, operations)
start_state, newops = self._do_optimize_loop(compile_data)
preamble.operations = newops
+ preamble.inputargs = start_state.renamed_inputargs
return start_state, loop, preamble
class TestUnroll(BaseTestUnroll):
@@ -80,7 +80,7 @@
jump(p0)
"""
es, loop, preamble = self.optimize(loop)
- p0 = loop.inputargs[0]
+ p0 = preamble.inputargs[0]
assert (heaptracker.adr2int(self.node_vtable_adr) ==
es.exported_infos[p0]._known_class.getint())
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -447,7 +447,8 @@
ops, start_state)
loop_info, ops = self._do_optimize_loop(loop_data, call_pure_results)
preamble = TreeLoop('preamble')
- preamble.inputargs = start_label.getarglist()
+ preamble.inputargs = start_state.renamed_inputargs
+ start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs)
preamble.operations = [start_label] + preamble_ops
emit_end_label = ResOperation(rop.LABEL, start_state.end_args)
loop.inputargs = start_state.end_args
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -70,15 +70,18 @@
def optimize_preamble(self, start_label, end_label, ops):
self._check_no_forwarding([[start_label, end_label], ops])
- self.optimizer.propagate_all_forward(start_label.getarglist()[:], ops)
- exported_state = self.export_state(start_label, end_label)
+ info, newops = self.optimizer.propagate_all_forward(
+ start_label.getarglist()[:], ops)
+ exported_state = self.export_state(start_label, end_label,
+ info.inputargs)
return exported_state, self.optimizer._newoperations
def optimize_peeled_loop(self, start_label, end_jump, ops, state):
self.short = []
self._check_no_forwarding([[start_label, end_jump], ops])
self.import_state(start_label, state)
- self.optimizer.propagate_all_forward(start_label.getarglist()[:], ops)
+ self.optimizer.propagate_all_forward(start_label.getarglist()[:], ops,
+ rename_inputargs=False)
jump_args = [self.get_box_replacement(op)
for op in end_jump.getarglist()]
jump_args = state.virtual_state.make_inputargs(jump_args,
@@ -186,7 +189,7 @@
return stop_target.targeting_jitcell_token is
start_target.targeting_jitcell_token
- def export_state(self, start_label, end_label):
+ def export_state(self, start_label, end_label, renamed_inputargs):
original_label_args = end_label.getarglist()
end_args = [self.get_box_replacement(a) for a in original_label_args]
virtual_state = self.get_virtual_state(end_args)
@@ -200,7 +203,7 @@
infos[arg] = self.optimizer.getinfo(arg)
label_args = virtual_state.make_inputargs(end_args, self.optimizer)
return ExportedState(label_args, inparg_mapping, virtual_state, infos,
- sb.short_boxes)
+ sb.short_boxes, renamed_inputargs)
inputargs = virtual_state.make_inputargs(jump_args, self.optimizer)
@@ -716,12 +719,14 @@
* virtual_state - instance of VirtualState representing current state
of virtuals at this label
* short boxes - a mapping op -> preamble_op
+ * renamed_inputargs - the start label arguments in optimized version
"""
def __init__(self, end_args, inputarg_mapping, virtual_state,
- exported_infos, short_boxes):
+ exported_infos, short_boxes, renamed_inputargs):
self.end_args = end_args
self.inputarg_mapping = inputarg_mapping
self.virtual_state = virtual_state
self.exported_infos = exported_infos
self.short_boxes = short_boxes
+ self.renamed_inputargs = renamed_inputargs
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit