Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: disable-unroll-for-short-loops
Changeset: r77918:bdf385bc3c7c
Date: 2015-06-05 18:57 +0200
http://bitbucket.org/pypy/pypy/changeset/bdf385bc3c7c/

Log:    an attempt to disable unrolling if we hit a certain threshold

diff --git a/rpython/jit/metainterp/compile.py 
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -103,6 +103,35 @@
 
 # ____________________________________________________________
 
+
+def disable_unrolling_if_loop_too_long(loop, metainterp):
+    threshold = metainterp.jitdriver_sd.warmstate.disable_unrolling_threshold
+    if len(loop.operations) < threshold:
+        return False
+    # now we need to patch label, like in simplify.py
+    last_op = loop.operations[-1]
+    descr = last_op.getdescr()
+    assert isinstance(descr, TargetToken)
+    descr = descr.targeting_jitcell_token
+    assert isinstance (descr, JitCellToken)
+    last_op = last_op.copy_and_change(rop.JUMP)
+    if not descr.target_tokens:
+        # fish the first label
+        for op in loop.operations:
+            if op.getopnum() == rop.LABEL:
+                target_token = op.getdescr()
+                break
+        else:
+            assert False, "can't find a label"
+        assert isinstance(target_token, TargetToken)
+        assert target_token.targeting_jitcell_token is descr
+        last_op.setdescr(target_token)
+    else:
+        assert len(descr.target_tokens) == 1
+        last_op.setdescr(descr.target_tokens[0])
+    loop.operations[-1] = last_op
+    return True
+
 def compile_loop(metainterp, greenkey, start,
                  inputargs, jumpargs,
                  full_preamble_needed=True,
@@ -148,27 +177,28 @@
     if part.quasi_immutable_deps:
         loop.quasi_immutable_deps.update(part.quasi_immutable_deps)
     if part.operations[-1].getopnum() == rop.LABEL:
-        inliner = Inliner(inputargs, jumpargs)
-        part.quasi_immutable_deps = None
-        part.operations = [part.operations[-1]] + \
-                          [inliner.inline_op(h_ops[i]) for i in range(start, 
len(h_ops))] + \
-                          [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a 
in jumpargs],
-                                        None, descr=jitcell_token)]
-        target_token = part.operations[0].getdescr()
-        assert isinstance(target_token, TargetToken)
-        all_target_tokens.append(target_token)
-        inputargs = jumpargs
-        jumpargs = part.operations[-1].getarglist()
+        if not disable_unrolling_if_loop_too_long(part, metainterp):
+            inliner = Inliner(inputargs, jumpargs)
+            part.quasi_immutable_deps = None
+            part.operations = [part.operations[-1]] + \
+                              [inliner.inline_op(h_ops[i]) for i in 
range(start, len(h_ops))] + \
+                              [ResOperation(rop.JUMP, [inliner.inline_arg(a) 
for a in jumpargs],
+                                            None, descr=jitcell_token)]
+            target_token = part.operations[0].getdescr()
+            assert isinstance(target_token, TargetToken)
+            all_target_tokens.append(target_token)
+            inputargs = jumpargs
+            jumpargs = part.operations[-1].getarglist()
 
-        try:
-            optimize_trace(metainterp_sd, jitdriver_sd, part, enable_opts,
-                           start_state=start_state, export_state=False)
-        except InvalidLoop:
-            return None
+            try:
+                optimize_trace(metainterp_sd, jitdriver_sd, part, enable_opts,
+                               start_state=start_state, export_state=False)
+            except InvalidLoop:
+                return None
 
-        loop.operations = loop.operations[:-1] + part.operations
-        if part.quasi_immutable_deps:
-            loop.quasi_immutable_deps.update(part.quasi_immutable_deps)
+            loop.operations = loop.operations[:-1] + part.operations
+            if part.quasi_immutable_deps:
+                loop.quasi_immutable_deps.update(part.quasi_immutable_deps)
     assert part.operations[-1].getopnum() != rop.LABEL
 
     if not loop.quasi_immutable_deps:
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
@@ -256,6 +256,9 @@
     def set_param_inlining(self, value):
         self.inlining = value
 
+    def set_param_disable_unrolling(self, value):
+        self.disable_unrolling_threshold = value
+
     def set_param_enable_opts(self, value):
         from rpython.jit.metainterp.optimizeopt import ALL_OPTS_DICT, 
ALL_OPTS_NAMES
 
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -549,6 +549,7 @@
     'retrace_limit': 'how many times we can try retracing before giving up',
     'max_retrace_guards': 'number of extra guards a retrace can cause',
     'max_unroll_loops': 'number of extra unrollings a loop can cause',
+    'disable_unrolling': 'after how many operations we should not unroll',
     'enable_opts': 'INTERNAL USE ONLY (MAY NOT WORK OR LEAD TO CRASHES): '
                    'optimizations to enable, or all = %s' % ENABLE_ALL_OPTS,
     'max_unroll_recursion': 'how many levels deep to unroll a recursive 
function'
@@ -564,6 +565,7 @@
               'retrace_limit': 5,
               'max_retrace_guards': 15,
               'max_unroll_loops': 0,
+              'disable_unrolling': 1000,
               'enable_opts': 'all',
               'max_unroll_recursion': 7,
               }
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to