[pypy-svn] r70306 - in pypy/branch/jit-delayed-write/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Mon Dec 28 17:34:51 CET 2009
Author: arigo
Date: Mon Dec 28 17:34:49 2009
New Revision: 70306
Modified:
pypy/branch/jit-delayed-write/pypy/jit/metainterp/optimizeopt.py
pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
hackish: reverse the order of the last two operations if it makes
sense to avoid a situation like "int_eq/setfield_gc/guard_true"
which the backend (at least the x86 backend) is not good at handling.
Modified: pypy/branch/jit-delayed-write/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/branch/jit-delayed-write/pypy/jit/metainterp/optimizeopt.py Mon Dec 28 17:34:49 2009
@@ -978,7 +978,7 @@
self.force_all_lazy_setfields()
self.clean_caches()
- def force_lazy_setfield(self, descr):
+ def force_lazy_setfield(self, descr, before_guard=False):
try:
op = self.lazy_setfields[descr]
except KeyError:
@@ -988,6 +988,18 @@
if isinstance(fieldvalue, AbstractVirtualValue):
fieldvalue.backstore_field = None
self.optimizer._emit_operation(op)
+ #
+ # hackish: reverse the order of the last two operations if it makes
+ # sense to avoid the situation "int_eq/setfield_gc/guard_true"
+ newoperations = self.optimizer.newoperations
+ if before_guard and len(newoperations) >= 2:
+ lastop = newoperations[-1]
+ prevop = newoperations[-2]
+ if prevop.is_always_pure() and prevop.result not in lastop.args:
+ del newoperations[-1]
+ del newoperations[-1]
+ newoperations.append(lastop)
+ newoperations.append(prevop)
def force_all_lazy_setfields(self):
if len(self.lazy_setfields_descrs) > 0:
@@ -1014,7 +1026,7 @@
if fieldvalue.backstore_field is descr:
# this is the case that can be handled by resume data
continue
- self.force_lazy_setfield(descr)
+ self.force_lazy_setfield(descr, before_guard=True)
def force_lazy_setfield_if_necessary(self, op, value, write=False):
try:
Modified: pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_optimizeopt.py Mon Dec 28 17:34:49 2009
@@ -1429,6 +1429,20 @@
"""
self.optimize_loop(ops, 'Not, Not, Not', expected)
+ def test_duplicate_setfield_residual_guard_3(self):
+ # test that the setfield_gc does not end up between int_eq and
+ # the following guard_true
+ ops = """
+ [p1, i1, i2, i3]
+ setfield_gc(p1, i1, descr=valuedescr)
+ i5 = int_eq(i3, 5)
+ guard_true(i5) []
+ i4 = int_neg(i2)
+ setfield_gc(p1, i2, descr=valuedescr)
+ jump(p1, i1, i2, i4)
+ """
+ self.optimize_loop(ops, 'Not, Not, Not, Not', ops)
+
def test_duplicate_setfield_aliasing(self):
# a case where aliasing issues (and not enough cleverness) mean
# that we fail to remove any setfield_gc
@@ -2088,20 +2102,20 @@
p2 = new_with_vtable(ConstClass(node_vtable))
setfield_gc(p2, i2, descr=valuedescr)
setfield_gc(p1, p2, descr=nextdescr)
- guard_true(i3, descr=fdescr) [p1]
+ guard_true(i3, descr=fdescr) []
i4 = int_neg(i2)
setfield_gc(p1, NULL, descr=nextdescr)
jump(p1, i2, i4)
"""
expected = """
[p1, i2, i3]
- guard_true(i3, descr=fdescr) [p1, i2]
+ guard_true(i3, descr=fdescr) [i2]
i4 = int_neg(i2)
setfield_gc(p1, NULL, descr=nextdescr)
jump(p1, i2, i4)
"""
self.optimize_loop(ops, 'Not, Not, Not', expected)
- self.check_expanded_fail_descr('''p1
+ self.check_expanded_fail_descr('''
where p2 is a node_vtable, valuedescr=i2 --> p1.nextdescr
''')
More information about the Pypy-commit
mailing list