[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