Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r79163:a747291d1194 Date: 2015-08-23 18:23 +0200 http://bitbucket.org/pypy/pypy/changeset/a747291d1194/
Log: fix some more tests 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,4 +1,5 @@ +import sys from rpython.jit.metainterp.history import Const from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\ ShortPreambleBuilder, PreambleOp @@ -9,6 +10,7 @@ VirtualStateConstructor, VirtualStatesCantMatch) from rpython.jit.metainterp.resoperation import rop, ResOperation, GuardResOp from rpython.jit.metainterp import compile +from rpython.rlib.debug import debug_print class UnrollableOptimizer(Optimizer): def force_op_from_preamble(self, preamble_op): @@ -142,20 +144,41 @@ jump_op = operations[-1] cell_token = jump_op.getdescr() if not inline_short_preamble or len(cell_token.target_tokens) == 1: - assert cell_token.target_tokens[0].virtual_state is None - jump_op = jump_op.copy_and_change(rop.JUMP, - descr=cell_token.target_tokens[0]) - self.optimizer.send_extra_operation(jump_op) - return info, self.optimizer._newoperations[:] + return self.jump_to_preamble(cell_token, jump_op, info) vs = self.jump_to_existing_trace(jump_op, inline_short_preamble) if vs is None: return info, self.optimizer._newoperations[:] + warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc + limit = warmrunnerdescr.memory_manager.retrace_limit + if cell_token.retraced_count < limit: + cell_token.retraced_count += 1 + debug_print('Retracing (%d/%d)' % (cell_token.retraced_count, limit)) + else: + debug_print("Retrace count reached, jumping to preamble") + return self.jump_to_preamble(cell_token, jump_op, info) + maxguards = warmrunnerdescr.memory_manager.max_retrace_guards + guard_count = 0 + for op in self.optimizer._newoperations: + if op.is_guard(): + guard_count += 1 + if guard_count > maxguards: + target_token = cell_token.target_tokens[0] + target_token.targeting_jitcell_token.retraced_count = sys.maxint + return self.jump_to_preamble(cell_token, jump_op, info) exported_state = self.export_state(start_label, operations[-1].getarglist(), info.inputargs) self.optimizer._clean_optimization_info(self.optimizer._newoperations) return exported_state, self.optimizer._newoperations + 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, + descr=cell_token.target_tokens[0]) + self.optimizer.send_extra_operation(jump_op) + return info, self.optimizer._newoperations[:] + + def jump_to_existing_trace(self, jump_op, inline_short_preamble): jitcelltoken = jump_op.getdescr() args = [self.get_box_replacement(op) for op in jump_op.getarglist()] 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 @@ -2,8 +2,8 @@ from rpython.jit.metainterp.history import (ConstInt, Const, ConstPtr, ConstFloat) from rpython.jit.metainterp.optimizeopt import info -from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded,\ - ConstIntBound, MININT, MAXINT +from rpython.jit.metainterp.optimizeopt.intutils import \ + ConstIntBound, MININT, MAXINT, IntBound from rpython.jit.metainterp.resoperation import rop, ResOperation,\ AbstractInputArg from rpython.rlib.debug import debug_start, debug_stop, debug_print @@ -325,11 +325,12 @@ # XXX strings? self.lenbound = info.getlenbound(None) elif type == 'i': - if info.lower < MININT / 2: - info.lower = MININT - if info.upper > MAXINT / 2: - info.upper = MAXINT - self.intbound = info + if isinstance(info, IntBound): + if info.lower < MININT / 2: + info.lower = MININT + if info.upper > MAXINT / 2: + info.upper = MAXINT + self.intbound = info def is_const(self): return self.constbox is not None diff --git a/rpython/jit/metainterp/test/test_ajit.py b/rpython/jit/metainterp/test/test_ajit.py --- a/rpython/jit/metainterp/test/test_ajit.py +++ b/rpython/jit/metainterp/test/test_ajit.py @@ -2767,9 +2767,8 @@ return i # seen = [] - def my_optimize_trace(metainterp_sd, jitdriver_sd, loop, enable_opts, - *args, **kwds): - seen.append('unroll' in enable_opts) + def my_optimize_trace(metainterp_sd, jitdriver_sd, data): + seen.append('unroll' in data.enable_opts) raise InvalidLoop old_optimize_trace = optimizeopt.optimize_trace optimizeopt.optimize_trace = my_optimize_trace @@ -3011,7 +3010,7 @@ return a[0].intvalue res = self.meta_interp(f, [100]) assert res == -2 - self.check_resops(setarrayitem_gc=2, getarrayitem_gc=1) + self.check_resops(setarrayitem_gc=2, getarrayitem_gc_r=1) def test_continue_tracing_with_boxes_in_start_snapshot_replaced_by_optimizer(self): myjitdriver = JitDriver(greens = [], reds = ['sa', 'n', 'a', 'b']) @@ -3307,7 +3306,7 @@ lock.release() return n res = self.meta_interp(f, [10, 1]) - self.check_resops(getfield_gc=4) + self.check_resops(getfield_gc_i=4) assert res == f(10, 1) def test_jit_merge_point_with_raw_pointer(self): @@ -3371,10 +3370,10 @@ res = self.meta_interp(main, [0, 10, 2], enable_opts='') assert res == main(0, 10, 2) - self.check_resops(call=1) + self.check_resops(call_i=1) res = self.meta_interp(main, [1, 10, 2], enable_opts='') assert res == main(1, 10, 2) - self.check_resops(call=0) + self.check_resops(call_i=0) def test_look_inside_iff_const_float(self): @look_inside_iff(lambda arg: isconstant(arg)) @@ -3393,7 +3392,7 @@ res = self.meta_interp(main, [10], enable_opts='') assert res == 5.0 - self.check_resops(call=1) + self.check_resops(call_f=1) def test_look_inside_iff_virtual(self): # There's no good reason for this to be look_inside_iff, but it's a test! @@ -3418,10 +3417,10 @@ i += f(A(2), n) res = self.meta_interp(main, [0], enable_opts='') assert res == main(0) - self.check_resops(call=1, getfield_gc=0) + self.check_resops(call_i=1, getfield_gc_i=0) res = self.meta_interp(main, [1], enable_opts='') assert res == main(1) - self.check_resops(call=0, getfield_gc=0) + self.check_resops(call_i=0, getfield_gc_i=0) def test_isvirtual_call_assembler(self): driver = JitDriver(greens = ['code'], reds = ['n', 's']) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit