[pypy-svn] pypy out-of-line-guards: in-progress
fijal
commits-noreply at bitbucket.org
Fri Dec 31 10:32:38 CET 2010
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: out-of-line-guards
Changeset: r40306:df2873ee7cf7
Date: 2010-12-31 11:24 +0200
http://bitbucket.org/pypy/pypy/changeset/df2873ee7cf7/
Log: in-progress
diff --git a/pypy/jit/metainterp/test/test_outofline.py b/pypy/jit/metainterp/test/test_outofline.py
--- a/pypy/jit/metainterp/test/test_outofline.py
+++ b/pypy/jit/metainterp/test/test_outofline.py
@@ -144,7 +144,6 @@
assert self.meta_interp(f, []) == f()
def test_jit_invariant_invalidate_call_asm(self):
- py.test.skip("Fails")
myjitdriver1 = JitDriver(greens=[], reds=['n', 'a'])
myjitdriver2 = JitDriver(greens=['g'], reds=['r', 'a'])
diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -497,8 +497,15 @@
prev.address)
if x:
x.invalidated = True
- llimpl.mark_as_invalid(
- x.compiled_loop_token.compiled_version)
+ compiled = x.compiled_loop_token.compiled_version
+ llimpl.mark_as_invalid(compiled)
+ for elem in x._back_looptokens:
+ token = elem()
+ if token:
+ tk = token.compiled_loop_token.compiled_version
+ llimpl.invalidate_call_asm(tk,
+ x.compiled_loop_token)
+
next = next.next
return invalidate_asm
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
@@ -1,4 +1,5 @@
+import weakref
from pypy.rpython.extregistry import ExtRegistryEntry
from pypy.rpython.lltypesystem import lltype, llmemory, rffi
from pypy.rpython.ootypesystem import ootype
@@ -759,9 +760,12 @@
def __init__(self):
# For memory management of assembled loops
self._keepalive_target_looktokens = {} # set of other LoopTokens
+ self._back_looptokens = []
+ # the reverse of the _keepalive_target_looktokens dict
def record_jump_to(self, target_loop_token):
self._keepalive_target_looktokens[target_loop_token] = None
+ target_loop_token._back_looptokens.append(weakref.ref(self))
def __repr__(self):
return '<Loop %d, gen=%d>' % (self.number, self.generation)
diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -305,6 +305,22 @@
_mark_as_invalid(op.jump_target)
loop.invalidated = True
+def invalidate_call_asm(from_loop, ctl):
+ from_loop = _from_opaque(from_loop)
+ _invalidate_call_asm(from_loop, ctl)
+
+def _invalidate_call_asm(from_loop, ctl):
+ for op in from_loop.operations:
+ if op.opnum == rop.CALL_ASSEMBLER or op.opnum == rop.JUMP:
+ if op.descr is None:
+ continue
+ call_target = op.descr().compiled_loop_token
+ if call_target is ctl:
+ import pdb
+ pdb.set_trace()
+ if op.is_guard() and op.jump_target is not None:
+ _invalidate_call_asm(op.jump_target, to_loop)
+
def compile_start_int_var(loop):
return compile_start_ref_var(loop, lltype.Signed)
@@ -1655,6 +1671,7 @@
setannotation(compile_redirect_fail, annmodel.s_None)
setannotation(mark_as_free, annmodel.s_None)
setannotation(mark_as_invalid, annmodel.s_None)
+setannotation(invalidate_call_asm, annmodel.s_None)
setannotation(new_frame, s_Frame)
setannotation(frame_clear, annmodel.s_None)
More information about the Pypy-commit
mailing list