[pypy-svn] pypy default: Change make_args_key() to return a non-resizable list (and check it in

arigo commits-noreply at bitbucket.org
Wed Dec 22 13:27:30 CET 2010


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r40179:4404e410c061
Date: 2010-12-22 13:27 +0100
http://bitbucket.org/pypy/pypy/changeset/4404e410c061/

Log:	Change make_args_key() to return a non-resizable list (and check it
	in optimizeutil.py), and optimize it a bit to remove an extra dict
	lookup. This may be kind of important, because make_args_key() seems
	to take 1/5th of the total time spent optimizing.

diff --git a/pypy/jit/metainterp/optimizeutil.py b/pypy/jit/metainterp/optimizeutil.py
--- a/pypy/jit/metainterp/optimizeutil.py
+++ b/pypy/jit/metainterp/optimizeutil.py
@@ -3,6 +3,7 @@
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.jit.metainterp import resoperation, history
 from pypy.jit.metainterp.jitexc import JitException
+from pypy.rlib.debug import make_sure_not_resized
 
 class InvalidLoop(JitException):
     """Raised when the optimize*.py detect that the loop that
@@ -68,6 +69,8 @@
 # ____________________________________________________________
 
 def args_eq(args1, args2):
+    make_sure_not_resized(args1)
+    make_sure_not_resized(args2)
     if len(args1) != len(args2):
         return False
     for i in range(len(args1)):
@@ -84,6 +87,7 @@
     return True
 
 def args_hash(args):
+    make_sure_not_resized(args)
     res = 0x345678
     for arg in args:
         if isinstance(arg, history.Const):
@@ -95,5 +99,3 @@
 
 def args_dict():
     return r_dict(args_eq, args_hash)
-
-

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
@@ -380,14 +380,18 @@
         return op
 
     def make_args_key(self, op):
-        args = []
-        for i in range(op.numargs()):
+        n = op.numargs()
+        args = [None] * (n + 1)
+        for i in range(n):
             arg = op.getarg(i)
-            if arg in self.values:
-                args.append(self.values[arg].get_key_box())
+            try:
+                value = self.values[arg]
+            except KeyError:
+                pass
             else:
-                args.append(arg)
-        args.append(ConstInt(op.getopnum()))
+                arg = value.get_key_box()
+            args[i] = arg
+        args[n] = ConstInt(op.getopnum())
         return args
 
     def optimize_default(self, op):


More information about the Pypy-commit mailing list