[pypy-svn] r77255 - in pypy/branch/jit-loop-invaraints/pypy: jit/metainterp/optimizeopt jit/metainterp/test module/pypyjit/test

hakanardo at codespeak.net hakanardo at codespeak.net
Tue Sep 21 22:22:35 CEST 2010


Author: hakanardo
Date: Tue Sep 21 22:22:33 2010
New Revision: 77255

Modified:
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/optimizeopt/invariant.py
   pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_optimizeopt.py
   pypy/branch/jit-loop-invaraints/pypy/module/pypyjit/test/test_pypy_c.py
Log:
Moving most guards and *_ovf too.

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	Tue Sep 21 22:22:33 2010
@@ -42,24 +42,39 @@
                 jmp.descr = loop.token
                 preamble.operations.append(jmp)
 
-        elif op.is_always_pure():
-            for a in op.args:
-                if self.get_constant_box(a) is None:
-                    if a not in self.optimizer.values:
-                        break
-                    v = self.getvalue(a)
-                    if not v.invariant:
-                        break
-            else:
-                print "P: ", op, op.opnum
-                op.invariant = True
-                self.emit_operation(op)
-                if self.get_constant_box(op.result) is None:
-                    v = self.getvalue(op.result)
-                    v.invariant = True
-                    box = v.force_box() 
-                    if box not in self.invariant_boxes:
-                        self.invariant_boxes.append(box)
+        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
             
         self.emit_operation(op)
+
+    def emit_invariant(self, op):
+        print "P: ", op, op.opnum
+        op.invariant = True
+        self.emit_operation(op)
+        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)
+            
+    def has_invariant_args(self, op):
+        for a in op.args:
+            if self.get_constant_box(a) is None:
+                if a not in self.optimizer.values:
+                    return False
+                v = self.getvalue(a)
+                if not v.invariant:
+                    return False
+        return True
+        

Modified: pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/jit/metainterp/test/test_optimizeopt.py	Tue Sep 21 22:22:33 2010
@@ -3870,6 +3870,22 @@
         """
         self.optimize_loop(ops, 'Not, Not', expected)
 
+    def test_loop_invariant_ovf(self):
+        ops = """
+        [i0, i1]
+        i2 = int_add_ovf(i0, i0)
+        guard_no_overflow() []
+        i3 = int_add_ovf(i2, i1)
+        guard_no_overflow() []
+        jump(i0, i3)
+        """
+        expected = """
+        [i0, i1, i2]
+        i3 = int_add_ovf(i2, i1)
+        guard_no_overflow() []
+        jump(i0, i3, i2)
+        """
+        self.optimize_loop(ops, 'Not, Not', expected)
 
 
 

Modified: pypy/branch/jit-loop-invaraints/pypy/module/pypyjit/test/test_pypy_c.py
==============================================================================
--- pypy/branch/jit-loop-invaraints/pypy/module/pypyjit/test/test_pypy_c.py	(original)
+++ pypy/branch/jit-loop-invaraints/pypy/module/pypyjit/test/test_pypy_c.py	Tue Sep 21 22:22:33 2010
@@ -1122,7 +1122,7 @@
                 sa += a*a
                 i += 1
             return sa
-        ''', 34, ([2], 8000))
+        ''', 35, ([2], 8000))
 
     def test_invariant_mul_bridge(self):
         self.run_source('''
@@ -1135,7 +1135,7 @@
                     a = 7
                 i += 1
             return sa
-        ''', 61, ([2], 105910))
+        ''', 62, ([2], 105910))
 
         
 



More information about the Pypy-commit mailing list