Author: Hakan Ardo <ha...@debian.org>
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
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to