Author: Alex Gaynor <alex.gay...@gmail.com>
Branch: unroll-virtual-dict-resize
Changeset: r66846:42b97400acf7
Date: 2013-09-07 11:16 -0700
http://bitbucket.org/pypy/pypy/changeset/42b97400acf7/

Log:    Start hacking on this, doesn't work because heapcache doesn't handle
        GETINTERIORFIELD/SETINTERIOFIELD

diff --git a/rpython/jit/codewriter/support.py 
b/rpython/jit/codewriter/support.py
--- a/rpython/jit/codewriter/support.py
+++ b/rpython/jit/codewriter/support.py
@@ -522,8 +522,6 @@
         return LLtypeHelpers._dictnext_items(lltype.Ptr(RES), iter)
     _ll_1_dictiter_nextitems.need_result_type = True
 
-    _ll_1_dict_resize = ll_rdict.ll_dict_resize
-
     # ---------- strings and unicode ----------
 
     _ll_1_str_str2unicode = ll_rstr.LLHelpers.ll_str2unicode
diff --git a/rpython/jit/metainterp/heapcache.py 
b/rpython/jit/metainterp/heapcache.py
--- a/rpython/jit/metainterp/heapcache.py
+++ b/rpython/jit/metainterp/heapcache.py
@@ -27,6 +27,9 @@
         # heap array cache
         # maps descrs to {index: {from_box: to_box}} dicts
         self.heap_array_cache = {}
+        # heap array of struct cache
+        # maps descrs to {index: {descr: {from_box: to_box}}}
+        self.heap_array_struct_cache = {}
         # cache the length of arrays
         self.length_cache = {}
 
diff --git a/rpython/jit/metainterp/test/test_dict.py 
b/rpython/jit/metainterp/test/test_dict.py
--- a/rpython/jit/metainterp/test/test_dict.py
+++ b/rpython/jit/metainterp/test/test_dict.py
@@ -1,7 +1,6 @@
-import py
 from rpython.jit.metainterp.test.support import LLJitMixin
+from rpython.rlib import objectmodel, jit
 from rpython.rlib.jit import JitDriver
-from rpython.rlib import objectmodel
 
 class DictTests:
 
@@ -177,6 +176,29 @@
         self.check_simple_loop({'int_sub': 1, 'int_gt': 1, 'guard_true': 1,
                                 'jump': 1})
 
+    def test_look_inside_resize(self):
+        driver = JitDriver(greens=[], reds=['n', 'j'])
+
+        def f(n, j):
+            while n > 0:
+                driver.jit_merge_point(n=n, j=j)
+                jit.promote(j)
+                d = {
+                    j: j,
+                    j + 1: j,
+                    j + 2: j,
+                    j + 3: j,
+                    j + 4: j,
+                    j + 5: j
+                }
+                n -= (len(d) - 5)
+            return n
+
+        res = self.meta_interp(f, [10, 2], listops=True)
+        assert res == f(10, 2)
+        self.check_simple_loop({'int_sub': 1, 'int_gt': 1, 'guard_true': 1,
+                                'jump': 1})
+
 
 class TestLLtype(DictTests, LLJitMixin):
     pass
diff --git a/rpython/rtyper/lltypesystem/rdict.py 
b/rpython/rtyper/lltypesystem/rdict.py
--- a/rpython/rtyper/lltypesystem/rdict.py
+++ b/rpython/rtyper/lltypesystem/rdict.py
@@ -536,6 +536,7 @@
     # call which is opaque to the JIT when the dict isn't virtual, to
     # avoid extra branches.
 
+@jit.look_inside_iff(lambda d: jit.isvirtual(d))
 def ll_dict_resize(d):
     old_entries = d.entries
     old_size = len(old_entries)
@@ -560,7 +561,6 @@
             ll_dict_insertclean(d, entry.key, entry.value, hash)
         i += 1
     old_entries.delete()
-ll_dict_resize.oopspec = 'dict.resize(d)'
 
 # ------- a port of CPython's dictobject.c's lookdict implementation -------
 PERTURB_SHIFT = 5
@@ -627,6 +627,7 @@
             freeslot = intmask(i)
         perturb >>= PERTURB_SHIFT
 
+@jit.look_inside_iff(lambda d, hash: jit.isvirtual(d) and jit.isconstant(hash))
 def ll_dict_lookup_clean(d, hash):
     # a simplified version of ll_dict_lookup() which assumes that the
     # key is new, and the dictionary doesn't contain deleted entries.
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to