[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