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

arigo at codespeak.net arigo at codespeak.net
Fri Oct 29 13:26:45 CEST 2010


Author: arigo
Date: Fri Oct 29 13:26:43 2010
New Revision: 78457

Modified:
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py
Log:
(hakanardo, arigo)
Change the interface of get_forced_boxes() to enum_forced_boxes().
Implement it for VStrings too.


Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py	Fri Oct 29 13:26:43 2010
@@ -16,7 +16,7 @@
                      OptIntBounds(),
                      OptRewrite(),
                      OptVirtualize(),
-#                     OptString(),
+                     OptString(),
                      OptHeap(),
                     ]
     optimizer = Optimizer(metainterp_sd, loop, optimizations, virtuals)

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	Fri Oct 29 13:26:43 2010
@@ -47,14 +47,11 @@
     def get_key_box(self):
         return self.box
 
-    # FIXME: Reuse get_args_for_fail instead?
-    def get_forced_boxes(self, already_seen):
+    def enum_forced_boxes(self, boxes, already_seen):
         key = self.get_key_box()
-        if key in already_seen:
-            return []
-        box = self.force_box()
-        already_seen.append(self.get_key_box())
-        return [box]
+        if key not in already_seen:
+            boxes.append(self.force_box())
+            already_seen[self.get_key_box()] = None
 
     def get_args_for_fail(self, modifier):
         pass

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	Fri Oct 29 13:26:43 2010
@@ -108,6 +108,17 @@
             for value in self._chars:
                 value.get_args_for_fail(modifier)
 
+    def enum_forced_boxes(self, boxes, already_seen):
+        key = self.get_key_box()
+        if key in already_seen:
+            return
+        already_seen.append(key)
+        if self.box is None:
+            for box in self._chars:
+                box.enum_forced_boxes(boxes, already_seen)
+        else:
+            boxes.append(self.box)
+
     def _make_virtual(self, modifier):
         return modifier.make_vstrplain()
 
@@ -149,6 +160,17 @@
             self.left.get_args_for_fail(modifier)
             self.right.get_args_for_fail(modifier)
 
+    def enum_forced_boxes(self, boxes, already_seen):
+        key = self.get_key_box()
+        if key in already_seen:
+            return
+        already_seen.append(key)
+        if self.box is None:
+            self.left.enum_forced_boxes(boxes, already_seen)
+            self.right.enum_forced_boxes(boxes, already_seen)
+        else:
+            boxes.append(self.box)
+
     def _make_virtual(self, modifier):
         return modifier.make_vstrconcat()
 
@@ -194,6 +216,18 @@
             self.vstart.get_args_for_fail(modifier)
             self.vlength.get_args_for_fail(modifier)
 
+    def enum_forced_boxes(self, boxes, already_seen):
+        key = self.get_key_box()
+        if key in already_seen:
+            return
+        already_seen.append(key)
+        if self.box is None:
+            self.vstr.enum_forced_boxes(boxes, already_seen)
+            self.vstart.enum_forced_boxes(boxes, already_seen)
+            self.vlength.enum_forced_boxes(boxes, already_seen)
+        else:
+            boxes.append(self.box)
+
     def _make_virtual(self, modifier):
         return modifier.make_vstrslice()
 

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py	Fri Oct 29 13:26:43 2010
@@ -51,9 +51,11 @@
         self.snapshot_map ={None: None}
         
         inputargs = []
-        seen = []
+        seen = {}
         for arg in jump_args:
-            for a in self.getvalue(arg).get_forced_boxes(seen):
+            boxes = []
+            self.getvalue(arg).enum_forced_boxes(boxes, seen)
+            for a in boxes:
                 if not isinstance(a, Const):
                     inputargs.append(a)
 
@@ -75,8 +77,9 @@
             if newop.getopnum() == rop.JUMP:
                 args = []
                 #for arg in newop.getarglist():
-                for arg in [argmap[a] for a in inputargs]:
-                    args.extend(self.getvalue(arg).get_forced_boxes([]))
+                for arg in inputargs:
+                    arg = argmap[arg]
+                    self.getvalue(arg).enum_forced_boxes(args, {})
                 newop.initarglist(args + inputargs[len(args):])
 
             #print 'P: ', str(newop)
@@ -105,8 +108,9 @@
                             jmp = self.optimizer.newoperations[-1]
                             if jmp.getopnum() == rop.JUMP:
                                 newval = self.getvalue(argmap[a])
-                                newarg = newval.get_forced_boxes([])
-                                jmp.initarglist(jmp.getarglist() + newarg)
+                                boxes = jmp.getarglist()[:]
+                                newval.enum_forced_boxes(boxes, {})
+                                jmp.initarglist(boxes)
 
         return inputargs
 

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	Fri Oct 29 13:26:43 2010
@@ -121,20 +121,17 @@
                 fieldvalue = self._fields[ofs]
                 fieldvalue.get_args_for_fail(modifier)
 
-    def get_forced_boxes(self, already_seen):
+    def enum_forced_boxes(self, boxes, already_seen):
         key = self.get_key_box()
         if key in already_seen:
-            return []
-        already_seen.append(key)
+            return
+        already_seen[key] = None
         if self.box is None:
             lst = self._get_field_descr_list()
-            fieldboxes = []
             for ofs in lst:
-                boxes = self._fields[ofs].get_forced_boxes(already_seen)
-                fieldboxes.extend(boxes)
-            return fieldboxes
+                self._fields[ofs].enum_forced_boxes(boxes, already_seen)
         else:
-            return [self.box]
+            boxes.append(self.box)
 
 
 class VirtualValue(AbstractVirtualStructValue):
@@ -208,18 +205,16 @@
     def _make_virtual(self, modifier):
         return modifier.make_varray(self.arraydescr)
 
-    def get_forced_boxes(self, already_seen):
+    def enum_forced_boxes(self, boxes, already_seen):
         key = self.get_key_box()
         if key in already_seen:
-            return []
+            return
         already_seen.append(key)
         if self.box is None:
-            boxes = []
             for itemvalue in self._items:
-                boxes.extend(itemvalue.get_forced_boxes(already_seen))
-            return boxes
+                itemvalue.enum_forced_boxes(boxes, already_seen)
         else:
-            return [self.box]
+            boxes.append(self.box)
 
 
 class __extend__(SpecNode):



More information about the Pypy-commit mailing list