Author: Hakan Ardo <[email protected]>
Branch: jit-usable_retrace_3
Changeset: r57200:e0dc044a7187
Date: 2012-09-07 07:45 +0200
http://bitbucket.org/pypy/pypy/changeset/e0dc044a7187/

Log:    test fallback and some cleanups

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
@@ -232,6 +232,8 @@
         assert isinstance(target_token, TargetToken)
         assert loop_jitcell_token.target_tokens
         loop_jitcell_token.target_tokens.append(target_token)
+        if target_token.short_preamble:
+            metainterp_sd.logger_ops.log_short_preamble([], 
target_token.short_preamble)
 
         preamble.operations = [orignial_label] + \
                               [ResOperation(rop.JUMP, 
original_target_token.exported_state.jump_args,
@@ -251,15 +253,8 @@
             if a1 is not a2:
                 preamble.operations.append(ResOperation(rop.SAME_AS, [a1], a2))
 
-        #loop.operations = []
-
     except InvalidLoop:
-        # Fall back on jumping to preamble
-        target_token = label.getdescr()
-        assert isinstance(target_token, TargetToken)
-        assert target_token.exported_state
-        target_token.exported_state.generalize_virtual_state = None
-        # FIXME: Test
+        original_target_token.short_preamble = original_short_preamble
         preamble.operations = [orignial_label] + \
                               [ResOperation(rop.JUMP, inputargs[:],
                                             None, descr=loop_jitcell_token)]
@@ -267,22 +262,19 @@
         try:
             optimize_trace(metainterp_sd, preamble, 
jitdriver_sd.warmstate.enable_opts,
                            inline_short_preamble=False)
-            
         except InvalidLoop:
             return None
+        else:
+            target_token = preamble.operations[0].getdescr()
+            assert isinstance(target_token, TargetToken)
+            assert loop_jitcell_token.target_tokens
+            loop_jitcell_token.target_tokens.append(target_token)
 
     trace = partial_trace
     trace.operations = partial_trace.operations[:-1] + preamble.operations + 
loop.operations
     loop = trace # FIXME: rename
 
     assert loop.operations[-1].getopnum() != rop.LABEL
-    # FIXME: done above
-    target_token = label.getdescr()
-    assert isinstance(target_token, TargetToken)
-    assert loop_jitcell_token.target_tokens
-    loop_jitcell_token.target_tokens.append(target_token) # FIXME: register 
all labels
-    if target_token.short_preamble:
-        metainterp_sd.logger_ops.log_short_preamble([], 
target_token.short_preamble)
 
 
     quasi_immutable_deps = {}
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
@@ -3064,7 +3064,21 @@
         assert res == f(10)
         self.check_resops(new_with_vtable=0)
         self.check_retraced_simple_loop(2, getfield_gc=0)
-
+    
+    def test_retrace_failure_fallback(self):
+        myjitdriver = JitDriver(greens = [], reds = ['n', 'a', 'sa'])        
+        def f(n):
+            sa = a = 0
+            while n:
+                a = hint(a, promote=True)
+                myjitdriver.jit_merge_point(n=n, a=a, sa=sa)
+                sa += a
+                n = n - 1
+                if n < 5:
+                    a += 1
+
+        res = self.meta_interp(f, [10])
+        assert res == f(10)
 
 
 class TestOOtype(BasicTests, OOJitMixin):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to