[pypy-commit] pypy default: Handle the case of a copy from virtual to concrete efficiently withs trings
alex_gaynor
noreply at buildbot.pypy.org
Tue Nov 5 16:25:27 CET 2013
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch:
Changeset: r67851:32c25a0ac64a
Date: 2013-11-05 07:24 -0800
http://bitbucket.org/pypy/pypy/changeset/32c25a0ac64a/
Log: Handle the case of a copy from virtual to concrete efficiently withs
trings
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5122,6 +5122,21 @@
"""
self.optimize_strunicode_loop(ops, expected)
+ def test_str_copy_virtual_src_concrete_dst(self):
+ ops = """
+ [p0]
+ p1 = newstr(1)
+ strsetitem(p1, 0, 101)
+ copystrcontent(p1, p0, 0, 0, 1)
+ finish(p0)
+ """
+ expected = """
+ [p0]
+ strsetitem(p0, 0, 101)
+ finish(p0)
+ """
+ self.optimize_strunicode_loop(ops, expected)
+
def test_call_pure_vstring_const(self):
py.test.skip("implement me")
ops = """
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -516,7 +516,6 @@
if length.is_constant() and length.box.getint() == 0:
return
elif ((src.is_virtual() or src.is_constant()) and
- isinstance(dst, VStringPlainValue) and dst.is_virtual() and
srcstart.is_constant() and dststart.is_constant() and
length.is_constant()):
src_start = srcstart.force_box(self).getint()
@@ -527,7 +526,15 @@
assert actual_length <= MAX_CONST_LEN
for index in range(actual_length):
vresult = self.strgetitem(src, optimizer.ConstantValue(ConstInt(index + src_start)), mode)
- dst.setitem(index + dst_start, vresult)
+ if isinstance(dst, VStringPlainValue):
+ dst.setitem(index + dst_start, vresult)
+ else:
+ op = ResOperation(mode.STRSETITEM, [
+ op.getarg(1),
+ ConstInt(index + dst_start),
+ vresult.force_box(self),
+ ], None)
+ self.emit_operation(op)
else:
copy_str_content(self,
src.force_box(self),
@@ -752,9 +759,11 @@
def propagate_forward(self, op):
dispatch_opt(self, op)
+
dispatch_opt = make_dispatcher_method(OptString, 'optimize_',
default=OptString.emit_operation)
+
def _findall_call_oopspec():
prefix = 'opt_call_stroruni_'
result = []
More information about the pypy-commit
mailing list