[pypy-svn] pypy jit-short_from_state: short preamble will need key boxes aswell since they are used in the snapshots

hakanardo commits-noreply at bitbucket.org
Fri Apr 22 15:10:18 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r43535:89f55c6c0db4
Date: 2011-04-22 15:08 +0200
http://bitbucket.org/pypy/pypy/changeset/89f55c6c0db4/

Log:	short preamble will need key boxes aswell since they are used in the
	snapshots

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
@@ -175,7 +175,7 @@
         
             initial_inputargs_len = len(inputargs)
 
-            inputargs, short = self.inline(self.cloned_operations,
+            inputargs, short_inputargs, short = self.inline(self.cloned_operations,
                                            loop.inputargs, jump_args,
                                            virtual_state)
             #except KeyError:
@@ -225,9 +225,10 @@
                         short[i] = op
 
                 short_loop = TreeLoop('short preamble')
-                short_loop.inputargs = loop.inputargs[:initial_inputargs_len]
+                short_loop.inputargs = short_inputargs
                 short_loop.operations = short
 
+
                 # Clone ops and boxes to get private versions and 
                 newargs = [a.clonebox() for a in short_loop.inputargs]
                 inliner = Inliner(short_loop.inputargs, newargs)
@@ -261,6 +262,7 @@
         values = [self.getvalue(arg) for arg in jump_args]
         inputargs = virtual_state.make_inputargs(values)
         short_jumpargs = inputargs[:]
+        short_inputargs = virtual_state.make_inputargs(values, keyboxes=True)
 
         # This loop is equivalent to the main optimization loop in
         # Optimizer.propagate_all_forward
@@ -268,19 +270,21 @@
         for newop in loop_operations:
             newop = inliner.inline_op(newop, clone=False)
             if newop.getopnum() == rop.JUMP:
-                values = [self.getvalue(arg) for arg in newop.getarglist()]
-                newop.initarglist(virtual_state.make_inputargs(values))
                 jumpop = newop
                 break
 
             #self.optimizer.first_optimization.propagate_forward(newop)
             self.optimizer.send_extra_operation(newop)
-        assert jumpop
 
         self.boxes_created_this_iteration = {}
-        jumpargs = jumpop.getarglist()
 
-        self.short_inliner = Inliner(inputargs, jumpargs)
+        assert jumpop
+        values = [self.getvalue(arg) for arg in jumpop.getarglist()]
+        jumpargs = virtual_state.make_inputargs(values)
+        newop.initarglist(jumpargs)
+        jmp_to_short_args = virtual_state.make_inputargs(values, keyboxes=True)
+        self.short_inliner = Inliner(short_inputargs, jmp_to_short_args)
+        
         short = []
         short_seen = {}
         for box, const in self.constant_inputargs.items():
@@ -316,7 +320,7 @@
         jumpop.initarglist(jumpargs)
         self.optimizer.send_extra_operation(jumpop)
         short.append(ResOperation(rop.JUMP, short_jumpargs, None))
-        return inputargs, short
+        return inputargs, short_inputargs, short
 
     def add_op_to_short(self, op, short, short_seen):
         if op is None:
@@ -640,8 +644,11 @@
                         #if self.inline(sh.operations, sh.inputargs,
                         #               op.getarglist(), dryrun=True):
                         try:
-                            self.inline(sh.operations, sh.inputargs,
-                                        op.getarglist())
+                            values = [self.getvalue(arg)
+                                      for arg in op.getarglist()]
+                            args = virtual_state.make_inputargs(values,
+                                                                keyboxes=True)
+                            self.inline(sh.operations, sh.inputargs, args)
                         except InvalidLoop:
                             debug_print("Inlining failed unexpectedly",
                                         "jumping to preamble instead")

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
@@ -1703,7 +1703,7 @@
         res = self.meta_interp(g, [6, 14])
         assert res == g(6, 14)
         self.check_loop_count(9)
-        self.check_loops(getarrayitem_gc=6, everywhere=True)
+        self.check_loops(getarrayitem_gc=8, everywhere=True)
 
     def test_multiple_specialied_versions_bridge(self):
         myjitdriver = JitDriver(greens = [], reds = ['y', 'x', 'z', 'res'])

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
@@ -5,7 +5,7 @@
                                                       LEVEL_NONNULL, \
                                                       LEVEL_UNKNOWN, \
                                                       MININT, MAXINT
-from pypy.jit.metainterp.history import BoxInt, ConstInt, BoxPtr
+from pypy.jit.metainterp.history import BoxInt, ConstInt, BoxPtr, Const
 from pypy.jit.metainterp.optimizeutil import InvalidLoop
 from pypy.jit.metainterp.optimizeopt.intutils import IntBound
 from pypy.jit.metainterp.resoperation import rop, ResOperation
@@ -222,13 +222,20 @@
             self.state[i].generate_guards(other.state[i], args[i],
                                           cpu, extra_guards)
 
-    def make_inputargs(self, values):
+    def make_inputargs(self, values, keyboxes=False):
         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])
+            
+        if keyboxes:
+            for value in values:
+                box = value.get_key_box()
+                if box not in inputargs and not isinstance(box, Const):
+                    inputargs.append(box)
+            
         return inputargs
         
 


More information about the Pypy-commit mailing list