[pypy-commit] pypy optresult-unroll: rework short preamble a bit
fijal
noreply at buildbot.pypy.org
Mon Aug 24 12:36:13 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79191:260ee146ed8f
Date: 2015-08-24 11:13 +0200
http://bitbucket.org/pypy/pypy/changeset/260ee146ed8f/
Log: rework short preamble a bit
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -346,8 +346,8 @@
starting from short_boxes exported from the preamble. It will build
the short preamble and necessary extra label arguments
"""
- def __init__(self, short_boxes, short_inputargs, exported_infos,
- optimizer=None):
+ def __init__(self, label_args, short_boxes, short_inputargs,
+ exported_infos, optimizer=None):
for produced_op in short_boxes:
op = produced_op.short_op.res
preamble_op = produced_op.preamble_op
@@ -359,6 +359,9 @@
info = empty_info
preamble_op.set_forwarded(info)
self.short = []
+ self.label_dict = {}
+ for arg in label_args:
+ self.label_dict[arg] = None
self.used_boxes = []
self.short_preamble_jump = []
self.extra_same_as = []
@@ -390,12 +393,17 @@
def add_preamble_op(self, preamble_op):
if preamble_op.invented_name:
self.extra_same_as.append(preamble_op.op)
- self.used_boxes.append(preamble_op.op)
+ op = preamble_op.op
+ if op in self.label_dict:
+ return
+ self.label_dict[op] = None
+ self.used_boxes.append(op)
self.short_preamble_jump.append(preamble_op.preamble_op)
- def build_short_preamble(self, sb_jump):
+ def build_short_preamble(self):
label_op = ResOperation(rop.LABEL, self.short_inputargs[:])
- jump_op = ResOperation(rop.JUMP, sb_jump)
+ jump_op = ResOperation(rop.JUMP, self.short_preamble_jump)
+ # WARNING! the short_preamble_jump is shared on purpose
TreeLoop.check_consistency_of(self.short_inputargs,
self.short + [jump_op], check_descr=False)
return [label_op] + self.short + [jump_op]
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
@@ -103,23 +103,28 @@
def optimize_peeled_loop(self, start_label, end_jump, ops, state,
call_pure_results):
self._check_no_forwarding([[start_label, end_jump], ops])
- self.import_state(start_label, state)
- self.potential_extra_ops = {}
label_args = state.virtual_state.make_inputargs(
start_label.getarglist(), self.optimizer)
+ self.import_state(start_label, state, label_args)
+ self.potential_extra_ops = {}
self.optimizer.init_inparg_dict_from(label_args)
info, _ = self.optimizer.propagate_all_forward(
start_label.getarglist()[:], ops, call_pure_results, False)
label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr())
- target_token, extra = self.finalize_short_preamble(label_op,
+ target_token = self.finalize_short_preamble(label_op,
state.virtual_state)
label_op.setdescr(target_token)
- label_op.initarglist(label_op.getarglist() + extra)
+ extra = self.short_preamble_producer.used_boxes
+ label_args = [self.get_box_replacement(op) for op in label_args]
+ label_op.initarglist(label_args + extra)
# force the boxes for virtual state to match
x = state.virtual_state.make_inputargs(
[self.get_box_replacement(x) for x in end_jump.getarglist()],
self.optimizer, force_boxes=True)
new_virtual_state = self.jump_to_existing_trace(end_jump)
+ # the short preamble could have grown, we reinitialize
+ # the label_op again
+ label_op.initarglist(label_args + extra)
if new_virtual_state is not None:
res = self.jump_to_preamble(start_label.getdescr(), end_jump,
info)
@@ -169,18 +174,7 @@
def finalize_short_preamble(self, label_op, virtual_state):
sb = self.short_preamble_producer
self.optimizer._clean_optimization_info(sb.short_inputargs)
- d = {}
- for arg in label_op.getarglist():
- d[arg] = None
- new_used_boxes = []
- new_sb_jump = []
- for i in range(len(sb.used_boxes)):
- ub = sb.used_boxes[i]
- if ub in d:
- continue
- new_used_boxes.append(ub)
- new_sb_jump.append(sb.short_preamble_jump[i])
- short_preamble = sb.build_short_preamble(new_sb_jump)
+ short_preamble = sb.build_short_preamble()
jitcelltoken = label_op.getdescr()
if jitcelltoken.target_tokens is None:
jitcelltoken.target_tokens = []
@@ -190,7 +184,7 @@
target_token.virtual_state = virtual_state
target_token.short_preamble = short_preamble
jitcelltoken.target_tokens.append(target_token)
- return target_token, new_used_boxes
+ return target_token
def jump_to_preamble(self, cell_token, jump_op, info):
assert cell_token.target_tokens[0].virtual_state is None
@@ -238,6 +232,7 @@
def inline_short_preamble(self, jump_args, short_inputargs, short_ops,
short_jump_op, patchguardop):
+ # warning!!!! short_jump_op might have arguments appended IN PLACE
try:
self._check_no_forwarding([short_inputargs, short_ops], False)
assert len(short_inputargs) == len(jump_args)
@@ -285,7 +280,7 @@
short_boxes, renamed_inputargs,
short_inputargs)
- def import_state(self, targetop, exported_state):
+ def import_state(self, targetop, exported_state, label_args):
# the mapping between input args (from old label) and what we need
# to actually emit. Update the info
assert (len(exported_state.next_iteration_args) ==
@@ -301,8 +296,9 @@
# import the optimizer state, starting from boxes that can be produced
# by short preamble
self.short_preamble_producer = ShortPreambleBuilder(
- exported_state.short_boxes, exported_state.short_inputargs,
- exported_state.exported_infos, self.optimizer)
+ label_args, exported_state.short_boxes,
+ exported_state.short_inputargs, exported_state.exported_infos,
+ self.optimizer)
for produced_op in exported_state.short_boxes:
produced_op.produce_op(self, exported_state.exported_infos)
More information about the pypy-commit
mailing list