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

hakanardo at codespeak.net hakanardo at codespeak.net
Thu Sep 23 16:46:10 CEST 2010


Author: hakanardo
Date: Thu Sep 23 16:46:08 2010
New Revision: 77301

Modified:
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_basic.py
Log:
Moving guards requires updating fail_args aswell. Dissabling for now.

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	Thu Sep 23 16:46:08 2010
@@ -42,18 +42,17 @@
                 jmp.descr = loop.token
                 preamble.operations.append(jmp)
 
-        elif (op.is_always_pure() or op.is_foldable_guard() or
-              op.is_ovf()):
+        elif (op.is_always_pure()):# or op.is_foldable_guard() or op.is_ovf()):
             if self.has_invariant_args(op):
                 self.emit_invariant(op)
                 return
 
-        elif op.is_guard_overflow():
-            prev_op = self.optimizer.loop.operations[self.optimizer.i - 1]
-            v = self.getvalue(prev_op.result)
-            if v.invariant:
-                self.emit_invariant(op)
-                return
+        #elif op.is_guard_overflow():
+        #    prev_op = self.optimizer.loop.operations[self.optimizer.i - 1]
+        #    v = self.getvalue(prev_op.result)
+        #    if v.invariant:
+        #        self.emit_invariant(op)
+        #        return
             
         self.emit_operation(op)
 

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/optimizer.py	Thu Sep 23 16:46:08 2010
@@ -342,10 +342,11 @@
         elif op.returns_bool_result():
             self.bool_boxes[self.getvalue(op.result)] = None
         if op.invariant:
+            op.invariant = False
             self.preamble.append(op)
         else:
             self.newoperations.append(op)
-
+            
     def store_final_boxes_in_guard(self, op):
         ###pendingfields = self.heap_op_optimizer.force_lazy_setfields_for_guard()
         descr = op.descr

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	Thu Sep 23 16:46:08 2010
@@ -321,6 +321,25 @@
                           'int_mul': 1,
                           'jump': 2})
 
+    def test_loop_invariant_mul_ovf(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)
+                b = y * 2
+                res += ovfcheck(x * x) + b
+                y -= 1
+            return res
+        res = self.meta_interp(f, [6, 7])
+        assert res == 308
+        self.check_loop_count(2)
+        self.check_loops({'guard_true': 1,
+                          'int_add': 1, 'int_sub': 1, 'int_gt': 1,
+                          'int_mul': 1,
+                          'jump': 2})
+
     def test_loop_invariant_intbox(self):
         myjitdriver = JitDriver(greens = [], reds = ['y', 'res', 'x'])
         class I:



More information about the Pypy-commit mailing list