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

hakanardo at codespeak.net hakanardo at codespeak.net
Mon Nov 15 09:36:41 CET 2010


Author: hakanardo
Date: Mon Nov 15 09:36:39 2010
New Revision: 79084

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:
Reconstructs all the OptValus after the preamble

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	Mon Nov 15 09:36:39 2010
@@ -67,7 +67,7 @@
     def __init__(self):
         self.funcinfo = None
 
-    def reconstruct_for_next_iteration(self, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer, 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	Mon Nov 15 09:36:39 2010
@@ -23,13 +23,35 @@
         self.lazy_setfields = {}
         self.lazy_setfields_descrs = []     # keys (at least) of previous dict
 
-    def reconstruct_for_next_iteration(self, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer, valuemap):
         self.force_all_lazy_setfields()
         assert not self.lazy_setfields_descrs
         assert not self.lazy_setfields
         new = OptHeap()
-        new.cached_fields = self.cached_fields
-        new.cached_arrayitems = self.cached_arrayitems
+        
+        for descr, d in self.cached_fields.items():
+            newd = {}
+            new.cached_fields[descr] = newd
+            for value, fieldvalue in d.items():
+                newd[value.get_reconstructed(optimizer, valuemap)] = \
+                                       fieldvalue.get_reconstructed(optimizer, valuemap)
+            
+        new.cached_arrayitems = {}
+        for descr, d in self.cached_arrayitems.items():
+            newd = {}
+            new.cached_arrayitems[descr] = newd
+            for value, cache in d.items():
+                newcache = CachedArrayItems()
+                newd[value.get_reconstructed(optimizer, valuemap)] = newcache
+                if cache.var_index_item:
+                    newcache.var_index_item = \
+                          cache.var_index_item.get_reconstructed(optimizer, valuemap)
+                if newcache.var_index_indexvalue:
+                    newcache.var_index_indexvalue = \
+                          cache.var_index_indexvalue.get_reconstructed(optimizer, valuemap)
+                for index, fieldvalue in cache.fixed_index_items.items():
+                    newcache.fixed_index_items[index] = \
+                           fieldvalue.get_reconstructed(optimizer, valuemap)
         return new
 
     def clean_caches(self):

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	Mon Nov 15 09:36:39 2010
@@ -13,7 +13,7 @@
         self.posponedop = None
         self.nextop = None
 
-    def reconstruct_for_next_iteration(self, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer, 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	Mon Nov 15 09:36:39 2010
@@ -54,13 +54,17 @@
     def get_reconstructed(self, optimizer, valuemap):
         if self in valuemap:
             return valuemap[self]
-        new = self.reconstruct_for_next_iteration(optimizer, valuemap)
+        new = self.reconstruct_for_next_iteration(optimizer)
         valuemap[self] = new
+        self.reconstruct_childs(new, valuemap)
         return new
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer):
         return self
 
+    def reconstruct_childs(self, new, valuemap):
+        pass
+
     def get_args_for_fail(self, modifier):
         pass
 
@@ -207,7 +211,7 @@
     def turned_constant(self, value):
         pass
 
-    def reconstruct_for_next_iteration(self, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer=None, valuemap=None):
         #return self.__class__()
         raise NotImplementedError
     
@@ -230,6 +234,9 @@
         self.exception_might_have_happened = False
         self.newoperations = []
 
+        self.set_optimizations(optimizations)
+
+    def set_optimizations(self, optimizations):
         if optimizations:
             self.first_optimization = optimizations[0]
             for i in range(1, len(optimizations)):
@@ -249,12 +256,15 @@
         for o in self.optimizations:
             o.force_at_end_of_preamble()
             
-    def reconstruct_for_next_iteration(self):
+    def reconstruct_for_next_iteration(self, optimizer=None, valuemap=None):
+        assert optimizer is None
+        assert valuemap is None
         valuemap = {}
-        optimizations = [o.reconstruct_for_next_iteration(valuemap) for o in 
+        new = Optimizer(self.metainterp_sd, self.loop)
+        optimizations = [o.reconstruct_for_next_iteration(new, valuemap) for o in 
                          self.optimizations]
-        optimizations = self.optimizations
-        new = Optimizer(self.metainterp_sd, self.loop, optimizations)
+        new.set_optimizations(optimizations)
+
         new.values = {}
         for box, value in self.values.items():
             new.values[box] = value.get_reconstructed(new, valuemap)

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	Mon Nov 15 09:36:39 2010
@@ -10,7 +10,7 @@
        This includes already executed operations and constants.
     """
 
-    def reconstruct_for_next_iteration(self, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer, 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	Mon Nov 15 09:36:39 2010
@@ -367,7 +367,7 @@
     "Handling of strings and unicodes."
     enabled = True
 
-    def reconstruct_for_next_iteration(self, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer, 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	Mon Nov 15 09:36:39 2010
@@ -44,7 +44,7 @@
     def _really_force(self):
         raise NotImplementedError("abstract base")
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+    def reconstruct_for_next_iteration(self, _optimizer):
         return optimizer.OptValue(self.force_box())
 
 def get_fielddescrlist_cache(cpu):
@@ -135,15 +135,17 @@
         else:
             boxes.append(self.box)
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer):
         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
 
+    def reconstruct_childs(self, new, valuemap):
+        assert isinstance(new, AbstractVirtualStructValue)
+        if new.box is None:
+            lst = self._get_field_descr_list()
+            for ofs in lst:
+                new._fields[ofs] = \
+                      self._fields[ofs].get_reconstructed(new.optimizer, valuemap)
 
 class VirtualValue(AbstractVirtualStructValue):
     level = optimizer.LEVEL_KNOWNCLASS
@@ -236,18 +238,21 @@
         else:
             boxes.append(self.box)
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer):
         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
 
+    def reconstruct_childs(self, new, valuemap):
+        assert isinstance(new, VArrayValue)
+        if new.box is None:
+            for i in range(len(self._items)):
+                new._items[i] = self._items[i].get_reconstructed(new.optimizer,
+                                                                 valuemap)
+
 class OptVirtualize(optimizer.Optimization):
     "Virtualize objects until they escape."
 
-    def reconstruct_for_next_iteration(self, valuemap):
+    def reconstruct_for_next_iteration(self, optimizer, valuemap):
         return self
 
     def make_virtual(self, known_class, box, source_op=None):



More information about the Pypy-commit mailing list