[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