[pypy-commit] pypy jit-short_from_state: started to move the handling of short_boxes into a class of its own

hakanardo noreply at buildbot.pypy.org
Wed Jul 20 10:19:38 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r45764:a994ad085d26
Date: 2011-07-18 09:57 +0200
http://bitbucket.org/pypy/pypy/changeset/a994ad085d26/

Log:	started to move the handling of short_boxes into a class of its own

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
@@ -117,8 +117,7 @@
                 cf._cached_fields[structvalue2] = fieldvalue2
         return cf
 
-    def produce_potential_short_preamble_ops(self, optimizer,
-                                             potential_ops, descr):
+    def produce_potential_short_preamble_ops(self, optimizer, shortboxes, descr):
         if self._lazy_setfield is not None:
             return
         for structvalue in self._cached_fields_getfield_op.keys():
@@ -126,20 +125,19 @@
             if op and structvalue in self._cached_fields:
                 if op.getopnum() == rop.SETFIELD_GC:
                     result = op.getarg(1)
-                    if result in potential_ops and potential_ops[result] is None:
+                    if result in shortboxes.potential_ops and \
+                           shortboxes.potential_ops[result] is None:
                         newresult = result.clonebox()
                         optimizer.make_equal_to(newresult, optimizer.getvalue(result))
                         result = newresult
                         # XXX this will not allow for chains of operations
                     getop = ResOperation(rop.GETFIELD_GC, [op.getarg(0)],
                                          result, op.getdescr())
-                    potential_ops[result] = getop
+                    shortboxes.add_potential(getop)
                     self._cached_fields_getfield_op[structvalue] = getop
                     self._cached_fields[structvalue] = optimizer.getvalue(result)
                 elif op.result is not None:
-                    potential_ops[op.result] = op
-
-
+                    shortboxes.add_potential(op)
 
 class BogusPureField(JitException):
     pass
@@ -182,15 +180,13 @@
 
         return new
 
-    def produce_potential_short_preamble_ops(self, potential_ops):
+    def produce_potential_short_preamble_ops(self, sb):
         for descr, d in self.cached_fields.items():
-            d.produce_potential_short_preamble_ops(self.optimizer,
-                                                   potential_ops, descr)
+            d.produce_potential_short_preamble_ops(self.optimizer, sb, descr)
 
         for descr, submap in self.cached_arrayitems.items():
             for index, d in submap.items():
-                d.produce_potential_short_preamble_ops(self.optimizer,
-                                                       potential_ops, descr)
+                d.produce_potential_short_preamble_ops(self.optimizer, sb, descr)
 
     def clean_caches(self):
         del self._lazy_setfields_and_arrayitems[:]
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
@@ -317,9 +317,6 @@
     def produce_potential_short_preamble_ops(self, potential_ops):
         pass
 
-class BoxNotProducable(Exception):
-    pass
-
 class Optimizer(Optimization):
 
     def __init__(self, metainterp_sd, loop, optimizations=None):
@@ -429,41 +426,11 @@
 
         return new
 
-    def produce_potential_short_preamble_ops(self, potential_ops):
+    def produce_potential_short_preamble_ops(self, sb):
         for op in self.emitted_pure_operations:
-            potential_ops[op.result] = op
+            sb.add_potential(op)
         for opt in self.optimizations:
-            opt.produce_potential_short_preamble_ops(potential_ops)
-
-    def produce_short_preamble_ops(self, surviving_boxes):
-        potential_ops = {}
-        self.produce_potential_short_preamble_ops(potential_ops)
-            
-        short_boxes = {}
-        for box in surviving_boxes:
-            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 isinstance(box, Const):
-            return 
-        if box in potential_ops:
-            op = potential_ops[box]
-            for arg in op.getarglist():
-                self.produce_short_preamble_box(arg, short_boxes,
-                                                potential_ops)
-            short_boxes[box] = op
-        else:
-            raise BoxNotProducable
+            opt.produce_potential_short_preamble_ops(sb)
 
     def turned_constant(self, value):
         for o in self.optimizations:
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
@@ -27,10 +27,9 @@
                                  value.get_cloned(new, valuemap)
         return new
 
-    def produce_potential_short_preamble_ops(self, potential_ops):
+    def produce_potential_short_preamble_ops(self, sb):
         for op in self.loop_invariant_producer.values():
-            potential_ops[op.result] = op
-
+            sb.add_potential(op)
 
     def propagate_forward(self, op):
         args = self.optimizer.make_args_key(op)
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
@@ -1,5 +1,5 @@
 from pypy.jit.metainterp.optimizeopt.optimizer import *
-from pypy.jit.metainterp.optimizeopt.virtualstate import VirtualStateAdder
+from pypy.jit.metainterp.optimizeopt.virtualstate import VirtualStateAdder, ShortBoxes
 from pypy.jit.metainterp.resoperation import rop, ResOperation
 from pypy.jit.metainterp.compile import ResumeGuardDescr
 from pypy.jit.metainterp.resume import Snapshot
@@ -195,8 +195,7 @@
                 if const:
                     self.constant_inputargs[box] = const
 
-            sb = self.optimizer.produce_short_preamble_ops(inputargs +
-                                                 self.constant_inputargs.keys())
+            sb = ShortBoxes(self.optimizer, inputargs + self.constant_inputargs.keys())
             self.short_boxes = sb
             preamble_optimizer = self.optimizer
             loop.preamble.quasi_immutable_deps = (
@@ -210,13 +209,7 @@
                 debug_print('inputargs: ' + args)
                 args = ", ".join([logops.repr_of_arg(arg) for arg in short_inputargs])
                 debug_print('short inputargs: ' + args)
-                debug_start('jit-short-boxes')
-                for box, op in self.short_boxes.items():
-                    if op:
-                        debug_print(logops.repr_of_arg(box) + ': ' + logops.repr_of_resop(op))
-                    else:
-                        debug_print(logops.repr_of_arg(box) + ': None')
-                debug_stop('jit-short-boxes')
+                self.short_boxes.debug_print(logops)
 
             # Force virtuals amoung the jump_args of the preamble to get the
             # operations needed to setup the proper state of those virtuals
@@ -242,7 +235,7 @@
             for op in inputarg_setup_ops:
                 self.optimizer.send_extra_operation(op)
             seen = {}
-            for op in self.short_boxes.values():
+            for op in self.short_boxes.operations():
                 self.ensure_short_op_emitted(op, self.optimizer, seen)
                 if op and op.result:
                     value = preamble_optimizer.getvalue(op.result)
@@ -334,10 +327,9 @@
         for box, const in self.constant_inputargs.items():
             short_seen[box] = True
 
-        for result, op in self.short_boxes.items():
+        for op in self.short_boxes.operations():
             if op is not None:
-                assert result is op.result
-                if len(self.getvalue(result).make_guards(result)) > 0:
+                if len(self.getvalue(op.result).make_guards(op.result)) > 0:
                     self.add_op_to_short(op, short, short_seen, False, True)
 
         # This loop is equivalent to the main optimization loop in
@@ -427,7 +419,7 @@
             return
         for a in op.getarglist():
             if not isinstance(a, Const) and a not in seen:
-                self.ensure_short_op_emitted(self.short_boxes[a], optimizer, seen)
+                self.ensure_short_op_emitted(self.short_boxes.producer(a), optimizer, seen)
         optimizer.send_extra_operation(op)
         seen[op.result] = True
         if op.is_ovf():
@@ -444,13 +436,13 @@
                 return None
         for a in op.getarglist():
             if not isinstance(a, Const) and a not in short_seen:
-                self.add_op_to_short(self.short_boxes[a], short, short_seen,
+                self.add_op_to_short(self.short_boxes.producer(a), short, short_seen,
                                      emit, guards_needed)
         if op.is_guard():
             descr = self.start_resumedescr.clone_if_mutable()
             op.setdescr(descr)
 
-        if guards_needed and op.result in self.short_boxes:
+        if guards_needed and self.short_boxes.has_producer(op.result):
             value_guards = self.getvalue(op.result).make_guards(op.result)
         else:
             value_guards = []            
@@ -482,7 +474,7 @@
         if box in self.boxes_created_this_iteration:
             return
 
-        short_op = self.short_boxes[box]
+        short_op = self.short_boxes.producer(box)
         newresult = self.add_op_to_short(short_op, short, short_seen)
         
         short_jumpargs.append(short_op.result)
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -431,3 +431,55 @@
     def make_varray(self, arraydescr):
         return VArrayStateInfo(arraydescr)
 
+class BoxNotProducable(Exception):
+    pass
+
+class ShortBoxes(object):
+    def __init__(self, optimizer, surviving_boxes):
+        self.potential_ops = {}
+        optimizer.produce_potential_short_preamble_ops(self)
+            
+        self.short_boxes = {}
+        for box in surviving_boxes:
+            self.short_boxes[box] = None
+
+        for box in self.potential_ops.keys():
+            try:
+                self.produce_short_preamble_box(box)
+            except BoxNotProducable:
+                pass
+
+    def produce_short_preamble_box(self, box):
+        if box in self.short_boxes:
+            return 
+        if isinstance(box, Const):
+            return 
+        if box in self.potential_ops:
+            op = self.potential_ops[box]
+            for arg in op.getarglist():
+                self.produce_short_preamble_box(arg)
+            self.short_boxes[box] = op
+        else:
+            raise BoxNotProducable
+
+    def add_potential(self, op):
+        self.potential_ops[op.result] = op
+
+    def debug_print(self, logops):
+        debug_start('jit-short-boxes')
+        for box, op in self.short_boxes.items():
+            if op:
+                debug_print(logops.repr_of_arg(box) + ': ' + logops.repr_of_resop(op))
+            else:
+                debug_print(logops.repr_of_arg(box) + ': None')
+        debug_stop('jit-short-boxes')
+        
+    def operations(self):
+        return self.short_boxes.values()
+
+    def producer(self, box):
+        return self.short_boxes[box]
+
+    def has_producer(self, box):
+        return box in self.short_boxes
+    
diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -2799,9 +2799,6 @@
         self.check_loops(arraylen_gc=1)
 
         
-
-
-
 class TestOOtype(BasicTests, OOJitMixin):
 
     def test_oohash(self):


More information about the pypy-commit mailing list