Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r45995:27cc4adf52fe
Date: 2011-07-25 19:25 -0700
http://bitbucket.org/pypy/pypy/changeset/27cc4adf52fe/
Log: When a newstr is allocated in the JIT, we can propogate the strlen,
even if it isn't a constant.
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -4593,6 +4593,9 @@
setfield_gc(p0, p1, descr=valuedescr)
jump(p0)
"""
+ # It used to be the case that this would have a series of
+ # strsetitem(p1, idx, 0), which was silly because memory is 0 filled
+ # when allocated.
expected = """
[p0]
p1 = newstr(4)
@@ -4601,6 +4604,24 @@
"""
self.optimize_loop(ops, expected)
+ def test_newstr_strlen(self):
+ ops = """
+ [i0]
+ p0 = newstr(i0)
+ escape(p0)
+ i1 = strlen(p0)
+ i2 = int_add(i1, 1)
+ jump(i2)
+ """
+ expected = """
+ [i0]
+ p0 = newstr(i0)
+ escape(p0)
+ i1 = int_add(i0, 1)
+ jump(i1)
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py
b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -399,6 +399,7 @@
else:
self.getvalue(op.result).ensure_nonnull()
self.emit_operation(op)
+ self.pure(mode.STRLEN, [op.result], op.getarg(0))
def optimize_STRSETITEM(self, op):
value = self.getvalue(op.getarg(0))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit