Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79324:6c309d777d44
Date: 2015-08-31 18:58 +0200
http://bitbucket.org/pypy/pypy/changeset/6c309d777d44/
Log: allow modifications of short preamble in-place
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
@@ -400,6 +400,9 @@
return preamble_op
def add_preamble_op(self, preamble_op):
+ """ Notice that we're actually using the preamble_op, add it to
+ label and jump
+ """
if preamble_op.invented_name:
self.extra_same_as.append(preamble_op.op)
op = preamble_op.op
@@ -418,5 +421,26 @@
return [label_op] + self.short + [jump_op]
class ExtendedShortPreambleBuilder(AbstractShortPreambleBuilder):
- def __init__(self, sb):
+ """ A special preamble builder that is called while we're building
+ short preamble
+ """
+ def __init__(self, target_token, sb):
self.sb = sb
+ self.extra_same_as = self.sb.extra_same_as
+ self.target_token = target_token
+
+ def setup(self, inputargs, jump_args, short, label_args):
+ self.inputargs = inputargs
+ self.jump_args = jump_args
+ self.short = short
+ self.label_args = label_args
+
+ def add_preamble_op(self, preamble_op):
+ if preamble_op.invented_name:
+ self.extra_same_as.append(preamble_op.op)
+ op = preamble_op.op
+ if op in self.sb.label_dict:
+ return
+ self.sb.label_dict[op] = None
+ self.label_args.append(op)
+ self.jump_args.append(preamble_op.preamble_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
@@ -130,7 +130,7 @@
state.virtual_state)
label_op.setdescr(target_token)
# force the boxes for virtual state to match
- new_virtual_state = self.jump_to_existing_trace(end_jump)
+ new_virtual_state = self.jump_to_existing_trace(end_jump, label_op)
if new_virtual_state is not None:
celltoken = start_label.getdescr()
assert isinstance(celltoken, JitCellToken)
@@ -160,7 +160,7 @@
self.optimizer.flush()
for a in jump_op.getarglist():
self.optimizer.force_box_for_end_of_preamble(a)
- vs = self.jump_to_existing_trace(jump_op)
+ vs = self.jump_to_existing_trace(jump_op, None)
if vs is None:
return info, self.optimizer._newoperations[:]
warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc
@@ -198,7 +198,8 @@
target_token.virtual_state = virtual_state
target_token.short_preamble = short_preamble
jitcelltoken.target_tokens.append(target_token)
- self.short_preamble_producer = ExtendedShortPreambleBuilder(sb)
+ self.short_preamble_producer = ExtendedShortPreambleBuilder(
+ target_token, sb)
label_op.initarglist(label_op.getarglist() + sb.used_boxes)
return target_token
@@ -210,7 +211,7 @@
return info, self.optimizer._newoperations[:]
- def jump_to_existing_trace(self, jump_op):
+ def jump_to_existing_trace(self, jump_op, label_op):
jitcelltoken = jump_op.getdescr()
assert isinstance(jitcelltoken, JitCellToken)
virtual_state = self.get_virtual_state(jump_op.getarglist())
@@ -235,7 +236,8 @@
args, self.optimizer)
short_preamble = target_token.short_preamble
extra = self.inline_short_preamble(args + virtuals, args,
- short_preamble, self.optimizer.patchguardop)
+ short_preamble, self.optimizer.patchguardop,
+ target_token, label_op)
self.send_extra_operation(jump_op.copy_and_change(rop.JUMP,
args=args + extra,
descr=target_token))
@@ -243,34 +245,40 @@
return virtual_state
def inline_short_preamble(self, jump_args, args_no_virtuals, short,
- patchguardop):
+ patchguardop, target_token, label_op):
short_inputargs = short[0].getarglist()
- short_jump_op = short[-1].getarglist()
- lgt = len(short) - 1
- assert lgt >= 0
- short_ops = short[1:lgt]
+ short_jump_args = short[-1].getarglist()
+ if (self.short_preamble_producer and
+ self.short_preamble_producer.target_token is target_token):
+ # this means we're inlining the short preamble that's being
+ # built. Make sure we modify the correct things in-place
+ self.short_preamble_producer.setup(short_inputargs,
short_jump_args,
+ short, label_op.getarglist())
try:
- self._check_no_forwarding([short_inputargs, short_ops], False)
+ self._check_no_forwarding([short_inputargs, short], False)
assert len(short_inputargs) == len(jump_args)
for i in range(len(jump_args)):
short_inputargs[i].set_forwarded(None)
self.make_equal_to(short_inputargs[i], jump_args[i])
- for op in short_ops:
+ i = 1
+ while i < len(short) - 1:
+ op = short[i]
if op.is_guard():
op = self.replace_op_with(op, op.getopnum(),
descr=compile.ResumeAtPositionDescr())
assert isinstance(op, GuardResOp)
op.rd_snapshot = patchguardop.rd_snapshot
op.rd_frame_info_list = patchguardop.rd_frame_info_list
+ i += 1
self.optimizer.send_extra_operation(op)
# force all of them except the virtuals
- for arg in args_no_virtuals + short_jump_op:
+ for arg in short_jump_args:
self.optimizer.force_box(self.get_box_replacement(arg))
- return [self.get_box_replacement(box) for box in short_jump_op]
+ return [self.get_box_replacement(box) for box in short_jump_args]
finally:
for op in short_inputargs:
op.set_forwarded(None)
- for op in short_ops:
+ for op in short:
op.set_forwarded(None)
def export_state(self, start_label, original_label_args,
renamed_inputargs):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit