[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