[pypy-commit] pypy jit-optimizeopt-cleanups: pospone ops instead of reordering already emitted ops
hakanardo
noreply at buildbot.pypy.org
Thu Sep 22 21:19:09 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-optimizeopt-cleanups
Changeset: r47405:8dfeb716d0ab
Date: 2011-09-22 21:18 +0200
http://bitbucket.org/pypy/pypy/changeset/8dfeb716d0ab/
Log: pospone ops instead of reordering already emitted ops
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -158,6 +158,7 @@
self._lazy_setfields_and_arrayitems = []
self._remove_guard_not_invalidated = False
self._seen_guard_not_invalidated = False
+ self.posponedop = None
def force_at_end_of_preamble(self):
self.force_all_lazy_setfields_and_arrayitems()
@@ -211,7 +212,14 @@
def emit_operation(self, op):
self.emitting_operation(op)
- self.next_optimization.propagate_forward(op)
+ if self.posponedop:
+ self.next_optimization.propagate_forward(self.posponedop)
+ self.posponedop = None
+ if (op.is_comparison() or op.getopnum() == rop.CALL_MAY_FORCE
+ or op.is_ovf()):
+ self.posponedop = op
+ else:
+ self.next_optimization.propagate_forward(op)
def emitting_operation(self, op):
if op.has_no_side_effect():
@@ -293,30 +301,6 @@
if indexvalue is None or indexvalue.intbound.contains(idx):
cf.force_lazy_setfield(self, can_cache)
- def fixup_guard_situation(self):
- # 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) does not handle well.
- newoperations = self.optimizer.newoperations
- if len(newoperations) < 2:
- return
- lastop = newoperations[-1]
- if (lastop.getopnum() != rop.SETFIELD_GC and
- lastop.getopnum() != rop.SETARRAYITEM_GC):
- return
- # - is_comparison() for cases like "int_eq/setfield_gc/guard_true"
- # - CALL_MAY_FORCE: "call_may_force/setfield_gc/guard_not_forced"
- # - is_ovf(): "int_add_ovf/setfield_gc/guard_no_overflow"
- prevop = newoperations[-2]
- opnum = prevop.getopnum()
- if not (prevop.is_comparison() or opnum == rop.CALL_MAY_FORCE
- or prevop.is_ovf()):
- return
- if prevop.result in lastop.getarglist():
- return
- newoperations[-2] = lastop
- newoperations[-1] = prevop
-
def _assert_valid_cf(self, cf):
# check that 'cf' is in cached_fields or cached_arrayitems
if not we_are_translated():
@@ -362,7 +346,6 @@
fieldvalue.get_key_box(), itemindex))
else:
cf.force_lazy_setfield(self)
- self.fixup_guard_situation()
return pendingfields
def optimize_GETFIELD_GC(self, op):
More information about the pypy-commit
mailing list