[pypy-svn] r79079 - pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt

hakanardo at codespeak.net hakanardo at codespeak.net
Sun Nov 14 15:46:47 CET 2010


Author: hakanardo
Date: Sun Nov 14 15:46:45 2010
New Revision: 79079

Modified:
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/fficall.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/heap.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/intbounds.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/rewrite.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py
Log:
Started to reconstruct values aswell (this is work in progress)

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/fficall.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/fficall.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/fficall.py	Sun Nov 14 15:46:45 2010
@@ -67,7 +67,7 @@
     def __init__(self):
         self.funcinfo = None
 
-    def reconstruct_for_next_iteration(self):
+    def reconstruct_for_next_iteration(self, valuemap):
         return OptFfiCall()
         # FIXME: Should any status be saved for next iteration?
 

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/heap.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/heap.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/heap.py	Sun Nov 14 15:46:45 2010
@@ -23,7 +23,7 @@
         self.lazy_setfields = {}
         self.lazy_setfields_descrs = []     # keys (at least) of previous dict
 
-    def reconstruct_for_next_iteration(self):
+    def reconstruct_for_next_iteration(self, valuemap):
         self.force_all_lazy_setfields()
         assert not self.lazy_setfields_descrs
         assert not self.lazy_setfields

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/intbounds.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/intbounds.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/intbounds.py	Sun Nov 14 15:46:45 2010
@@ -13,7 +13,7 @@
         self.posponedop = None
         self.nextop = None
 
-    def reconstruct_for_next_iteration(self):
+    def reconstruct_for_next_iteration(self, valuemap):
         assert self.posponedop is None
         return self 
 

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py	Sun Nov 14 15:46:45 2010
@@ -51,6 +51,16 @@
             boxes.append(self.force_box())
             already_seen[self.get_key_box()] = None
 
+    def get_reconstructed(self, optimizer, valuemap):
+        if self in valuemap:
+            return valuemap[self]
+        new = self.reconstruct_for_next_iteration(optimizer, valuemap)
+        valuemap[self] = new
+        return new
+
+    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+        return self
+
     def get_args_for_fail(self, modifier):
         pass
 
@@ -197,7 +207,7 @@
     def turned_constant(self, value):
         pass
 
-    def reconstruct_for_next_iteration(self):
+    def reconstruct_for_next_iteration(self, valuemap):
         #return self.__class__()
         raise NotImplementedError
     
@@ -240,25 +250,29 @@
             o.force_at_end_of_preamble()
             
     def reconstruct_for_next_iteration(self):
-        optimizations = [o.reconstruct_for_next_iteration() for o in 
+        valuemap = {}
+        optimizations = [o.reconstruct_for_next_iteration(valuemap) for o in 
                          self.optimizations]
         optimizations = self.optimizations
         new = Optimizer(self.metainterp_sd, self.loop, optimizations)
-        new.values = self.values
+        new.values = {}
+        for box, value in self.values.items():
+            new.values[box] = value.get_reconstructed(new, valuemap)
         new.interned_refs = self.interned_refs
-        new.bool_boxes = self.bool_boxes
-        new.loop_invariant_results = self.loop_invariant_results
+        new.bool_boxes = {}
+        for value in new.bool_boxes.keys():
+            new.bool_boxes[value.get_reconstructed(new, valuemap)] = None
+
+        # FIXME: Move to rewrite.py
+        new.loop_invariant_results = {}
+        for key, value in self.loop_invariant_results.items():
+            new.loop_invariant_results[key] = \
+                                 value.get_reconstructed(new, valuemap)
+            
         new.pure_operations = self.pure_operations
         new.producer = self.producer
         assert self.posponedop is None
 
-        # FIXME: HACK!! Add a reconstruct_for_next_iteration to
-        # the values instead and reconstruct them in the same manner.
-        # That should also give us a clean solution for enabling
-        # OptString in the preamble that forces it's virtuals before
-        # the loop
-        for v in new.values.values(): 
-            v.optimizer = new
         return new
 
     def turned_constant(self, value):

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/rewrite.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/rewrite.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/rewrite.py	Sun Nov 14 15:46:45 2010
@@ -10,7 +10,7 @@
        This includes already executed operations and constants.
     """
 
-    def reconstruct_for_next_iteration(self):
+    def reconstruct_for_next_iteration(self, valuemap):
         return self
     
     def propagate_forward(self, op):

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py	Sun Nov 14 15:46:45 2010
@@ -367,7 +367,7 @@
     "Handling of strings and unicodes."
     enabled = True
 
-    def reconstruct_for_next_iteration(self):
+    def reconstruct_for_next_iteration(self, valuemap):
         self.enabled = True
         return self
     

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py	Sun Nov 14 15:46:45 2010
@@ -44,6 +44,9 @@
     def _really_force(self):
         raise NotImplementedError("abstract base")
 
+    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+        return optimizer.OptValue(self.force_box())
+
 def get_fielddescrlist_cache(cpu):
     if not hasattr(cpu, '_optimizeopt_fielddescrlist_cache'):
         result = descrlist_dict()
@@ -132,6 +135,15 @@
         else:
             boxes.append(self.box)
 
+    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+        self.optimizer = optimizer
+        if self.box is None:
+            lst = self._get_field_descr_list()
+            for ofs in lst:
+                self._fields[ofs] = \
+                      self._fields[ofs].get_reconstructed(optimizer, valuemap)
+        return self
+
 
 class VirtualValue(AbstractVirtualStructValue):
     level = optimizer.LEVEL_KNOWNCLASS
@@ -224,11 +236,18 @@
         else:
             boxes.append(self.box)
 
+    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+        self.optimizer = optimizer
+        if self.box is None:
+            for i in range(len(self._items)):
+                self._items[i] = self._items[i].get_reconstructed(optimizer,
+                                                                  valuemap)
+        return self
 
 class OptVirtualize(optimizer.Optimization):
     "Virtualize objects until they escape."
 
-    def reconstruct_for_next_iteration(self):
+    def reconstruct_for_next_iteration(self, valuemap):
         return self
 
     def make_virtual(self, known_class, box, source_op=None):



More information about the Pypy-commit mailing list