[pypy-svn] r77470 - in pypy/trunk/pypy: jit/metainterp jit/metainterp/test rlib

fijal at codespeak.net fijal at codespeak.net
Wed Sep 29 17:23:51 CEST 2010


Author: fijal
Date: Wed Sep 29 17:23:49 2010
New Revision: 77470

Added:
   pypy/trunk/pypy/jit/metainterp/optimize_nopspec.py
   pypy/trunk/pypy/jit/metainterp/test/test_loop_nopspec.py
Modified:
   pypy/trunk/pypy/jit/metainterp/optimizefindnode.py
   pypy/trunk/pypy/jit/metainterp/warmstate.py
   pypy/trunk/pypy/rlib/jit.py
Log:
Have an optimization level which is normal, but does not perform perfect spec.


Added: pypy/trunk/pypy/jit/metainterp/optimize_nopspec.py
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/jit/metainterp/optimize_nopspec.py	Wed Sep 29 17:23:49 2010
@@ -0,0 +1,41 @@
+
+from pypy.rlib.debug import debug_start, debug_stop
+from pypy.jit.metainterp.optimizeopt import optimize_loop_1, optimize_bridge_1
+from pypy.jit.metainterp.optimizefindnode import PerfectSpecializationFinder
+from pypy.jit.metainterp.optimizefindnode import BridgeSpecializationFinder
+
+def optimize_loop(metainterp_sd, old_loop_tokens, loop):
+    debug_start("jit-optimize")
+    try:
+        return _optimize_loop(metainterp_sd, old_loop_tokens, loop)
+    finally:
+        debug_stop("jit-optimize")
+
+def _optimize_loop(metainterp_sd, old_loop_tokens, loop):
+    cpu = metainterp_sd.cpu
+    metainterp_sd.logger_noopt.log_loop(loop.inputargs, loop.operations)
+    finder = PerfectSpecializationFinder(cpu)
+    finder.find_nodes_loop(loop, False)
+    if old_loop_tokens:
+        return old_loop_tokens[0]
+    optimize_loop_1(metainterp_sd, loop)
+    return None
+
+def optimize_bridge(metainterp_sd, old_loop_tokens, bridge):
+    debug_start("jit-optimize")
+    try:
+        return _optimize_bridge(metainterp_sd, old_loop_tokens, bridge)
+    finally:
+        debug_stop("jit-optimize")
+
+def _optimize_bridge(metainterp_sd, old_loop_tokens, bridge):
+    cpu = metainterp_sd.cpu    
+    metainterp_sd.logger_noopt.log_loop(bridge.inputargs, bridge.operations)
+    finder = BridgeSpecializationFinder(cpu)
+    finder.find_nodes_bridge(bridge)
+    if old_loop_tokens:
+        old_loop_token = old_loop_tokens[0]
+        bridge.operations[-1].setdescr(old_loop_token)   # patch jump target
+        optimize_bridge_1(metainterp_sd, bridge)
+        return old_loop_token
+    return None

Modified: pypy/trunk/pypy/jit/metainterp/optimizefindnode.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/optimizefindnode.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/optimizefindnode.py	Wed Sep 29 17:23:49 2010
@@ -319,11 +319,12 @@
 class PerfectSpecializationFinder(NodeFinder):
     node_fromstart = InstanceNode(fromstart=True)
 
-    def find_nodes_loop(self, loop):
+    def find_nodes_loop(self, loop, build_specnodes=True):
         self._loop = loop
         self.setup_input_nodes(loop.inputargs)
         self.find_nodes(loop.operations)
-        self.build_result_specnodes(loop)
+        if build_specnodes:
+            self.build_result_specnodes(loop)
 
     def show(self):
         from pypy.jit.metainterp.viewnode import viewnodes, view

Added: pypy/trunk/pypy/jit/metainterp/test/test_loop_nopspec.py
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/jit/metainterp/test/test_loop_nopspec.py	Wed Sep 29 17:23:49 2010
@@ -0,0 +1,27 @@
+
+from pypy.jit.metainterp.test import test_loop, test_send
+from pypy.jit.metainterp.warmspot import ll_meta_interp
+from pypy.rlib.jit import OPTIMIZER_NO_PERFECTSPEC
+from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
+
+class LoopNoPSpecTest(test_send.SendTests):
+    def meta_interp(self, func, args, **kwds):
+        return ll_meta_interp(func, args, optimizer=OPTIMIZER_NO_PERFECTSPEC,
+                              CPUClass=self.CPUClass, 
+                              type_system=self.type_system,
+                              **kwds)
+
+    def check_loops(self, *args, **kwds):
+        pass
+
+    def check_loop_count(self, count):
+        pass
+
+    def check_jumps(self, maxcount):
+        pass
+
+class TestLLtype(LoopNoPSpecTest, LLJitMixin):
+    pass
+
+class TestOOtype(LoopNoPSpecTest, OOJitMixin):
+    pass

Modified: pypy/trunk/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/warmstate.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/warmstate.py	Wed Sep 29 17:23:49 2010
@@ -7,7 +7,8 @@
 from pypy.rlib.rarithmetic import intmask
 from pypy.rlib.nonconst import NonConstant
 from pypy.rlib.unroll import unrolling_iterable
-from pypy.rlib.jit import PARAMETERS, OPTIMIZER_SIMPLE, OPTIMIZER_FULL
+from pypy.rlib.jit import (PARAMETERS, OPTIMIZER_SIMPLE, OPTIMIZER_FULL,
+                           OPTIMIZER_NO_PERFECTSPEC)
 from pypy.rlib.jit import DEBUG_PROFILE
 from pypy.rlib.jit import BaseJitCell
 from pypy.rlib.debug import debug_start, debug_stop, debug_print
@@ -190,6 +191,10 @@
             from pypy.jit.metainterp import simple_optimize
             self.optimize_loop = simple_optimize.optimize_loop
             self.optimize_bridge = simple_optimize.optimize_bridge
+        elif optimizer == OPTIMIZER_NO_PERFECTSPEC:
+            from pypy.jit.metainterp import optimize_nopspec
+            self.optimize_loop = optimize_nopspec.optimize_loop
+            self.optimize_bridge = optimize_nopspec.optimize_bridge
         elif optimizer == OPTIMIZER_FULL:
             from pypy.jit.metainterp import optimize
             self.optimize_loop = optimize.optimize_loop

Modified: pypy/trunk/pypy/rlib/jit.py
==============================================================================
--- pypy/trunk/pypy/rlib/jit.py	(original)
+++ pypy/trunk/pypy/rlib/jit.py	Wed Sep 29 17:23:49 2010
@@ -224,7 +224,8 @@
     """Inconsistency in the JIT hints."""
 
 OPTIMIZER_SIMPLE = 0
-OPTIMIZER_FULL = 1
+OPTIMIZER_NO_PERFECTSPEC = 1
+OPTIMIZER_FULL = 2
 
 DEBUG_OFF = 0
 DEBUG_PROFILE = 1



More information about the Pypy-commit mailing list