[pypy-commit] pypy optresult-unroll: pass the first inlining of short preamble in the bridge, yay!
fijal
noreply at buildbot.pypy.org
Wed Aug 19 12:18:41 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79051:73dadee30d14
Date: 2015-08-19 12:18 +0200
http://bitbucket.org/pypy/pypy/changeset/73dadee30d14/
Log: pass the first inlining of short preamble in the bridge, yay!
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -266,6 +266,8 @@
descr=start_descr)
mid_descr_token = TargetToken(jitcell_token,
original_jitcell_token=jitcell_token)
+ mid_descr_token.short_preamble = loop_info.short_preamble
+ mid_descr_token.virtual_state = start_state.virtual_state
mid_label = ResOperation(rop.LABEL, loop_info.label_args,
descr=mid_descr_token)
# XXX assign short preamble and virtual state
@@ -1043,10 +1045,12 @@
call_pure_results=call_pure_results,
enable_opts=enable_opts)
try:
- info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data)
+ try:
+ info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data)
+ finally:
+ forget_optimization_info(inputargs)
+ forget_optimization_info(operations)
except InvalidLoop:
- forget_optimization_info(inputargs)
- forget_optimization_info(operations)
debug_print("compile_new_bridge: got an InvalidLoop")
# XXX I am fairly convinced that optimize_bridge cannot actually raise
# InvalidLoop
@@ -1056,9 +1060,9 @@
new_trace = create_empty_loop(metainterp)
new_trace.inputargs = info.inputargs
new_trace.operations = newops
+ target_token = new_trace.operations[-1].getdescr()
resumekey.compile_and_attach(metainterp, new_trace)
record_loop_or_bridge(metainterp_sd, new_trace)
- target_token = new_trace.operations[-1].getdescr()
return target_token
xxxx
if new_trace.operations[-1].getopnum() != rop.LABEL:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
@@ -18,6 +18,8 @@
info = self.unroll_and_optimize(loop, None)
jitcell_token = compile.make_jitcell_token(None)
mid_label_descr = TargetToken(jitcell_token)
+ mid_label_descr.short_preamble = info.short_preamble
+ mid_label_descr.virtual_state = info.virtual_state
start_label_descr = TargetToken(jitcell_token)
jitcell_token.target_tokens = [mid_label_descr, start_label_descr]
loop.operations[0].setdescr(mid_label_descr)
@@ -28,6 +30,7 @@
bridge = self.parse(bridge_ops, postprocess=self.postprocess)
start_label = ResOperation(rop.LABEL, bridge.inputargs)
bridge.operations[-1].setdescr(jitcell_token)
+ self.add_guard_future_condition(bridge)
data = compile.BridgeCompileData(start_label, bridge.operations,
enable_opts=self.enable_opts,
inline_short_preamble=inline_short_preamble)
@@ -85,4 +88,9 @@
[i0, i1, i2]
jump(i0, i1, i2)
"""
- self.optimize(loop, bridge, bridge)
+ expected = """
+ [i0, i1, i2]
+ i3 = int_add(i0, 1)
+ jump(i0, i1, i2, i3)
+ """
+ self.optimize(loop, bridge, expected)
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
@@ -395,9 +395,10 @@
return ""
class Info(object):
- def __init__(self, preamble, short_preamble=None):
+ def __init__(self, preamble, short_preamble=None, virtual_state=None):
self.preamble = preamble
self.short_preamble = short_preamble
+ self.virtual_state = virtual_state
class Storage(compile.ResumeGuardDescr):
"for tests."
@@ -494,7 +495,8 @@
loop_info.extra_same_as + [emit_end_label])
loop.inputargs = inputargs
loop.operations = [emit_end_label] + ops
- return Info(preamble, loop_info.short_preamble)
+ return Info(preamble, loop_info.short_preamble,
+ start_state.virtual_state)
class FakeDescr(compile.ResumeGuardDescr):
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
@@ -79,11 +79,12 @@
modifier = VirtualStateConstructor(self.optimizer)
return modifier.get_virtual_state(args)
- def _check_no_forwarding(self, lsts):
+ def _check_no_forwarding(self, lsts, check_newops=True):
for lst in lsts:
for op in lst:
assert op.get_forwarded() is None
- assert not self.optimizer._newoperations
+ if check_newops:
+ assert not self.optimizer._newoperations
def optimize_preamble(self, start_label, end_label, ops, call_pure_results):
self._check_no_forwarding([[start_label, end_label], ops])
@@ -110,7 +111,12 @@
pass_to_short = state.virtual_state.make_inputargs(orig_jump_args,
self.optimizer, force_boxes=True,
append_virtuals=True)
- extra_jump_args = self.inline_short_preamble(pass_to_short)
+ sb = self.short_preamble_producer
+ self.optimizer._clean_optimization_info(sb.short_inputargs)
+ extra_jump_args = self.inline_short_preamble(pass_to_short,
+ sb.short_inputargs, sb.short,
+ sb.short_preamble_jump,
+ self.optimizer.patchguardop)
# remove duplicates, removes stuff from used boxes too
label_args, jump_args = self.filter_extra_jump_args(
start_label.getarglist() + self.short_preamble_producer.used_boxes,
@@ -125,6 +131,8 @@
def optimize_bridge(self, start_label, operations, call_pure_results,
inline_short_preamble):
assert inline_short_preamble
+ self._check_no_forwarding([start_label.getarglist(),
+ operations])
info, ops = self.optimizer.propagate_all_forward(
start_label.getarglist()[:], operations[:-1],
call_pure_results, True)
@@ -134,9 +142,15 @@
def jump_to_existing_trace(self, jump_op, inline_short_preamble):
jitcelltoken = jump_op.getdescr()
- args = jump_op.getarglist()
+ args = [self.get_box_replacement(op) for op in jump_op.getarglist()]
+ target_token = jitcelltoken.target_tokens[0]
virtual_state = self.get_virtual_state(args)
+ short_preamble = target_token.short_preamble
+ extra = self.inline_short_preamble(args,
+ 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,
descr=jitcelltoken.target_tokens[0]))
def filter_extra_jump_args(self, label_args, jump_args):
@@ -153,22 +167,24 @@
d[arg] = None
return new_label_args, new_jump_args
- def inline_short_preamble(self, jump_args):
- sb = self.short_preamble_producer
- assert len(sb.short_inputargs) == len(jump_args)
+ def inline_short_preamble(self, jump_args, short_inputargs, short_ops,
+ short_jump_op, patchguardop):
+ self._check_no_forwarding([short_inputargs, short_ops], False)
+ assert len(short_inputargs) == len(jump_args)
for i in range(len(jump_args)):
- sb.short_inputargs[i].set_forwarded(None)
- self.make_equal_to(sb.short_inputargs[i], jump_args[i])
- patchguardop = self.optimizer.patchguardop
- for op in sb.short:
+ short_inputargs[i].set_forwarded(None)
+ self.make_equal_to(short_inputargs[i], jump_args[i])
+ for op in short_ops:
if op.is_guard():
op = self.replace_op_with(op, op.getopnum())
op.rd_snapshot = patchguardop.rd_snapshot
op.rd_frame_info_list = patchguardop.rd_frame_info_list
self.optimizer.send_extra_operation(op)
res = [self.optimizer.get_box_replacement(op) for op in
- sb.short_preamble_jump]
- for op in sb.short_inputargs:
+ short_jump_op]
+ for op in short_inputargs:
+ op.set_forwarded(None)
+ for op in short_ops:
op.set_forwarded(None)
return res
More information about the pypy-commit
mailing list