Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79176:0e3a0ea12d66
Date: 2015-08-24 10:12 +0200
http://bitbucket.org/pypy/pypy/changeset/0e3a0ea12d66/
Log: rework the retracing
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
@@ -289,18 +289,11 @@
original_jitcell_token=jitcell_token)
start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs,
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
- loop_ops[-1].setdescr(mid_descr_token)
loop.operations = ([start_label] + preamble_ops + loop_info.extra_same_as +
- [mid_label] + loop_ops)
+ [loop_info.label_op] + loop_ops)
loop.check_consistency()
- jitcell_token.target_tokens = [start_descr, mid_descr_token]
+ jitcell_token.target_tokens = [start_descr] + jitcell_token.target_tokens
send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop")
record_loop_or_bridge(metainterp_sd, loop)
return start_descr
@@ -333,33 +326,13 @@
loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd,
loop_data)
except InvalidLoop:
+ # Fall back on jumping to preamble
xxx
- # Fall back on jumping to preamble
- target_token = label.getdescr()
- assert isinstance(target_token, TargetToken)
- part.operations = [orignial_label] + \
- [ResOperation(rop.JUMP, inputargs[:],
- descr=loop_jitcell_token)]
- try:
- optimize_trace(metainterp_sd, jitdriver_sd, part,
- jitdriver_sd.warmstate.enable_opts,
- inline_short_preamble=False,
start_state=start_state,
- export_state=False)
- except InvalidLoop:
- xxx # XXX forget optimizations
- return None
loop = partial_trace
- target_token = TargetToken(loop_jitcell_token)
- target_token.original_jitcell_token = loop_jitcell_token
- target_token.short_preamble = loop_info.short_preamble
- target_token.virtual_state = start_state.virtual_state
- loop_ops[-1].setdescr(target_token)
- mid_label = ResOperation(rop.LABEL, loop_info.label_args,
- descr=target_token)
- loop.operations = (loop.operations + loop_info.extra_same_as + [mid_label]
+ loop.operations = (loop.operations + loop_info.extra_same_as +
+ [loop_info.label_op]
+ loop_ops)
- loop_jitcell_token.target_tokens.append(target_token)
#quasi_immutable_deps = {}
#if loop.quasi_immutable_deps:
@@ -369,6 +342,7 @@
#if quasi_immutable_deps:
# loop.quasi_immutable_deps = quasi_immutable_deps
+ target_token = loop.operations[-1].getdescr()
resumekey.compile_and_attach(metainterp, loop)
record_loop_or_bridge(metainterp_sd, loop)
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
@@ -336,6 +336,8 @@
sb = self.optunroll.short_preamble_producer
sb.add_preamble_op(preamble_op)
if info is not None:
+ if op.type == 'i' and info.is_constant():
+ return ConstInt(info.getint())
return info.force_box(op, self)
return op
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
@@ -393,9 +393,9 @@
self.used_boxes.append(preamble_op.op)
self.short_preamble_jump.append(preamble_op.preamble_op)
- def build_short_preamble(self):
+ def build_short_preamble(self, sb_jump):
label_op = ResOperation(rop.LABEL, self.short_inputargs[:])
- jump_op = ResOperation(rop.JUMP, self.short_preamble_jump)
+ jump_op = ResOperation(rop.JUMP, sb_jump)
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/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
@@ -8122,7 +8122,7 @@
i4 = int_add(i3, i3)
i5 = int_add(i4, i4)
i6 = int_add(i5, i5)
- jump(i6, i3)
+ jump(i6)
"""
self.optimize_loop(ops, expected, expected_short=short)
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
@@ -483,7 +483,9 @@
jump_op = loop.operations[-1]
assert jump_op.getopnum() == rop.JUMP
ops = loop.operations[:-1]
- start_label = ResOperation(rop.LABEL, loop.inputargs)
+ jump_op.setdescr(JitCellToken())
+ start_label = ResOperation(rop.LABEL, loop.inputargs,
+ jump_op.getdescr())
end_label = jump_op.copy_and_change(opnum=rop.LABEL)
call_pure_results = self._convert_call_pure_results(call_pure_results)
preamble_data = compile.LoopCompileData(start_label, end_label, ops,
@@ -497,12 +499,11 @@
preamble = TreeLoop('preamble')
preamble.inputargs = start_state.renamed_inputargs
start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs)
- emit_end_label = ResOperation(rop.LABEL, loop_info.label_args)
preamble.operations = ([start_label] + preamble_ops +
- loop_info.extra_same_as + [emit_end_label])
- loop.inputargs = loop_info.label_args[:]
- loop.operations = [emit_end_label] + ops
- return Info(preamble, loop_info.short_preamble,
+ loop_info.extra_same_as + [loop_info.label_op])
+ loop.inputargs = loop_info.label_op.getarglist()[:]
+ loop.operations = [loop_info.label_op] + ops
+ return Info(preamble, loop_info.target_token.short_preamble,
start_state.virtual_state)
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
@@ -1,6 +1,6 @@
import sys
-from rpython.jit.metainterp.history import Const
+from rpython.jit.metainterp.history import Const, TargetToken
from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\
ShortPreambleBuilder, PreambleOp
from rpython.jit.metainterp.optimizeopt import info, intutils
@@ -58,10 +58,10 @@
elif isinstance(preamble_info, intutils.IntBound):
if preamble_info.lower > MININT/2 or preamble_info.upper <
MAXINT/2:
intbound = self.getintbound(op)
- if preamble_info.lower > MININT/2:
+ if preamble_info.has_lower and preamble_info.lower > MININT/2:
intbound.has_lower = True
intbound.lower = preamble_info.lower
- if preamble_info.upper < MAXINT/2:
+ if preamble_info.has_upper and preamble_info.upper < MAXINT/2:
intbound.has_upper = True
intbound.upper = preamble_info.upper
@@ -108,29 +108,24 @@
label_args = state.virtual_state.make_inputargs(
start_label.getarglist(), self.optimizer)
self.optimizer.init_inparg_dict_from(label_args)
- self.optimizer.propagate_all_forward(start_label.getarglist()[:], ops,
- call_pure_results, False)
- orig_jump_args = [self.get_box_replacement(op)
- for op in end_jump.getarglist()]
- jump_args = state.virtual_state.make_inputargs(orig_jump_args,
- self.optimizer, force_boxes=True)
- pass_to_short = state.virtual_state.make_inputargs(orig_jump_args,
- self.optimizer, force_boxes=True,
- append_virtuals=True)
- 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(
- label_args + self.short_preamble_producer.used_boxes,
- jump_args + extra_jump_args)
- jump_op = ResOperation(rop.JUMP, jump_args)
- self.optimizer.send_extra_operation(jump_op)
- return (UnrollInfo(self.short_preamble_producer.build_short_preamble(),
- 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,
+ state.virtual_state)
+ label_op.setdescr(target_token)
+ label_op.initarglist(label_op.getarglist() + 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)
+ if new_virtual_state is not None:
+ res = self.jump_to_preamble(start_label.getdescr(), end_jump,
+ info)
+ xxx
+ #return new_virtual_state, self.optimizer._newoperations
+ return (UnrollInfo(target_token, label_op,
self.short_preamble_producer.extra_same_as),
self.optimizer._newoperations)
@@ -145,7 +140,7 @@
cell_token = jump_op.getdescr()
if not inline_short_preamble or len(cell_token.target_tokens) == 1:
return self.jump_to_preamble(cell_token, jump_op, info)
- vs = self.jump_to_existing_trace(jump_op, inline_short_preamble)
+ vs = self.jump_to_existing_trace(jump_op)
if vs is None:
return info, self.optimizer._newoperations[:]
warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc
@@ -171,6 +166,32 @@
self.optimizer._clean_optimization_info(self.optimizer._newoperations)
return exported_state, self.optimizer._newoperations
+ 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)
+ jitcelltoken = label_op.getdescr()
+ if jitcelltoken.target_tokens is None:
+ jitcelltoken.target_tokens = []
+ target_token = TargetToken(jitcelltoken,
+ original_jitcell_token=jitcelltoken)
+ target_token.original_jitcell_token = jitcelltoken
+ target_token.virtual_state = virtual_state
+ target_token.short_preamble = short_preamble
+ jitcelltoken.target_tokens.append(target_token)
+ return target_token, new_used_boxes
+
def jump_to_preamble(self, cell_token, jump_op, info):
assert cell_token.target_tokens[0].virtual_state is None
jump_op = jump_op.copy_and_change(rop.JUMP,
@@ -179,7 +200,7 @@
return info, self.optimizer._newoperations[:]
- def jump_to_existing_trace(self, jump_op, inline_short_preamble):
+ def jump_to_existing_trace(self, jump_op):
jitcelltoken = jump_op.getdescr()
args = [self.get_box_replacement(op) for op in jump_op.getarglist()]
virtual_state = self.get_virtual_state(args)
@@ -203,7 +224,7 @@
continue
short_preamble = target_token.short_preamble
pass_to_short = target_virtual_state.make_inputargs(args,
- self.optimizer, force_boxes=True, append_virtuals=True)
+ self.optimizer, append_virtuals=True)
args = target_virtual_state.make_inputargs(args,
self.optimizer)
extra = self.inline_short_preamble(pass_to_short,
@@ -215,22 +236,6 @@
return None # explicit because the return can be non-None
return virtual_state
- def filter_extra_jump_args(self, label_args, jump_args):
- label_args = [self.get_box_replacement(x, True) for x in label_args]
- jump_args = [self.get_box_replacement(x) for x in jump_args]
- new_label_args = []
- new_jump_args = []
- assert len(label_args) == len(jump_args)
- d = {}
- for i in range(len(label_args)):
- arg = label_args[i]
- if arg in d:
- continue
- new_label_args.append(arg)
- new_jump_args.append(jump_args[i])
- d[arg] = None
- return new_label_args, new_jump_args
-
def inline_short_preamble(self, jump_args, short_inputargs, short_ops,
short_jump_op, patchguardop):
try:
@@ -318,13 +323,13 @@
class UnrollInfo(LoopInfo):
""" A state after optimizing the peeled loop, contains the following:
- * short_preamble - list of operations that go into short preamble
- * label_args - additional things to put in the label
+ * target_token - generated target token
+ * label_args - label operations at the beginning
* extra_same_as - list of extra same as to add at the end of the preamble
"""
- def __init__(self, short_preamble, label_args, extra_same_as):
- self.short_preamble = short_preamble
- self.label_args = label_args
+ def __init__(self, target_token, label_op, extra_same_as):
+ self.target_token = target_token
+ self.label_op = label_op
self.extra_same_as = extra_same_as
def final(self):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -133,12 +133,18 @@
if box is not None:
fieldbox = opinfo._fields[self.fielddescrs[i].get_index()]
# must be there
- fieldinfo = get_forwarded(fieldbox)
+ if fieldbox is not None:
+ fieldinfo = get_forwarded(fieldbox)
+ else:
+ fieldinfo = None
else:
fieldbox = None
fieldinfo = None
- self.fieldstate[i].generate_guards(other.fieldstate[i], fieldbox,
- fieldinfo, state)
+ # XXX all those ifs are for tests, not sure what to do
+ if self.fieldstate[i] is not None:
+ self.fieldstate[i].generate_guards(other.fieldstate[i],
+ fieldbox,
+ fieldinfo, state)
def _generalization_of_structpart(self, other):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit