[pypy-commit] pypy jit-limit_peeling: only skipp peeling if the optimized peeled trace have more than max_retrace_guards guards

hakanardo noreply at buildbot.pypy.org
Sat Aug 20 09:53:37 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-limit_peeling
Changeset: r46654:59a84d988cdb
Date: 2011-08-20 09:28 +0200
http://bitbucket.org/pypy/pypy/changeset/59a84d988cdb/

Log:	only skipp peeling if the optimized peeled trace have more than
	max_retrace_guards guards

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
@@ -205,7 +205,9 @@
             short = self.inline(inputargs, self.cloned_operations,
                                 loop.inputargs, short_inputargs,
                                 virtual_state)
-            if not virtual_state.contains_virtuals():
+
+            maxguards = self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.max_retrace_guards
+            if not virtual_state.contains_virtuals() and self.optimizer.emitted_guards > maxguards:
                 ops_in_loop = len(self.optimizer.newoperations)
                 ops_in_preamble = len(loop.preamble.operations) + 1
                 amount_saved = ((ops_in_preamble - ops_in_loop) * 100) / ops_in_preamble
@@ -225,7 +227,6 @@
             loop.preamble.operations.append(jmp)
 
             loop.operations = self.optimizer.newoperations
-            maxguards = self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.max_retrace_guards
             
             if self.optimizer.emitted_guards > maxguards:
                 loop.preamble.token.retraced_count = sys.maxint
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
@@ -2622,6 +2622,7 @@
         myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'a'])
 
         def f(n, limit):
+            myjitdriver.set_param('limit_peeling', -1)
             myjitdriver.set_param('retrace_limit', 3)
             myjitdriver.set_param('max_retrace_guards', limit)
             sa = i = a = 0
@@ -2640,8 +2641,9 @@
     def test_limit_peeling(self):
         myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'a'])
 
-        def f(n, limit):
+        def f(n, limit, maxguards):
             myjitdriver.set_param('limit_peeling', limit)
+            myjitdriver.set_param('max_retrace_guards', maxguards)
             sa = i = 0
             a = n + 1
             while i < n:
@@ -2649,12 +2651,14 @@
                 sa += a * a
                 i += 1
             return sa
-        assert self.meta_interp(f, [20, 0]) == f(20, 0)
+        assert self.meta_interp(f, [20, 0, 0]) == f(20, 0, 0)
         self.check_tree_loop_count(2)
-        assert self.meta_interp(f, [20, 10]) == f(20, 10)
+        assert self.meta_interp(f, [20, 10, 0]) == f(20, 10, 0)
         self.check_tree_loop_count(2)
-        assert self.meta_interp(f, [20, 20]) == f(20, 20)
+        assert self.meta_interp(f, [20, 20, 0]) == f(20, 20, 0)
         self.check_tree_loop_count(1)
+        assert self.meta_interp(f, [20, 20, 10]) == f(20, 20, 10)
+        self.check_tree_loop_count(2)
 
 
     def test_retrace_limit_with_extra_guards(self):


More information about the pypy-commit mailing list