[pypy-commit] pypy optresult-unroll: start working on direct tests for bridges
fijal
noreply at buildbot.pypy.org
Wed Aug 19 11:09:22 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79048:2f2f6319cdd2
Date: 2015-08-19 11:09 +0200
http://bitbucket.org/pypy/pypy/changeset/2f2f6319cdd2/
Log: start working on direct tests for bridges
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
@@ -76,6 +76,26 @@
return opt.propagate_all_forward(self.start_label.getarglist(),
self.operations, self.call_pure_results, self.enable_opts)
+class BridgeCompileData(CompileData):
+ """ This represents ops() with a jump at the end that goes to some
+ loop, we need to deal with virtual state and inlining of short preamble
+ """
+ def __init__(self, start_label, operations, call_pure_results=None,
+ enable_opts=None, inline_short_preamble=False):
+ self.start_label = start_label
+ self.operations = operations
+ self.call_pure_results = call_pure_results
+ self.enable_opts = enable_opts
+ self.inline_short_preamble = inline_short_preamble
+
+ def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll):
+ from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer
+
+ opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
+ return opt.optimize_bridge(self.start_label, self.operations,
+ self.call_pure_results,
+ self.inline_short_preamble)
+
class UnrolledLoopData(CompileData):
""" This represents label() ops jump with extra info that's from the
run of LoopCompileData. Jump goes to the same label
@@ -253,7 +273,7 @@
loop.operations = ([start_label] + preamble_ops + loop_info.extra_same_as +
[mid_label] + loop_ops)
loop.check_consistency()
- jitcell_token.all_target_tokens = [start_descr, mid_descr_token]
+ jitcell_token.target_tokens = [mid_descr_token, start_descr]
send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop")
record_loop_or_bridge(metainterp_sd, loop)
return start_descr
@@ -783,10 +803,10 @@
# to the corresponding guard_op and compile from there
assert metainterp.resumekey_original_loop_token is not None
new_loop.original_jitcell_token = metainterp.resumekey_original_loop_token
- inputargs = metainterp.history.inputargs
+ inputargs = new_loop.inputargs
if not we_are_translated():
self._debug_suboperations = new_loop.operations
- propagate_original_jitcell_token(new_loop)
+ #propagate_original_jitcell_token(new_loop)
send_bridge_to_backend(metainterp.jitdriver_sd, metainterp.staticdata,
self, inputargs, new_loop.operations,
new_loop.original_jitcell_token)
@@ -1001,11 +1021,10 @@
metainterp_sd = metainterp.staticdata
jitdriver_sd = metainterp.jitdriver_sd
state = jitdriver_sd.warmstate
- #if isinstance(resumekey, ResumeAtPositionDescr):
- # inline_short_preamble = False
- #else:
- # xxx
- # inline_short_preamble = True
+ if isinstance(resumekey, ResumeAtPositionDescr):
+ inline_short_preamble = False
+ else:
+ inline_short_preamble = True
inputargs = metainterp.history.inputargs[:]
operations = metainterp.history.operations
label = ResOperation(rop.LABEL, inputargs)
@@ -1014,9 +1033,15 @@
call_pure_results = metainterp.call_pure_results
- data = SimpleCompileData(label, operations,
- call_pure_results=call_pure_results,
- enable_opts=enable_opts)
+ if operations[-1].getopnum() == rop.JUMP:
+ data = BridgeCompileData(label, operations[:],
+ call_pure_results=call_pure_results,
+ enable_opts=enable_opts,
+ inline_short_preamble=inline_short_preamble)
+ else:
+ data = SimpleCompileData(label, operations[:],
+ call_pure_results=call_pure_results,
+ enable_opts=enable_opts)
try:
info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data)
except InvalidLoop:
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
@@ -521,6 +521,10 @@
def _emit_operation(self, op):
assert not op.is_call_pure()
orig_op = op
+ op = self.get_box_replacement(op)
+ if op.is_constant():
+ return # can happen e.g. if we postpone the operation that becomes
+ # constant
op = self.replace_op_with(op, op.getopnum())
for i in range(op.numargs()):
arg = self.force_box(op.getarg(i))
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
@@ -0,0 +1,56 @@
+
+from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest,\
+ LLtypeMixin, convert_old_style_to_targets
+from rpython.jit.metainterp import compile
+from rpython.jit.metainterp.resoperation import ResOperation, rop
+from rpython.jit.metainterp.history import TargetToken
+
+class TestOptimizeBridge(BaseTest, LLtypeMixin):
+ enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
+
+ def optimize(self, ops, bridge_ops, expected, inline_short_preamble=True):
+ loop = self.parse(ops, postprocess=self.postprocess)
+ info = self.unroll_and_optimize(loop, None)
+ jitcell_token = compile.make_jitcell_token(None)
+ mid_label_descr = TargetToken(jitcell_token)
+ start_label_descr = TargetToken(jitcell_token)
+ jitcell_token.target_tokens = [mid_label_descr, start_label_descr]
+ loop.operations[0].setdescr(mid_label_descr)
+ loop.operations[-1].setdescr(mid_label_descr)
+ info.preamble.operations[0].setdescr(start_label_descr)
+ guards = [op for op in loop.operations if op.is_guard()]
+ assert len(guards) == 1, "more than one guard in the loop"
+ bridge = self.parse(bridge_ops, postprocess=self.postprocess)
+ start_label = ResOperation(rop.LABEL, bridge.inputargs)
+ bridge.operations[-1].setdescr(jitcell_token)
+ data = compile.BridgeCompileData(start_label, bridge.operations,
+ enable_opts=self.enable_opts,
+ inline_short_preamble=inline_short_preamble)
+ bridge_info, ops = self._do_optimize_loop(data)
+ loop.check_consistency(check_descr=False)
+ info.preamble.check_consistency(check_descr=False)
+ bridge.operations = ([ResOperation(rop.LABEL, bridge_info.inputargs)] +
+ ops)
+ bridge.inputargs = bridge_info.inputargs
+ bridge.check_consistency(check_descr=False)
+ expected = self.parse(expected, postprocess=self.postprocess)
+ self.assert_equal(bridge, convert_old_style_to_targets(expected,
+ jump=True))
+
+ def test_simple(self):
+ loop = """
+ [i0]
+ i1 = int_add(i0, 1)
+ i2 = int_is_true(i1)
+ guard_true(i2) [i1, i2]
+ jump(i1)
+ """
+ bridge = """
+ [i0, i1]
+ jump(i1)
+ """
+ expected = """
+ [i0, i1]
+ jump(i1)
+ """
+ self.optimize(loop, bridge, expected)
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
@@ -122,6 +122,23 @@
self.short_preamble_producer.extra_same_as),
self.optimizer._newoperations)
+ def optimize_bridge(self, start_label, operations, call_pure_results,
+ inline_short_preamble):
+ assert inline_short_preamble
+ info, ops = self.optimizer.propagate_all_forward(
+ start_label.getarglist()[:], operations[:-1],
+ call_pure_results, True)
+ jump_op = operations[-1]
+ self.jump_to_existing_trace(jump_op, inline_short_preamble)
+ return info, self.optimizer._newoperations[:]
+
+ def jump_to_existing_trace(self, jump_op, inline_short_preamble):
+ jitcelltoken = jump_op.getdescr()
+ args = jump_op.getarglist()
+ virtual_state = self.get_virtual_state(args)
+ self.send_extra_operation(jump_op.copy_and_change(rop.JUMP,
+ descr=jitcelltoken.target_tokens[0]))
+
def filter_extra_jump_args(self, label_args, jump_args):
new_label_args = []
new_jump_args = []
More information about the pypy-commit
mailing list