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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit