[pypy-svn] pypy jit-short_from_state: Extracting boxes suitable for short preamble. Only considering pure operation so far

hakanardo commits-noreply at bitbucket.org
Wed Mar 30 08:19:30 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r43008:03e22e9ee2f1
Date: 2011-03-30 07:58 +0200
http://bitbucket.org/pypy/pypy/changeset/03e22e9ee2f1/

Log:	Extracting boxes suitable for short preamble. Only considering pure
	operation so far

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
@@ -162,6 +162,11 @@
             modifier = VirtualStateAdder(self.optimizer)
             virtual_state = modifier.get_virtual_state(jump_args)
 
+            values = [self.getvalue(arg) for arg in jump_args]
+            inputargs = virtual_state.make_inputargs(values)
+            short_boxes = preamble_optimizer.produce_short_preamble_ops(inputargs)
+            print short_boxes
+
             try:
                 inputargs = self.inline(self.cloned_operations,
                                         loop.inputargs, jump_args,

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
@@ -119,6 +119,7 @@
         self._lazy_setfields = []
         # cached array items:  {descr: CachedArrayItems}
         self.cached_arrayitems = {}
+        self.original_producer = {}
 
     def reconstruct_for_next_iteration(self, surviving_boxes,
                                        optimizer, valuemap):

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
@@ -254,6 +254,11 @@
         #return self.__class__()
         raise NotImplementedError
 
+    def produce_potential_short_preamble_ops(self, potential_ops):
+        pass
+
+class BoxNotProducable(Exception):
+    pass
 
 class Optimizer(Optimization):
 
@@ -266,6 +271,7 @@
         self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
         self.bool_boxes = {}
         self.pure_operations = args_dict()
+        self.emitted_pure_operations = {}
         self.producer = {}
         self.pendingfields = []
         self.posponedop = None
@@ -302,6 +308,7 @@
         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(surviving_boxes,
@@ -325,9 +332,45 @@
                                      force_if_needed=force)
             if value is not None:
                 new.values[box] = value
-            
+                
         return new
 
+    def produce_potential_short_preamble_ops(self, potential_ops):
+        for op in self.emitted_pure_operations:
+            potential_ops[op.result] = op
+        for opt in self.optimizations:
+            opt.produce_potential_short_preamble_ops(potential_ops)
+
+    def produce_short_preamble_ops(self, inputargs):
+        potential_ops = {}
+        self.produce_potential_short_preamble_ops(potential_ops)
+        
+        short_boxes = {}
+        for box in inputargs:
+            short_boxes[box] = None
+        for box in potential_ops.keys():
+            try:
+                self.produce_short_preamble_box(box, short_boxes,
+                                                potential_ops)
+            except BoxNotProducable:
+                pass
+        return short_boxes
+
+    def produce_short_preamble_box(self, box, short_boxes, potential_ops):
+        if box in short_boxes:
+            return 
+        if self.getvalue(box).is_constant():
+            return 
+        if box in potential_ops:
+            op = potential_ops[box]
+            for arg in op.getarglist():
+                arg = self.getvalue(arg).get_key_box()
+                self.produce_short_preamble_box(arg, short_boxes,
+                                                potential_ops)
+            short_boxes[box] = op
+        else:
+            raise BoxNotProducable
+
     def turned_constant(self, value):
         for o in self.optimizations:
             o.turned_constant(value)
@@ -548,6 +591,7 @@
                 return
             else:
                 self.pure_operations[args] = op
+                self.emitted_pure_operations[op] = True
 
         # otherwise, the operation remains
         self.emit_operation(op)


More information about the Pypy-commit mailing list