[pypy-svn] pypy jit-short_from_state: getarrayitem support
hakanardo
commits-noreply at bitbucket.org
Sat Apr 16 17:24:15 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r43400:cffe68e8c562
Date: 2011-04-16 17:23 +0200
http://bitbucket.org/pypy/pypy/changeset/cffe68e8c562/
Log: getarrayitem support
diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py b/pypy/jit/metainterp/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/test/test_optimizeopt.py
@@ -2174,6 +2174,39 @@
jump(p1)
"""
self.optimize_loop(ops, expected)
+
+ def test_duplicate_getarrayitem_2(self):
+ ops = """
+ [p1, i0]
+ i2 = getarrayitem_gc(p1, 0, descr=arraydescr2)
+ i3 = getarrayitem_gc(p1, 1, descr=arraydescr2)
+ i4 = getarrayitem_gc(p1, 0, descr=arraydescr2)
+ i5 = getarrayitem_gc(p1, 1, descr=arraydescr2)
+ i6 = int_add(i3, i4)
+ i7 = int_add(i0, i6)
+ jump(p1, i7)
+ """
+ expected = """
+ [p1, i0, i6]
+ i7 = int_add(i0, i6)
+ jump(p1, i7, i6)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_duplicate_getarrayitem_3(self):
+ ops = """
+ [p1, i0, i10]
+ i2 = getarrayitem_gc(p1, i10, descr=arraydescr2)
+ i4 = getarrayitem_gc(p1, i10, descr=arraydescr2)
+ i7 = int_add(i0, i4)
+ jump(p1, i7, i10)
+ """
+ expected = """
+ [p1, i0, i10, i6]
+ i7 = int_add(i0, i6)
+ jump(p1, i7, i10, i6)
+ """
+ self.optimize_loop(ops, expected)
def test_duplicate_getarrayitem_after_setarrayitem_1(self):
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
@@ -4,7 +4,7 @@
from pypy.rlib.objectmodel import we_are_translated
from pypy.jit.metainterp.jitexc import JitException
from pypy.jit.metainterp.optimizeopt.optimizer import Optimization
-
+from pypy.jit.metainterp.history import ConstInt
class CachedField(object):
def __init__(self):
@@ -104,9 +104,8 @@
result = fieldvalue.get_key_box()
potential_ops[result] = ResOperation(rop.GETFIELD_GC,
[structvalue.get_key_box()],
- result,
- descr)
-
+ result, descr)
+
class CachedArrayItems(object):
def __init__(self):
@@ -164,6 +163,22 @@
def produce_potential_short_preamble_ops(self, potential_ops):
for descr, d in self.cached_fields.items():
d.produce_potential_short_preamble_ops(potential_ops, descr)
+ for descr, d in self.cached_arrayitems.items():
+ for value, cache in d.items():
+ for index, fieldvalue in cache.fixed_index_items.items():
+ result = fieldvalue.get_key_box()
+ op = ResOperation(rop.GETARRAYITEM_GC,
+ [value.get_key_box(), ConstInt(index)],
+ result, descr)
+ potential_ops[result] = op
+ if cache.var_index_item and cache.var_index_indexvalue:
+ result = cache.var_index_item.get_key_box()
+ op = ResOperation(rop.GETARRAYITEM_GC,
+ [value.get_key_box(),
+ cache.var_index_indexvalue.get_key_box()],
+ result, descr)
+ potential_ops[result] = op
+
def clean_caches(self):
del self._lazy_setfields[:]
More information about the Pypy-commit
mailing list