[pypy-svn] pypy jit-fromstart: interface to specify which boxes will survive into next iteration

hakanardo commits-noreply at bitbucket.org
Wed Feb 2 08:20:50 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-fromstart
Changeset: r41533:a2aeb3bd859a
Date: 2011-02-01 20:44 +0100
http://bitbucket.org/pypy/pypy/changeset/a2aeb3bd859a/

Log:	interface to specify which boxes will survive into next iteration

diff --git a/pypy/jit/metainterp/optimizeopt/fficall.py b/pypy/jit/metainterp/optimizeopt/fficall.py
--- a/pypy/jit/metainterp/optimizeopt/fficall.py
+++ b/pypy/jit/metainterp/optimizeopt/fficall.py
@@ -67,7 +67,7 @@
     def __init__(self):
         self.funcinfo = None
 
-    def clone_for_next_iteration(self, optimizer, valuemap):
+    def clone_for_next_iteration(self, surviving_boxes, optimizer, valuemap):
         return OptFfiCall()
         # FIXME: Should any status be saved for next iteration?
 

diff --git a/pypy/jit/metainterp/optimizeopt/string.py b/pypy/jit/metainterp/optimizeopt/string.py
--- a/pypy/jit/metainterp/optimizeopt/string.py
+++ b/pypy/jit/metainterp/optimizeopt/string.py
@@ -367,7 +367,7 @@
     "Handling of strings and unicodes."
     enabled = True
 
-    def clone_for_next_iteration(self, optimizer, valuemap):
+    def clone_for_next_iteration(self, surviving_boxes, optimizer, valuemap):
         return OptString()
     
     def make_vstring_plain(self, box, source_op, mode):

diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -159,7 +159,8 @@
             jumpop.initarglist([])            
 
             preamble_optmizer = self.optimizer
-            self.optimizer = preamble_optmizer.clone_for_next_iteration()
+            self.optimizer = \
+                        preamble_optmizer.clone_for_next_iteration(jump_args)
             inputargs = self.inline(self.cloned_operations,
                                     loop.inputargs, jump_args)
 
@@ -187,7 +188,7 @@
 
                 if True:
                     self.optimizer = \
-                            preamble_optmizer.clone_for_next_iteration()
+                          preamble_optmizer.clone_for_next_iteration(jump_args)
                     self.optimizer.extraargs = loop.inputargs
                     loop.inputargs = self.inline(self.cloned_operations,
                                              loop_inputargs, jump_args)
@@ -536,7 +537,7 @@
         return self.map[loopbox]
 
 class OptInlineShortPreamble(Optimization):
-    def clone_for_next_iteration(self, optimizer, valuemap):
+    def clone_for_next_iteration(self, surviving_boxes, optimizer, valuemap):
         return OptInlineShortPreamble()
     
     def propagate_forward(self, op):

diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -24,33 +24,27 @@
         self.lazy_setfields = {}
         self.lazy_setfields_descrs = []     # keys (at least) of previous dict
 
-    def clone_for_next_iteration(self, optimizer, valuemap):
+    def clone_for_next_iteration(self, surviving_boxes, optimizer, valuemap):
         new = OptHeap()
-        return new
-        # FIXME:
 
-        if True:
-            self.force_all_lazy_setfields()
-            assert not self.lazy_setfields_descrs
-            assert not self.lazy_setfields
-        else:
-            new.lazy_setfields_descrs = self.lazy_setfields_descrs
-            new.lazy_setfields = self.lazy_setfields
+        self.force_all_lazy_setfields()
+        assert not self.lazy_setfields_descrs
+        assert not self.lazy_setfields
         
         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)
+                             fieldvalue.get_reconstructed(optimizer, valuemap)
             
         for descr, d in self.known_heap_fields.items():
             newd = {}
             new.known_heap_fields[descr] = newd
             for value, fieldvalue in d.items():
                 newd[value.get_reconstructed(optimizer, valuemap)] = \
-                                       fieldvalue.get_reconstructed(optimizer, valuemap)
-            
+                             fieldvalue.get_reconstructed(optimizer, valuemap)
+
         new.cached_arrayitems = {}
         for descr, d in self.cached_arrayitems.items():
             newd = {}
@@ -60,10 +54,12 @@
                 newd[value.get_reconstructed(optimizer, valuemap)] = newcache
                 if cache.var_index_item:
                     newcache.var_index_item = \
-                          cache.var_index_item.get_reconstructed(optimizer, valuemap)
+                          cache.var_index_item.get_reconstructed(optimizer,
+                                                                 valuemap)
                 if cache.var_index_indexvalue:
                     newcache.var_index_indexvalue = \
-                          cache.var_index_indexvalue.get_reconstructed(optimizer, valuemap)
+                        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)

diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -13,7 +13,7 @@
        This includes already executed operations and constants.
     """
 
-    def clone_for_next_iteration(self, optimizer, valuemap):
+    def clone_for_next_iteration(self, surviving_boxes, optimizer, valuemap):
         return OptRewrite()
     
     def propagate_forward(self, op):

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
@@ -232,7 +232,8 @@
     def turned_constant(self, value):
         pass
 
-    def clone_for_next_iteration(self, optimizer=None, valuemap=None):
+    def clone_for_next_iteration(self, surviving_boxes=None,
+                                 optimizer=None, valuemap=None):
         raise NotImplementedError
     
 
@@ -311,14 +312,20 @@
         for o in self.optimizations:
             o.force_at_end_of_preamble()
             
-    def clone_for_next_iteration(self, optimizer=None, valuemap=None):
+    def clone_for_next_iteration(self, surviving_boxes=None,
+                                 optimizer=None, valuemap=None):
         assert optimizer is None
         assert valuemap is None
+        if surviving_boxes is None:
+            surviving_boxes = []
+        else:
+            surviving_boxes = surviving_boxes[:]
         valuemap = {}
         new = Optimizer(self.metainterp_sd, self.loop)
         new.values = {}
-        optimizations = [o.clone_for_next_iteration(new, valuemap) for o in 
-                         self.optimizations]
+        optimizations = [o.clone_for_next_iteration(surviving_boxes, 
+                                                    new, valuemap)
+                         for o in self.optimizations]
         new.set_optimizations(optimizations)
 
         # FIXME: new.interned_refs = self.interned_refs
@@ -338,14 +345,18 @@
             for i in range(len(newargs)):
                 if isinstance(newargs[i], OptValue):
                     newargs[i] = newargs[i].get_reconstructed(new, valuemap)
-            v = self.getvalue(op.result)
-            new.values[op.result] = v.get_reconstructed(new, valuemap)
+            surviving_boxes.append(op.result)
             new.pure_operations[newargs] = op
             # FIXME: This will not work for ops with mutable descr
             
         # FIXME: Any point in propagating these? new.producer = self.producer
+
         assert self.posponedop is None
 
+        for box in surviving_boxes:
+            v = self.getvalue(box)
+            new.values[box] = v.get_reconstructed(new, valuemap)
+
         return new
 
     def turned_constant(self, value):

diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py b/pypy/jit/metainterp/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/test/test_optimizeopt.py
@@ -694,9 +694,9 @@
         i1 = ptr_eq(p0, NULL)
         guard_false(i1) []
         i2 = ptr_ne(NULL, p0)
-        guard_true(i0) []
+        guard_true(i2) []
         i3 = ptr_eq(NULL, p0)
-        guard_false(i1) []
+        guard_false(i3) []
         guard_nonnull(p0) []
         jump(p0)
         """

diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -13,7 +13,7 @@
         self.posponedop = None
         self.nextop = None
 
-    def clone_for_next_iteration(self, optimizer, valuemap):
+    def clone_for_next_iteration(self, surviving_boxes, optimizer, valuemap):
         assert self.posponedop is None
         return OptIntBounds()
 

diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -252,7 +252,7 @@
 class OptVirtualize(optimizer.Optimization):
     "Virtualize objects until they escape."
 
-    def clone_for_next_iteration(self, optimizer, valuemap):
+    def clone_for_next_iteration(self, surviving_boxes, optimizer, valuemap):
         return OptVirtualize()
 
     def make_virtual(self, known_class, box, source_op=None):


More information about the Pypy-commit mailing list