[pypy-svn] pypy jit-str_in_preamble: workaround allowing the unrolling to fail and produce a preamble calling itself instead of chrasing

hakanardo commits-noreply at bitbucket.org
Sat Mar 26 11:41:39 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-str_in_preamble
Changeset: r42962:5a9236876435
Date: 2011-03-26 11:41 +0100
http://bitbucket.org/pypy/pypy/changeset/5a9236876435/

Log:	workaround allowing the unrolling to fail and produce a preamble
	calling itself instead of chrasing

diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -267,9 +267,17 @@
             virtual_state = modifier.get_virtual_state(jump_args)
 
             loop.preamble.operations = self.optimizer.newoperations
+            preamble_optimizer = self.optimizer
             self.optimizer = self.optimizer.reconstruct_for_next_iteration(jump_args)
-            inputargs = self.inline(self.cloned_operations,
-                                    loop.inputargs, jump_args)
+            try:
+                inputargs = self.inline(self.cloned_operations,
+                                        loop.inputargs, jump_args)
+            except KeyError:
+                debug_print("Unrolling failed.")
+                loop.preamble.operations = None
+                jumpop.initarglist(jump_args)
+                preamble_optimizer.send_extra_operation(jumpop)
+                return
             loop.inputargs = inputargs
             jmp = ResOperation(rop.JUMP, loop.inputargs[:], None)
             jmp.setdescr(loop.token)

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
@@ -199,7 +199,10 @@
 
         print
         print loop.preamble.inputargs
-        print '\n'.join([str(o) for o in loop.preamble.operations])
+        if loop.preamble.operations:
+            print '\n'.join([str(o) for o in loop.preamble.operations])
+        else:
+            print 'Failed!'
         print
         print loop.inputargs
         print '\n'.join([str(o) for o in loop.operations])
@@ -5101,7 +5104,8 @@
         i4 = int_sub(i2, i1)
         jump(p1, i1, i2, i4)
         """
-        self.optimize_strunicode_loop(ops, expected, expected)
+        #self.optimize_strunicode_loop(ops, expected, expected)
+        self.optimize_loop(ops, expected)
 
     def test_str_slice_len_surviving2(self):
         ops = """
@@ -5119,7 +5123,7 @@
         escape(i5)
         i4 = int_sub(i2, i1)
         setfield_gc(p2, i4, descr=valuedescr)
-        jump(p1, i1, i2, p2, i4)
+        jump(p1, i1, i2, p2)
         """
         expected = """
         [p1, i1, i2, p2, i5]
@@ -5127,7 +5131,8 @@
         setfield_gc(p2, i5, descr=valuedescr)
         jump(p1, i1, i2, p2, i5)
         """
-        self.optimize_strunicode_loop(ops, expected, preamble)
+        #self.optimize_strunicode_loop(ops, expected, preamble)
+        self.optimize_loop(ops, preamble)
 
     def test_str_slice_1(self):
         ops = """

diff --git a/pypy/jit/metainterp/test/test_string.py b/pypy/jit/metainterp/test/test_string.py
--- a/pypy/jit/metainterp/test/test_string.py
+++ b/pypy/jit/metainterp/test/test_string.py
@@ -323,6 +323,20 @@
         self.meta_interp(f, [6, 7])
         self.check_loops(newstr=0, newunicode=0)
 
+    def test_str_slice_len_surviving(self):
+        _str = self._str
+        longstring = _str("Unrolling Trouble")
+        mydriver = JitDriver(reds = ['i', 'a', 'sa'], greens = []) 
+        def f(a):
+            i = sa = a
+            while i < len(longstring):
+                mydriver.jit_merge_point(i=i, a=a, sa=sa)
+                assert a >= 0 and i >= 0
+                i = len(longstring[a:i+1])
+                sa += i
+            return sa
+        assert self.meta_interp(f, [0]) == f(0)
+
 
 #class TestOOtype(StringTests, OOJitMixin):
 #    CALL = "oosend"


More information about the Pypy-commit mailing list