[pypy-svn] r77374 - in pypy/branch/jit-loop-invaraints/pypy/jit/metainterp: . optimizeopt test

hakanardo at codespeak.net hakanardo at codespeak.net
Sun Sep 26 10:51:37 CEST 2010


Author: hakanardo
Date: Sun Sep 26 10:51:35 2010
New Revision: 77374

Modified:
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/compile.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/history.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimize.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/simple_optimize.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/warmstate.py
Log:
Passing all metainterp tests except optimizeopt

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/compile.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/compile.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/compile.py	Sun Sep 26 10:51:35 2010
@@ -501,9 +501,7 @@
         new_loop.greenkey = self.original_greenkey
         new_loop.inputargs = self.redkey
         new_loop.token = new_loop_token
-        print
-        print "HEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRR"
-        print new_loop_token
+
         send_loop_to_backend(metainterp_sd, new_loop, "entry bridge")
         # send the new_loop to warmspot.py, to be called directly the next time
         jitdriver_sd.warmstate.attach_unoptimized_bridge_from_interp(
@@ -535,13 +533,10 @@
     new_loop.operations = [op.clone() for op in metainterp.history.operations]
     metainterp_sd = metainterp.staticdata
     state = metainterp.jitdriver_sd.warmstate
-    debug_print("\ncnb: ")
     try:
         target_loop_token = state.optimize_bridge(metainterp_sd,
                                                   old_loop_tokens,
                                                   new_loop)
-        debug_print("cnb: ", new_loop.operations[-1], target_loop_token)
-
     except InvalidLoop:
         # XXX I am fairly convinced that optimize_bridge cannot actually raise
         # InvalidLoop

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/history.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/history.py	Sun Sep 26 10:51:35 2010
@@ -120,7 +120,8 @@
         raise NotImplementedError
 
 class AbstractDescr(AbstractValue):
-    __slots__ = ()
+    __slots__ = ('inlinable',)
+    inlinable = None
 
     def repr_of_descr(self):
         return '%r' % (self,)
@@ -703,7 +704,6 @@
     # specnodes = ...
     # and more data specified by the backend when the loop is compiled
     number = 0
-    inlinable = None
 
     def __init__(self, number=0):
         self.number = number

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimize.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimize.py	Sun Sep 26 10:51:35 2010
@@ -1,4 +1,4 @@
-from pypy.rlib.debug import debug_start, debug_stop
+from pypy.rlib.debug import debug_start, debug_stop, debug_print
 
 # ____________________________________________________________
 

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py	Sun Sep 26 10:51:35 2010
@@ -2,6 +2,7 @@
 from pypy.jit.metainterp.resoperation import rop, ResOperation
 from pypy.jit.metainterp.compile import prebuiltNotSpecNode
 from pypy.rlib.debug import debug_print
+from pypy.jit.metainterp.history import Const
 
 class OptInvariant(Optimization):
     """Move loop invariant code into a preamble.
@@ -25,16 +26,7 @@
                 v = self.getvalue(arg_in)
                 v.invariant = True
 
-    def invariant_boxes(self):
-        invariant_boxes = []
-        for op in self.optimizer.preamble:
-            if self.get_constant_box(op.result) is None:
-                v = self.getvalue(op.result)
-                v.invariant = True
-                box = v.force_box() 
-                if box and box not in invariant_boxes:
-                    invariant_boxes.append(box)
-        return invariant_boxes
+        self.invariant_boxes = []
 
     def propagate_forward(self, op):
     
@@ -46,7 +38,7 @@
                 preamble = loop.preamble
                 preamble.inputargs = loop.inputargs[:]
 
-                invariant_boxes = self.invariant_boxes()
+                invariant_boxes = self.invariant_boxes
                 loop.inputargs.extend(invariant_boxes)
                 op.args = op.args + invariant_boxes
                 preamble.operations = self.optimizer.preamble
@@ -79,6 +71,10 @@
                 if self.get_constant_box(op.result) is None:
                     v = self.getvalue(op.result)
                     v.invariant = True
+                    box = v.force_box() 
+                    if box and box not in self.invariant_boxes:
+                        self.invariant_boxes.append(box)
+
                 return
 
 
@@ -107,7 +103,10 @@
            argmap[loop.inputargs[i]] = inputargs[i]
         for op in loop.operations:
             newop = op.clone()
-            newop.args = [argmap[a] for a in op.args]
+            for i in range(len(op.args)):
+                a = op.args[i]
+                if not isinstance(a, Const):
+                    newop.args[i] = argmap[a]
             if op.result:
                 newop.result = op.result.clonebox()
                 argmap[op.result] = newop.result

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/simple_optimize.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/simple_optimize.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/simple_optimize.py	Sun Sep 26 10:51:35 2010
@@ -4,6 +4,7 @@
 
 from pypy.jit.metainterp.resoperation import rop, ResOperation
 from pypy.jit.metainterp import resume, compile
+from pypy.rlib.debug import debug_print
 
 EMPTY_VALUES = {}
 
@@ -47,4 +48,5 @@
 
 def optimize_bridge(metainterp_sd, old_loops, loop):
     optimize_loop(metainterp_sd, [], loop)
+    loop.operations[-1].descr = old_loops[0]
     return old_loops[0]

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py	Sun Sep 26 10:51:35 2010
@@ -340,7 +340,7 @@
                           'int_mul': 1, 'int_mul_ovf': 1,
                           'jump': 1})
 
-    def test_loop_invariant_mul_guard(self):
+    def test_loop_invariant_mul_bridge1(self):
         myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
         def f(x, y):
             res = 0
@@ -356,6 +356,26 @@
         assert res == 919
         self.check_loop_count(3)
 
+    def test_loop_invariant_mul_bridge_maintaining(self):
+        myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
+        def f(x, y):
+            res = 0
+            while y > 0:
+                myjitdriver.can_enter_jit(x=x, y=y, res=res)
+                myjitdriver.jit_merge_point(x=x, y=y, res=res)
+                res += x * x
+                if y<8:
+                    res += 1
+                y -= 1
+            return res
+        res = self.meta_interp(f, [6, 16])
+        assert res == 583
+        self.check_loop_count(3)
+        self.check_loops({'int_lt': 1, 'int_gt': 1,
+                          'guard_false': 1, 'guard_true': 1,
+                          'int_sub': 2, 'int_mul': 2, 'int_add': 2,
+                          'jump': 3})
+
     def test_loop_invariant_intbox(self):
         myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
         class I:

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/warmstate.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/warmstate.py	Sun Sep 26 10:51:35 2010
@@ -13,6 +13,7 @@
 from pypy.rlib.debug import debug_start, debug_stop, debug_print
 from pypy.jit.metainterp import history
 from pypy.jit.codewriter import support, heaptracker
+from pypy.rlib.debug import debug_print
 
 # ____________________________________________________________
 



More information about the Pypy-commit mailing list