[pypy-commit] pypy rewrite-unrolling: (arigo) Forgot to add this file
fijal
noreply at buildbot.pypy.org
Sat Jan 10 21:52:27 CET 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: rewrite-unrolling
Changeset: r75292:ca6b329c8e25
Date: 2015-01-10 21:52 +0100
http://bitbucket.org/pypy/pypy/changeset/ca6b329c8e25/
Log: (arigo) Forgot to add this file
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -0,0 +1,61 @@
+
+from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, OptValue
+
+
+def optimize_unroll(metainterp_sd, jitdriver_sd, loop, optimizations,
+ inline_short_preamble=True, unroller=None):
+ if unroller is None:
+ unroller = Unroller()
+ unroller.set_optimizer(Optimizer(metainterp_sd, jitdriver_sd,
+ loop, optimizations))
+ unroller.propagate(inline_short_preamble)
+ return unroller
+
+
+class OptPureValue(OptValue):
+ _attrs_ = ('unroller', 'keybox')
+ box = None
+
+ def __init__(self, unroller, keybox):
+ self.unroller = unroller
+ self.keybox = keybox
+
+ def force_box(self, ignored):
+ if self.box is None:
+ self.box = self.keybox
+ self.unroller.reuse_pure_result(self.box)
+ return self.box
+
+
+class Unroller(object):
+ optimizer = None
+
+ def set_optimizer(self, optimizer):
+ old_optimizer = self.optimizer
+ self.optimizer = optimizer
+ if old_optimizer is not None:
+ self.import_state_from_optimizer(old_optimizer)
+
+ def propagate(self, inline_short_preamble):
+ self.optimizer.propagate_all_forward()
+
+ def import_state_from_optimizer(self, old_optimizer):
+ old_optpure = old_optimizer.optpure
+ if old_optpure:
+ # import all pure operations from the old optimizer
+ new_optpure = self.optimizer.optpure
+ for opargs, value in old_optpure.pure_operations.items():
+ if not value.is_virtual():
+ pure_value = OptPureValue(self, value.box)
+ new_optpure.pure_operations[opargs] = pure_value
+
+ def reuse_pure_result(self, box):
+ label1_op = self.optimizer.loop.operations[0]
+ label1_args = label1_op.getarglist()
+ label2_op = self.optimizer.loop.operations[-1]
+ label2_args = label2_op.getarglist()
+ assert len(label1_args) == len(self.optimizer.loop.inputargs)
+ assert len(label2_args) == len(self.optimizer.loop.inputargs)
+ self.optimizer.loop.inputargs.append(box)
+ label1_args.append(box)
+ label2_args.append(box)
More information about the pypy-commit
mailing list