[pypy-svn] pypy jit-short_from_state: move inputargs generation to VirtualState to make it reusable to create the jumpargs

hakanardo commits-noreply at bitbucket.org
Sun Mar 27 20:30:36 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r42989:96e7b4920fa5
Date: 2011-03-27 20:01 +0200
http://bitbucket.org/pypy/pypy/changeset/96e7b4920fa5/

Log:	move inputargs generation to VirtualState to make it reusable to
	create the jumpargs

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
@@ -145,6 +145,16 @@
             self.state[i].generate_guards(other.state[i], args[i],
                                           cpu, extra_guards)
 
+    def make_inputargs(self, values):
+        assert len(values) == len(self.state)
+        inputargs = []
+        seen_inputargs = {}
+        for i in range(len(values)):
+            self.state[i].enum_forced_boxes(inputargs, seen_inputargs,
+                                            values[i])
+        return [a for a in inputargs if not isinstance(a, Const)]
+        
+
 class VirtualStateAdder(resume.ResumeDataVirtualAdder):
     def __init__(self, optimizer):
         self.fieldboxes = {}
@@ -233,6 +243,12 @@
         if self.level == LEVEL_CONSTANT:
             import pdb; pdb.set_trace()
             raise NotImplementedError
+
+    def enum_forced_boxes(self, boxes, already_seen, value):
+        key = value.get_key_box()
+        if key not in already_seen:
+            boxes.append(value.force_box())
+            already_seen[value.get_key_box()] = None
         
 
 class UnrollOptimizer(Optimization):
@@ -271,7 +287,8 @@
 
             try:
                 inputargs = self.inline(self.cloned_operations,
-                                        loop.inputargs, jump_args)
+                                        loop.inputargs, jump_args,
+                                        virtual_state)
             except KeyError:
                 debug_print("Unrolling failed.")
                 loop.preamble.operations = None
@@ -342,20 +359,15 @@
                     if op.result:
                         op.result.forget_value()
                 
-    def inline(self, loop_operations, loop_args, jump_args):
+    def inline(self, loop_operations, loop_args, jump_args, virtual_state):
         self.inliner = inliner = Inliner(loop_args, jump_args)
-           
+
+        # FIXME: Move this to reconstruct
         for v in self.optimizer.values.values():
             v.last_guard_index = -1 # FIXME: Are there any more indexes stored?
 
-        inputargs = []
-        seen_inputargs = {}
-        for arg in jump_args:
-            boxes = []
-            self.getvalue(arg).enum_forced_boxes(boxes, seen_inputargs)
-            for a in boxes:
-                if not isinstance(a, Const):
-                    inputargs.append(a)
+        values = [self.getvalue(arg) for arg in jump_args]
+        inputargs = virtual_state.make_inputargs(values)
 
         # This loop is equivalent to the main optimization loop in
         # Optimizer.propagate_all_forward
@@ -364,7 +376,8 @@
                 newop.initarglist(inputargs)
             newop = inliner.inline_op(newop, clone=False)
 
-            self.optimizer.first_optimization.propagate_forward(newop)
+            #self.optimizer.first_optimization.propagate_forward(newop)
+            self.optimizer.send_extra_operation(newop)
 
         # Remove jump to make sure forced code are placed before it
         newoperations = self.optimizer.newoperations

diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -445,6 +445,9 @@
 
     def _generate_guards(self, other, box, cpu, extra_guards):
         raise InvalidLoop
+
+    def enum_forced_boxes(self, boxes, already_seen, value):
+        raise NotImplementedError
         
 class AbstractVirtualStructInfo(AbstractVirtualInfo):
     def __init__(self, fielddescrs):
@@ -484,6 +487,19 @@
     def _generalization_of(self, other):
         raise NotImplementedError
 
+    def enum_forced_boxes(self, boxes, already_seen, value):
+        #FIXME: assert isinstance(value, AbstractVirtualStructValue)
+        key = value.get_key_box()
+        if key in already_seen:
+            return
+        already_seen[key] = None
+        if value.box is None:
+            for i in range(len(self.fielddescrs)):
+                v = value._fields[self.fielddescrs[i]]
+                self.fieldstate[i].enum_forced_boxes(boxes, already_seen, v)
+        else:
+            boxes.append(value.box)
+
 
 class VirtualInfo(AbstractVirtualStructInfo):
     def __init__(self, known_class, fielddescrs):
@@ -572,6 +588,21 @@
                 return False
         return True
 
+    def enum_forced_boxes(self, boxes, already_seen, value):
+        # FIXME: assert isinstance(value, VArrayValue)
+        key = value.get_key_box()
+        if key in already_seen:
+            return
+        already_seen[key] = None
+        if value.box is None:
+            for i in range(len(self.fieldstate)):
+                v = value._items[i]
+                self.fieldstate[i].enum_forced_boxes(boxes, already_seen, v)
+        else:
+            boxes.append(value.box)
+
+    
+
 
 class VStrPlainInfo(AbstractVirtualInfo):
     """Stands for the string made out of the characters of all fieldnums."""

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
@@ -52,12 +52,6 @@
     def get_key_box(self):
         return self.box
 
-    def enum_forced_boxes(self, boxes, already_seen):
-        key = self.get_key_box()
-        if key not in already_seen:
-            boxes.append(self.force_box())
-            already_seen[self.get_key_box()] = None
-
     def get_cloned(self, optimizer, valuemap, force_if_needed=True):
         if self in valuemap:
             return valuemap[self]

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
@@ -132,18 +132,6 @@
                 fieldvalue = self._fields[ofs]
                 fieldvalue.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[key] = None
-        if self.box is None:
-            lst = self._get_field_descr_list()
-            for ofs in lst:
-                self._fields[ofs].enum_forced_boxes(boxes, already_seen)
-        else:
-            boxes.append(self.box)
-
     def clone_for_next_iteration(self, optimizer):
         raise NotImplementedError
 
@@ -247,17 +235,6 @@
     def _make_virtual(self, modifier):
         return modifier.make_varray(self.arraydescr)
 
-    def enum_forced_boxes(self, boxes, already_seen):
-        key = self.get_key_box()
-        if key in already_seen:
-            return
-        already_seen[key] = None
-        if self.box is None:
-            for itemvalue in self._items:
-                itemvalue.enum_forced_boxes(boxes, already_seen)
-        else:
-            boxes.append(self.box)
-
     def clone_for_next_iteration(self, optimizer):
         new = VArrayValue(optimizer, self.arraydescr, len(self._items),
                           self.keybox, self.source_op)


More information about the Pypy-commit mailing list