[pypy-commit] pypy jit-short_from_state: hg merge default
hakanardo
noreply at buildbot.pypy.org
Sun May 22 10:10:55 CEST 2011
Author: Hakan Ardo <hakan at 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)
More information about the pypy-commit
mailing list