Author: Hakan Ardo <[email protected]>
Branch: jit-optimizeopt-cleanups
Changeset: r47649:52f393f9ced1
Date: 2011-09-28 08:02 +0200
http://bitbucket.org/pypy/pypy/changeset/52f393f9ced1/
Log: Make values forced at loop boundaries be emitted at the OptPure
stage when unrolling
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py
b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -337,6 +337,7 @@
self.newoperations = []
self.volatile = {}
self.optimizer = self
+ self.optpure = None
if loop is not None:
self.call_pure_results = loop.call_pure_results
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py
b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -5,7 +5,10 @@
def __init__(self):
self.posponedop = None
- def propagate_forward(self, op):
+ def propagate_forward(self, op):
+ self.emit_operation(op)
+
+ def emit_operation(self, op):
canfold = op.is_always_pure()
if op.is_ovf():
self.posponedop = op
@@ -43,11 +46,11 @@
self.optimizer.remember_emitting_pure(op)
# otherwise, the operation remains
- self.emit_operation(op)
+ self.next_optimization.propagate_forward(op)
if op.returns_bool_result():
self.optimizer.bool_boxes[self.getvalue(op.result)] = None
if nextop:
- self.emit_operation(nextop)
+ self.next_optimization.propagate_forward(nextop)
def flush(self):
assert self.posponedop is None
@@ -55,3 +58,6 @@
def new(self):
assert self.posponedop is None
return OptPure()
+
+ def setup(self):
+ self.optimizer.optpure = self
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -378,6 +378,8 @@
cpu, extra_guards, renum)
def make_inputargs(self, values, optimizer, keyboxes=False):
+ if optimizer.optpure:
+ optimizer = optimizer.optpure
assert len(values) == len(self.state)
inputargs = [None] * len(self.notvirtuals)
for i in range(len(values)):
@@ -434,8 +436,12 @@
def get_virtual_state(self, jump_args):
self.optimizer.force_at_end_of_preamble()
already_forced = {}
+ if self.optimizer.optpure:
+ opt = self.optimizer.optpure
+ else:
+ opt = self.optimizer
values = [self.getvalue(box).force_at_end_of_preamble(already_forced,
- self.optimizer)
+ opt)
for box in jump_args]
for value in values:
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit