[pypy-commit] pypy guard-value-limit: (arigo, remi) make cut-off limit configurable

Raemi pypy.commits at gmail.com
Sat Mar 24 11:53:53 EDT 2018


Author: Remi Meier <remi.meier at gmail.com>
Branch: guard-value-limit
Changeset: r94130:3cb72c044ec2
Date: 2018-03-24 16:52 +0100
http://bitbucket.org/pypy/pypy/changeset/3cb72c044ec2/

Log:	(arigo, remi) make cut-off limit configurable

diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1215,9 +1215,13 @@
 
     @arguments("box", "orgpc")
     def _opimpl_guard_value(self, box, orgpc):
-        if self.metainterp.guard_value_counter <= 4:
-            return self.implement_guard_value(box, orgpc)
-        return box
+        limit = self.metainterp.jitdriver_sd.warmstate.guard_value_limit
+        if box is self.metainterp.not_guarded_value_box or self.metainterp.guard_value_counter > limit:
+            # limit reached or guard on the same box as the first elided guard_value
+            self.metainterp.not_guarded_value_box = box
+            return box
+
+        return self.implement_guard_value(box, orgpc)
 
     @arguments("box", "box", "descr", "orgpc")
     def opimpl_str_guard_value(self, box, funcbox, descr, orgpc):
@@ -2432,6 +2436,7 @@
         # specialize this function and a few other ones for the '*args'.
         debug_start('jit-tracing')
         self.guard_value_counter = 0
+        self.not_guarded_value_box = None
         self.staticdata._setup_once()
         self.staticdata.profiler.start_tracing()
         assert jitdriver_sd is self.jitdriver_sd
@@ -2465,6 +2470,7 @@
         key = resumedescr.get_resumestorage()
         assert isinstance(key, compile.ResumeGuardDescr)
         self.guard_value_counter = key.guard_value_counter + 1
+        self.not_guarded_value_box = None
         # store the resumekey.wref_original_loop_token() on 'self' to make
         # sure that it stays alive as long as this MetaInterp
         self.resumekey_original_loop_token = resumedescr.rd_loop_token.loop_token_wref()
diff --git a/rpython/jit/metainterp/warmspot.py b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -92,6 +92,7 @@
                     disable_unrolling=sys.maxint,
                     enable_opts=ALL_OPTS_NAMES, max_retrace_guards=15,
                     max_unroll_recursion=7, vec=0, vec_all=0, vec_cost=0,
+                    guard_value_limit=4,
                     **kwds):
     from rpython.config.config import ConfigError
     translator = interp.typer.annotator.translator
@@ -119,6 +120,7 @@
         jd.warmstate.set_param_vec(vec)
         jd.warmstate.set_param_vec_all(vec_all)
         jd.warmstate.set_param_vec_cost(vec_cost)
+        jd.warmstate.set_param_guard_value_limit(guard_value_limit)
     warmrunnerdesc.finish()
     if graph_and_interp_only:
         return interp, graph
diff --git a/rpython/jit/metainterp/warmstate.py b/rpython/jit/metainterp/warmstate.py
--- a/rpython/jit/metainterp/warmstate.py
+++ b/rpython/jit/metainterp/warmstate.py
@@ -318,6 +318,9 @@
     def set_param_vec_cost(self, ivalue):
         self.vec_cost = ivalue
 
+    def set_param_guard_value_limit(self, ivalue):
+        self.guard_value_limit = ivalue
+
     def disable_noninlinable_function(self, greenkey):
         cell = self.JitCell.ensure_jit_cell_at_key(greenkey)
         cell.flags |= JC_DONT_TRACE_HERE
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -561,6 +561,7 @@
     'vec_cost': 'threshold for which traces to bail. Unpacking increases the counter,'\
                 ' vector operation decrease the cost',
     'vec_all': 'try to vectorize trace loops that occur outside of the numpypy library',
+    'guard_value_limit': 'limits the chain of guard_values coming from a single guard_value',
 }
 
 PARAMETERS = {'threshold': 1039, # just above 1024, prime
@@ -579,6 +580,7 @@
               'vec': 0,
               'vec_all': 0,
               'vec_cost': 0,
+              'guard_value_limit': 4,
               }
 unroll_parameters = unrolling_iterable(PARAMETERS.items())
 


More information about the pypy-commit mailing list