Author: fijal
Branch: jit-leaner-frontend
Changeset: r82849:91bcb43bca18
Date: 2016-03-07 18:04 +0200
http://bitbucket.org/pypy/pypy/changeset/91bcb43bca18/
Log: almost fix test_optimizeopt, two tests left
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
@@ -38,10 +38,13 @@
This is the case of label() ops label()
"""
- def __init__(self, trace, call_pure_results=None, enable_opts=None):
+ def __init__(self, trace, runtime_boxes, call_pure_results=None,
+ enable_opts=None):
self.enable_opts = enable_opts
self.trace = trace
self.call_pure_results = call_pure_results
+ assert runtime_boxes is not None
+ self.runtime_boxes = runtime_boxes
def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll):
from rpython.jit.metainterp.optimizeopt.unroll import (UnrollOptimizer,
@@ -50,6 +53,7 @@
if unroll:
opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
return opt.optimize_preamble(self.trace,
+ self.runtime_boxes,
self.call_pure_results,
self.box_names_memo)
else:
diff --git a/rpython/jit/metainterp/optimizeopt/info.py
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -114,7 +114,7 @@
assert self.get_last_guard(optimizer).is_guard()
def make_guards(self, op, short, optimizer):
- op = ResOperation(rop.GUARD_NONNULL, [op], None)
+ op = ResOperation(rop.GUARD_NONNULL, [op])
short.append(op)
class AbstractVirtualPtrInfo(NonNullPtrInfo):
@@ -592,7 +592,7 @@
def make_guards(self, op, short, optimizer):
AbstractVirtualPtrInfo.make_guards(self, op, short, optimizer)
c_type_id = ConstInt(self.descr.get_type_id())
- short.append(ResOperation(rop.GUARD_GC_TYPE, [op, c_type_id], None))
+ short.append(ResOperation(rop.GUARD_GC_TYPE, [op, c_type_id]))
if self.lenbound is not None:
lenop = ResOperation(rop.ARRAYLEN_GC, [op], descr=self.descr)
short.append(lenop)
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
@@ -396,7 +396,7 @@
arg.set_forwarded(None)
self.short.append(preamble_op)
if preamble_op.is_ovf():
- self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, [], None))
+ self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, []))
info = preamble_op.get_forwarded()
preamble_op.set_forwarded(None)
if optimizer is not None:
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
@@ -49,7 +49,6 @@
call_pure_results=None, expected_short=None,
jump_values=None):
loop = self.parse(ops)
- self.set_values(loop.operations, jump_values)
if expected != "crash!":
expected = self.parse(expected)
if expected_preamble:
@@ -58,7 +57,7 @@
# the short preamble doesn't have fail descrs, they are patched in
when it is used
expected_short = self.parse(expected_short, want_fail_descr=False)
- info = self.unroll_and_optimize(loop, call_pure_results)
+ info = self.unroll_and_optimize(loop, call_pure_results, jump_values)
preamble = info.preamble
preamble.check_consistency(check_descr=False)
@@ -873,7 +872,7 @@
jump(i1, p1, p3sub)
"""
self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.nodefulladdr, self.nodefulladdr, None])
+ jump_values=[None, self.nodefulladdr, self.nodefulladdr])
def test_dont_delay_setfields(self):
ops = """
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
@@ -570,18 +570,21 @@
op.position = newop.position
return trace
- def unroll_and_optimize(self, loop, call_pure_results=None):
+ def unroll_and_optimize(self, loop, call_pure_results=None,
+ jump_values=None):
self.add_guard_future_condition(loop)
jump_op = loop.operations[-1]
assert jump_op.getopnum() == rop.JUMP
celltoken = JitCellToken()
+ runtime_boxes = self.pack_into_boxes(jump_op, jump_values)
jump_op.setdescr(celltoken)
#start_label = ResOperation(rop.LABEL, loop.inputargs,
# descr=jump_op.getdescr())
#end_label = jump_op.copy_and_change(opnum=rop.LABEL)
call_pure_results = self._convert_call_pure_results(call_pure_results)
t = self.convert_loop_to_packed(loop)
- preamble_data = compile.LoopCompileData(t, call_pure_results)
+ preamble_data = compile.LoopCompileData(t, runtime_boxes,
+ call_pure_results)
start_state, preamble_ops = self._do_optimize_loop(preamble_data)
preamble_data.forget_optimization_info()
loop_data = compile.UnrolledLoopData(preamble_data.trace,
@@ -597,13 +600,16 @@
return Info(preamble, loop_info.target_token.short_preamble,
start_state.virtual_state)
- def set_values(self, ops, jump_values=None):
- jump_op = ops[-1]
+ def pack_into_boxes(self, jump_op, jump_values):
assert jump_op.getopnum() == rop.JUMP
+ r = []
if jump_values is not None:
+ assert len(jump_values) == len(jump_op.getarglist())
for i, v in enumerate(jump_values):
if v is not None:
- jump_op.getarg(i).setref_base(v)
+ r.append(InputArgRef(v))
+ else:
+ r.append(None)
else:
for i, box in enumerate(jump_op.getarglist()):
if box.type == 'r' and not box.is_constant():
@@ -611,9 +617,10 @@
# object here. If you need something different, you
# need to pass a 'jump_values' argument to e.g.
# optimize_loop()
- box.setref_base(self.nodefulladdr)
-
-
+ r.append(InputArgRef(self.nodefulladdr))
+ else:
+ r.append(None)
+ return r
class FakeDescr(compile.ResumeGuardDescr):
def clone_if_mutable(self):
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
@@ -121,11 +121,12 @@
if check_newops:
assert not self.optimizer._newoperations
- def optimize_preamble(self, trace, call_pure_results, memo):
+ def optimize_preamble(self, trace, runtime_boxes, call_pure_results, memo):
info, newops = self.optimizer.propagate_all_forward(trace.get_iter(),
call_pure_results, flush=False)
exported_state = self.export_state(info.jump_op.getarglist(),
- info.inputargs, memo)
+ info.inputargs,
+ runtime_boxes, memo)
exported_state.quasi_immutable_deps = info.quasi_immutable_deps
# we need to absolutely make sure that we've cleaned up all
# the optimization info
@@ -182,13 +183,14 @@
self.optimizer._newoperations)
try:
- new_virtual_state = self.jump_to_existing_trace(end_jump, label_op)
+ new_virtual_state = self.jump_to_existing_trace(end_jump, label_op,
+
state.runtime_boxes)
except InvalidLoop:
# inlining short preamble failed, jump to preamble
self.jump_to_preamble(celltoken, end_jump, info)
return (UnrollInfo(target_token, label_op, extra_same_as,
self.optimizer.quasi_immutable_deps),
- self.optimizer._newoperations)
+ self.optimizer._newoperations)
if new_virtual_state is not None:
self.jump_to_preamble(celltoken, end_jump, info)
return (UnrollInfo(target_token, label_op, extra_same_as,
@@ -286,7 +288,7 @@
return info, self.optimizer._newoperations[:]
- def jump_to_existing_trace(self, jump_op, label_op):
+ def jump_to_existing_trace(self, jump_op, label_op, runtime_boxes):
jitcelltoken = jump_op.getdescr()
assert isinstance(jitcelltoken, JitCellToken)
virtual_state = self.get_virtual_state(jump_op.getarglist())
@@ -297,7 +299,7 @@
continue
try:
extra_guards = target_virtual_state.generate_guards(
- virtual_state, args, jump_op.getarglist(), self.optimizer)
+ virtual_state, args, runtime_boxes, self.optimizer)
patchguardop = self.optimizer.patchguardop
for guard in extra_guards.extra_guards:
if isinstance(guard, GuardResOp):
@@ -407,7 +409,8 @@
continue
self._expand_info(item, infos)
- def export_state(self, original_label_args, renamed_inputargs, memo):
+ def export_state(self, original_label_args, renamed_inputargs,
+ runtime_boxes, memo):
end_args = [self.optimizer.force_box_for_end_of_preamble(a)
for a in original_label_args]
self.optimizer.flush()
@@ -431,7 +434,7 @@
self.optimizer._clean_optimization_info(end_args)
return ExportedState(label_args, end_args, virtual_state, infos,
short_boxes, renamed_inputargs,
- short_inputargs, memo)
+ short_inputargs, runtime_boxes, memo)
def import_state(self, targetargs, exported_state):
# the mapping between input args (from old label) and what we need
@@ -492,11 +495,13 @@
* renamed_inputargs - the start label arguments in optimized version
* short_inputargs - the renamed inputargs for short preamble
* quasi_immutable_deps - for tracking quasi immutables
+ * runtime_boxes - runtime values for boxes, necessary when generating
+ guards to jump to
"""
def __init__(self, end_args, next_iteration_args, virtual_state,
exported_infos, short_boxes, renamed_inputargs,
- short_inputargs, memo):
+ short_inputargs, runtime_boxes, memo):
self.end_args = end_args
self.next_iteration_args = next_iteration_args
self.virtual_state = virtual_state
@@ -504,6 +509,7 @@
self.short_boxes = short_boxes
self.renamed_inputargs = renamed_inputargs
self.short_inputargs = short_inputargs
+ self.runtime_boxes = runtime_boxes
self.dump(memo)
def dump(self, memo):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit