[pypy-svn] pypy jit-str_in_preamble: dont force every box in optimizer.values not allowed to propagate to the next iteration. And make sure the reconstruct_for_next_iteration methods always creates a new instance to prevent status data from beeing unintentionally propagated

hakanardo commits-noreply at bitbucket.org
Fri Mar 25 21:03:38 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-str_in_preamble
Changeset: r42946:bb8b6e1f1c9c
Date: 2011-03-25 21:01 +0100
http://bitbucket.org/pypy/pypy/changeset/bb8b6e1f1c9c/

Log:	dont force every box in optimizer.values not allowed to propagate to
	the next iteration. And make sure the reconstruct_for_next_iteration
	methods always creates a new instance to prevent status data from
	beeing unintentionally propagated

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,8 @@
     def __init__(self):
         self.funcinfo = None
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+    def reconstruct_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
@@ -366,9 +366,9 @@
     "Handling of strings and unicodes."
     enabled = True
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
-        self.enabled = True
-        return self
+    def reconstruct_for_next_iteration(self, surviving_boxes,
+                                       optimizer, valuemap):
+        return OptString()
 
     def make_vstring_plain(self, box, source_op, mode):
         vvalue = VStringPlainValue(self.optimizer, 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
@@ -267,7 +267,7 @@
             virtual_state = modifier.get_virtual_state(jump_args)
 
             loop.preamble.operations = self.optimizer.newoperations
-            self.optimizer = self.optimizer.reconstruct_for_next_iteration()
+            self.optimizer = self.optimizer.reconstruct_for_next_iteration(jump_args)
             inputargs = self.inline(self.cloned_operations,
                                     loop.inputargs, jump_args)
             loop.inputargs = inputargs
@@ -626,8 +626,9 @@
         self.inliner = None
         
     
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
-        return self
+    def reconstruct_for_next_iteration(self, surviving_boxes,
+                                       optimizer, valuemap):
+        return OptInlineShortPreamble(self.retraced)
     
     def propagate_forward(self, op):
         if op.getopnum() == rop.JUMP:

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
@@ -120,7 +120,8 @@
         # cached array items:  {descr: CachedArrayItems}
         self.cached_arrayitems = {}
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+    def reconstruct_for_next_iteration(self, surviving_boxes,
+                                       optimizer, valuemap):
         new = OptHeap()
 
         if True:

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,8 +13,9 @@
        This includes already executed operations and constants.
     """
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
-        return self
+    def reconstruct_for_next_iteration(self, surviving_boxes,
+                                       optimizer, valuemap):
+        return OptRewrite()
     
     def propagate_forward(self, op):
         args = self.optimizer.make_args_key(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
@@ -51,10 +51,15 @@
             boxes.append(self.force_box())
             already_seen[self.get_key_box()] = None
 
-    def get_reconstructed(self, optimizer, valuemap):
+    def get_reconstructed(self, optimizer, valuemap, force_if_needed=True):
         if self in valuemap:
             return valuemap[self]
         new = self.reconstruct_for_next_iteration(optimizer)
+        if new is None:
+            if force_if_needed:
+                new = optimizer.OptValue(self.force_box())
+            else:
+                return None
         valuemap[self] = new
         self.reconstruct_childs(new, valuemap)
         return new
@@ -283,18 +288,19 @@
         for o in self.optimizations:
             o.force_at_end_of_preamble()
 
-    def reconstruct_for_next_iteration(self, optimizer=None, valuemap=None):
+    def reconstruct_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 = []
         valuemap = {}
         new = Optimizer(self.metainterp_sd, self.loop)
-        optimizations = [o.reconstruct_for_next_iteration(new, valuemap) for o in
-                         self.optimizations]
+        optimizations = [o.reconstruct_for_next_iteration(surviving_boxes,
+                                                          new, valuemap)
+                         for o in self.optimizations]
         new.set_optimizations(optimizations)
 
-        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 = {}
         for value in new.bool_boxes.keys():
@@ -310,6 +316,14 @@
         new.producer = self.producer
         assert self.posponedop is None
 
+        for box, value in self.values.items():
+            box = new.getinterned(box)
+            force = box in surviving_boxes
+            value = value.get_reconstructed(new, valuemap,
+                                            force_if_needed=force)
+            if value is not None:
+                new.values[box] = value
+            
         return new
 
     def turned_constant(self, value):

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,9 +13,10 @@
         self.posponedop = None
         self.nextop = None
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
+    def reconstruct_for_next_iteration(self, surviving_boxes, optimizer,
+                                       valuemap):
         assert self.posponedop is None
-        return self
+        return OptIntBounds()
 
     def propagate_forward(self, op):
         if op.is_ovf():

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
@@ -47,7 +47,7 @@
         raise NotImplementedError("abstract base")
 
     def reconstruct_for_next_iteration(self, _optimizer):
-        return optimizer.OptValue(self.force_box())
+        return None
 
 def get_fielddescrlist_cache(cpu):
     if not hasattr(cpu, '_optimizeopt_fielddescrlist_cache'):
@@ -261,8 +261,9 @@
 class OptVirtualize(optimizer.Optimization):
     "Virtualize objects until they escape."
 
-    def reconstruct_for_next_iteration(self, optimizer, valuemap):
-        return self
+    def reconstruct_for_next_iteration(self, surviving_boxes,
+                                       optimizer, valuemap):
+        return OptVirtualize()
 
     def make_virtual(self, known_class, box, source_op=None):
         vvalue = VirtualValue(self.optimizer, known_class, box, source_op)


More information about the Pypy-commit mailing list