[pypy-commit] pypy optresult-unroll: kill modifying short preamble in place
fijal
noreply at buildbot.pypy.org
Fri Aug 28 18:32:32 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79284:4cf54bb12f0f
Date: 2015-08-28 18:14 +0200
http://bitbucket.org/pypy/pypy/changeset/4cf54bb12f0f/
Log: kill modifying 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
@@ -408,8 +408,7 @@
def build_short_preamble(self):
label_op = ResOperation(rop.LABEL, self.short_inputargs[:])
- jump_op = ResOperation(rop.JUMP, self.short_preamble_jump)
- # WARNING! the short_preamble_jump is shared on purpose
+ jump_op = ResOperation(rop.JUMP, self.short_preamble_jump[:])
if not we_are_translated():
TreeLoop.check_consistency_of(self.short_inputargs,
self.short + [jump_op], check_descr=False)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -855,19 +855,19 @@
i3 = getfield_gc_i(p3sub, descr=valuedescr)
escape_n(i3)
p2sub = new_with_vtable(descr=nodesize2)
+ setfield_gc(p2sub, i1, descr=valuedescr)
setfield_gc(p2, p2sub, descr=nextdescr)
- setfield_gc(p2sub, i1, descr=valuedescr)
- i4 = same_as_i(i1)
- jump(i1, p2, p2sub, i4)
- """
- expected = """
- [i1, p2, p10, i10]
- escape_n(i10)
+ jump(i1, p2, p2sub)
+ """
+ expected = """
+ [i1, p2, p10]
+ i3 = getfield_gc_i(p10, descr=valuedescr)
+ escape_n(i3)
p1 = new_with_vtable(descr=nodesize)
p3sub = new_with_vtable(descr=nodesize2)
setfield_gc(p3sub, i1, descr=valuedescr)
setfield_gc(p1, p3sub, descr=nextdescr)
- jump(i1, p1, p3sub, i1)
+ jump(i1, p1, p3sub)
"""
self.optimize_loop(ops, expected, preamble,
jump_values=[None, self.nodefulladdr, self.nodefulladdr, None])
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
@@ -81,7 +81,6 @@
distinction anymore)"""
short_preamble_producer = None
- main_target_token = None
def __init__(self, metainterp_sd, jitdriver_sd, optimizations):
self.optimizer = UnrollableOptimizer(metainterp_sd, jitdriver_sd,
@@ -121,20 +120,15 @@
start_label.getarglist()[:], ops, call_pure_results, False,
flush=False)
label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr())
+ extra_same_as = self.short_preamble_producer.extra_same_as[:]
target_token = self.finalize_short_preamble(label_op,
state.virtual_state)
- self.main_target_token = target_token
label_op.setdescr(target_token)
- extra = self.short_preamble_producer.used_boxes
- label_op.initarglist(label_args + extra)
# force the boxes for virtual state to match
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:
celltoken = start_label.getdescr()
assert isinstance(celltoken, JitCellToken)
@@ -142,8 +136,7 @@
return (UnrollInfo(target_token, label_op, []),
self.optimizer._newoperations)
#return new_virtual_state, self.optimizer._newoperations
- return (UnrollInfo(target_token, label_op,
- self.short_preamble_producer.extra_same_as),
+ return (UnrollInfo(target_token, label_op, extra_same_as),
self.optimizer._newoperations)
def optimize_bridge(self, start_label, operations, call_pure_results,
@@ -203,6 +196,8 @@
target_token.virtual_state = virtual_state
target_token.short_preamble = short_preamble
jitcelltoken.target_tokens.append(target_token)
+ self.short_preamble_producer = None # no more boxes
+ label_op.initarglist(label_op.getarglist() + sb.used_boxes)
return target_token
def jump_to_preamble(self, cell_token, jump_op, info):
@@ -238,13 +233,9 @@
self.optimizer, append_virtuals=True)
args = target_virtual_state.make_inputargs(args,
self.optimizer)
- if target_token is self.main_target_token:
- # rebuild the short preamble, it might have changed
- new_sp = self.short_preamble_producer.build_short_preamble()
- target_token.short_preamble = new_sp
short_preamble = target_token.short_preamble
extra = self.inline_short_preamble(pass_to_short, args,
- short_preamble[0].getarglist(), short_preamble,
+ short_preamble[0].getarglist(), short_preamble[1:-1],
short_preamble[-1].getarglist(), self.optimizer.patchguardop)
self.send_extra_operation(jump_op.copy_and_change(rop.JUMP,
args=args + extra,
@@ -255,16 +246,13 @@
def inline_short_preamble(self, jump_args, args_no_virtuals,
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)
for i in range(len(jump_args)):
short_inputargs[i].set_forwarded(None)
self.make_equal_to(short_inputargs[i], jump_args[i])
- i = 1
- while i < len(short_ops) - 1:
- op = short_ops[i]
+ for op in short_ops:
if op.is_guard():
op = self.replace_op_with(op, op.getopnum(),
descr=compile.ResumeAtPositionDescr())
@@ -272,7 +260,6 @@
op.rd_snapshot = patchguardop.rd_snapshot
op.rd_frame_info_list = patchguardop.rd_frame_info_list
self.optimizer.send_extra_operation(op)
- i += 1
# force all of them except the virtuals
for arg in args_no_virtuals + short_jump_op:
self.optimizer.force_box(self.get_box_replacement(arg))
@@ -284,9 +271,9 @@
op.set_forwarded(None)
def export_state(self, start_label, original_label_args, renamed_inputargs):
- self.optimizer.force_at_end_of_preamble()
end_args = [self.optimizer.force_box_for_end_of_preamble(a)
for a in original_label_args]
+ self.optimizer.force_at_end_of_preamble()
virtual_state = self.get_virtual_state(end_args)
end_args = [self.get_box_replacement(arg) for arg in end_args]
infos = {}
More information about the pypy-commit
mailing list