[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