[pypy-commit] pypy jit-optimizeopt-cleanups: digg results for GETARRAYITEM_GC_PURE out of the heap cache in case their corresponding setarrayitem was delayed
hakanardo
noreply at buildbot.pypy.org
Fri Sep 30 08:37:51 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-optimizeopt-cleanups
Changeset: r47699:4096286f422d
Date: 2011-09-30 08:35 +0200
http://bitbucket.org/pypy/pypy/changeset/4096286f422d/
Log: digg results for GETARRAYITEM_GC_PURE out of the heap cache in case
their corresponding setarrayitem was delayed
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
@@ -413,6 +413,25 @@
fieldvalue = self.getvalue(op.result)
cf.remember_field_value(arrayvalue, fieldvalue, op)
+ def optimize_GETARRAYITEM_GC_PURE(self, op):
+ arrayvalue = self.getvalue(op.getarg(0))
+ indexvalue = self.getvalue(op.getarg(1))
+ cf = None
+ if indexvalue.is_constant():
+ arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(), indexvalue.box.getint())
+ # use the cache on (arraydescr, index), which is a constant
+ cf = self.arrayitem_cache(op.getdescr(), indexvalue.box.getint())
+ fieldvalue = cf.getfield_from_cache(self, arrayvalue)
+ if fieldvalue is not None:
+ self.make_equal_to(op.result, fieldvalue)
+ return
+ else:
+ # variable index, so make sure the lazy setarrayitems are done
+ self.force_lazy_setarrayitem(op.getdescr(), indexvalue=indexvalue)
+ # default case: produce the operation
+ arrayvalue.ensure_nonnull()
+ self.emit_operation(op)
+
def optimize_SETARRAYITEM_GC(self, op):
if self.has_pure_result(rop.GETARRAYITEM_GC_PURE, [op.getarg(0),
op.getarg(1)],
More information about the pypy-commit
mailing list