[pypy-commit] pypy default: Unroll list.count() when the list is virtual or very small and constant lenght

alex_gaynor noreply at buildbot.pypy.org
Fri Aug 30 00:47:43 CEST 2013


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: 
Changeset: r66432:185512e0c4df
Date: 2013-08-29 15:47 -0700
http://bitbucket.org/pypy/pypy/changeset/185512e0c4df/

Log:	Unroll list.count() when the list is virtual or very small and
	constant lenght

diff --git a/pypy/module/pypyjit/test_pypy_c/test_containers.py b/pypy/module/pypyjit/test_pypy_c/test_containers.py
--- a/pypy/module/pypyjit/test_pypy_c/test_containers.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_containers.py
@@ -241,3 +241,22 @@
         loop, = log.loops_by_filename(self.filepath)
         ops = loop.ops_by_id('getitem', include_guard_not_invalidated=False)
         assert log.opnames(ops) == []
+
+    def test_list_count_virtual_list(self):
+        def main(n):
+            i = 0
+            while i < n:
+                i += [n].count(n)
+            return i
+
+        log = self.run(main, [1000])
+        assert log.result == main(1000)
+        loop, = log.loops_by_filename(self.filepath)
+        assert loop.match("""
+            i7 = int_lt(i5, i6)
+            guard_true(i7, descr=...)
+            guard_not_invalidated(descr=...)
+            i9 = int_add(i5, 1)
+            --TICK--
+            jump(..., descr=...)
+        """)
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -562,6 +562,8 @@
         'L.reverse() -- reverse *IN PLACE*'
         self.reverse()
 
+    @jit.look_inside_iff(lambda self, space, w_value:
+            jit.loop_unrolling_heuristic(self, self.length(), UNROLL_CUTOFF))
     def descr_count(self, space, w_value):
         '''L.count(value) -> integer -- return number of
         occurrences of value'''


More information about the pypy-commit mailing list