Author: Hakan Ardo <ha...@debian.org> Branch: jit-short_from_state Changeset: r44364:948933beb2f9 Date: 2011-05-22 10:20 +0200 http://bitbucket.org/pypy/pypy/changeset/948933beb2f9/
Log: hg merge default diff --git a/pypy/jit/codewriter/jitcode.py b/pypy/jit/codewriter/jitcode.py --- a/pypy/jit/codewriter/jitcode.py +++ b/pypy/jit/codewriter/jitcode.py @@ -100,6 +100,9 @@ def __repr__(self): return '<JitCode %r>' % self.name + def _clone_if_mutable(self): + raise NotImplementedError + class MissingLiveness(Exception): pass @@ -111,6 +114,9 @@ dict = getattr(self, 'dict', '?') return '<SwitchDictDescr %s>' % (dict,) + def _clone_if_mutable(self): + raise NotImplementedError + class LiveVarsInfo(object): def __init__(self, live_i, live_r, live_f): diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py --- a/pypy/jit/metainterp/compile.py +++ b/pypy/jit/metainterp/compile.py @@ -97,7 +97,7 @@ history = metainterp.history loop = create_empty_loop(metainterp) - loop.inputargs = history.inputargs + loop.inputargs = history.inputargs[:] for box in loop.inputargs: assert isinstance(box, Box) # make a copy, because optimize_loop can mutate the ops and descrs @@ -600,7 +600,7 @@ # Attempt to use optimize_bridge(). This may return None in case # it does not work -- i.e. none of the existing old_loop_tokens match. new_loop = create_empty_loop(metainterp) - new_loop.inputargs = metainterp.history.inputargs + new_loop.inputargs = metainterp.history.inputargs[:] # clone ops, as optimize_bridge can mutate the ops new_loop.operations = [op.clone() for op in metainterp.history.operations] metainterp_sd = metainterp.staticdata diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py --- a/pypy/jit/metainterp/history.py +++ b/pypy/jit/metainterp/history.py @@ -788,7 +788,6 @@ def dump(self): self.compiled_loop_token.cpu.dump_loop_token(self) - class TreeLoop(object): inputargs = None operations = None @@ -958,7 +957,7 @@ compiled_count = 0 enter_count = 0 aborted_count = 0 - history = None + operations = None def __init__(self): self.loops = [] @@ -966,7 +965,7 @@ self.aborted_keys = [] def set_history(self, history): - self.history = history + self.operations = history.operations def aborted(self): self.aborted_count += 1 @@ -996,7 +995,7 @@ def check_history(self, expected=None, **check): insns = {} - for op in self.history.operations: + for op in self.operations: opname = op.getopname() insns[opname] = insns.get(opname, 0) + 1 if expected is not None: diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py --- a/pypy/jit/metainterp/optimizeopt/intbounds.py +++ b/pypy/jit/metainterp/optimizeopt/intbounds.py @@ -162,6 +162,9 @@ if self.nextop.getopnum() == rop.GUARD_NO_OVERFLOW: # Synthesize the non overflowing op for optimize_default to reuse self.pure(rop.INT_ADD, op.getarglist()[:], op.result) + # Synthesize the reverse op for optimize_default to reuse + self.pure(rop.INT_SUB, [op.result, op.getarg(1)], op.getarg(0)) + self.pure(rop.INT_SUB, [op.result, op.getarg(0)], op.getarg(1)) def optimize_INT_SUB_OVF(self, op): @@ -181,6 +184,10 @@ if self.nextop.getopnum() == rop.GUARD_NO_OVERFLOW: # Synthesize the non overflowing op for optimize_default to reuse self.pure(rop.INT_SUB, op.getarglist()[:], op.result) + # Synthesize the reverse ops for optimize_default to reuse + self.pure(rop.INT_ADD, [op.result, op.getarg(1)], op.getarg(0)) + self.pure(rop.INT_SUB, [op.getarg(0), op.result], op.getarg(1)) + def optimize_INT_MUL_OVF(self, op): v1 = self.getvalue(op.getarg(0)) diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py --- a/pypy/jit/metainterp/pyjitpl.py +++ b/pypy/jit/metainterp/pyjitpl.py @@ -1844,9 +1844,9 @@ else: self.compile(original_boxes, live_arg_boxes, start, resumedescr) # creation of the loop was cancelled! - #self.staticdata.log('cancelled, tracing more...') - self.staticdata.log('cancelled, stopping tracing') - raise SwitchToBlackhole(ABORT_BAD_LOOP) + self.staticdata.log('cancelled, tracing more...') + #self.staticdata.log('cancelled, stopping tracing') + #raise SwitchToBlackhole(ABORT_BAD_LOOP) # Otherwise, no loop found so far, so continue tracing. start = len(self.history.operations) @@ -1911,6 +1911,7 @@ def compile(self, original_boxes, live_arg_boxes, start, start_resumedescr): num_green_args = self.jitdriver_sd.num_green_args + original_inputargs = self.history.inputargs self.history.inputargs = original_boxes[num_green_args:] greenkey = original_boxes[:num_green_args] old_loop_tokens = self.get_compiled_merge_points(greenkey) @@ -1919,7 +1920,11 @@ greenkey, start, start_resumedescr) if loop_token is not None: # raise if it *worked* correctly self.set_compiled_merge_points(greenkey, old_loop_tokens) + self.history.inputargs = None + self.history.operations = None raise GenerateMergePoint(live_arg_boxes, loop_token) + + self.history.inputargs = original_inputargs self.history.operations.pop() # remove the JUMP # FIXME: Why is self.history.inputargs not restored? @@ -1936,10 +1941,12 @@ target_loop_token = compile.compile_new_bridge(self, old_loop_tokens, self.resumekey) - if target_loop_token is not None: # raise if it *worked* correctly - raise GenerateMergePoint(live_arg_boxes, target_loop_token) finally: self.history.operations.pop() # remove the JUMP + if target_loop_token is not None: # raise if it *worked* correctly + self.history.inputargs = None + self.history.operations = None + raise GenerateMergePoint(live_arg_boxes, target_loop_token) def compile_bridge_and_loop(self, original_boxes, live_arg_boxes, start, bridge_arg_boxes, start_resumedescr): @@ -1974,7 +1981,8 @@ assert False assert target_loop_token is not None - self.history.operations = original_operations + self.history.inputargs = None + self.history.operations = None raise GenerateMergePoint(live_arg_boxes, old_loop_tokens[0]) def compile_done_with_this_frame(self, exitbox): diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py --- a/pypy/jit/metainterp/test/test_ajit.py +++ b/pypy/jit/metainterp/test/test_ajit.py @@ -1898,7 +1898,7 @@ return a1.val + b1.val res = self.meta_interp(g, [3, 23]) assert res == 7068153 - self.check_loop_count(6) + self.check_loop_count(7) self.check_loops(guard_true=4, guard_class=0, int_add=2, int_mul=2, guard_false=2) @@ -2222,6 +2222,79 @@ return sa assert self.meta_interp(f, [10]) == f(10) + def test_inputarg_reset_bug(self): + ## j = 0 + ## while j < 100: + ## j += 1 + + ## c = 0 + ## j = 0 + ## while j < 2: + ## j += 1 + ## if c == 0: + ## c = 1 + ## else: + ## c = 0 + + ## j = 0 + ## while j < 100: + ## j += 1 + + def get_printable_location(i): + return str(i) + + myjitdriver = JitDriver(greens = ['i'], reds = ['j', 'c', 'a'], + get_printable_location=get_printable_location) + bytecode = "0j10jc20a3" + def f(): + myjitdriver.set_param('threshold', 7) + myjitdriver.set_param('trace_eagerness', 1) + i = j = c = a = 1 + while True: + myjitdriver.jit_merge_point(i=i, j=j, c=c, a=a) + if i >= len(bytecode): + break + op = bytecode[i] + if op == 'j': + j += 1 + elif op == 'c': + c = hint(c, promote=True) + c = 1 - c + elif op == '2': + if j < 3: + i -= 3 + myjitdriver.can_enter_jit(i=i, j=j, c=c, a=a) + elif op == '1': + k = j*a + if j < 100: + i -= 2 + a += k + myjitdriver.can_enter_jit(i=i, j=j, c=c, a=a) + else: + a += k*2 + elif op == '0': + j = c = a = 0 + elif op == 'a': + j += 1 + a += 1 + elif op == '3': + if a < 100: + i -= 2 + myjitdriver.can_enter_jit(i=i, j=j, c=c, a=a) + + else: + return ord(op) + i += 1 + return 42 + assert f() == 42 + def g(): + res = 1 + for i in range(10): + res = f() + return res + res = self.meta_interp(g, []) + assert res == 42 + def test_read_timestamp(self): import time from pypy.rlib.rtimer import read_timestamp diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py b/pypy/jit/metainterp/test/test_optimizeopt.py --- a/pypy/jit/metainterp/test/test_optimizeopt.py +++ b/pypy/jit/metainterp/test/test_optimizeopt.py @@ -4166,6 +4166,50 @@ jump(i4, i10) """ self.optimize_loop(ops, expected) + + def test_add_sub_ovf(self): + ops = """ + [i1] + i2 = int_add_ovf(i1, 1) + guard_no_overflow() [] + i3 = int_sub_ovf(i2, 1) + guard_no_overflow() [] + escape(i3) + jump(i2) + """ + expected = """ + [i1] + i2 = int_add_ovf(i1, 1) + guard_no_overflow() [] + escape(i1) + jump(i2) + """ + self.optimize_loop(ops, expected) + + def test_add_sub_ovf_virtual_unroll(self): + ops = """ + [p15] + i886 = getfield_gc_pure(p15, descr=valuedescr) + i888 = int_sub_ovf(i886, 1) + guard_no_overflow() [] + escape(i888) + i4360 = getfield_gc_pure(p15, descr=valuedescr) + i4362 = int_add_ovf(i4360, 1) + guard_no_overflow() [] + i4360p = int_sub_ovf(i4362, 1) + guard_no_overflow() [] + p4364 = new_with_vtable(ConstClass(node_vtable)) + setfield_gc(p4364, i4362, descr=valuedescr) + jump(p4364) + """ + expected = """ + [i0, i1] + escape(i1) + i2 = int_add_ovf(i0, 1) + guard_no_overflow() [] + jump(i2, i0) + """ + self.optimize_loop(ops, expected) def test_framestackdepth_overhead(self): ops = """ diff --git a/pypy/jit/metainterp/test/test_send.py b/pypy/jit/metainterp/test/test_send.py --- a/pypy/jit/metainterp/test/test_send.py +++ b/pypy/jit/metainterp/test/test_send.py @@ -204,7 +204,6 @@ # InvalidLoop condition, and was then unrolled, giving two copies # of the body in a single bigger loop with no failing guard except # the final one. - py.test.skip('dissabled "try to trace some more when compile fails"') self.check_loop_count(1) self.check_loops(guard_class=0, int_add=2, int_sub=2) @@ -231,6 +230,7 @@ return self.y w1 = W1(10) w2 = W2(20) + def f(x, y): if x & 1: w = w1 @@ -246,7 +246,6 @@ assert res == f(3, 28) res = self.meta_interp(f, [4, 28]) assert res == f(4, 28) - py.test.skip('dissabled "try to trace some more when compile fails"') self.check_loop_count(1) self.check_loops(guard_class=0, int_add=2, int_sub=2) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit