[pypy-commit] pypy default: merge
fijal
noreply at buildbot.pypy.org
Thu Dec 18 09:16:26 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r75010:c3be2cabf20d
Date: 2014-12-18 10:15 +0200
http://bitbucket.org/pypy/pypy/changeset/c3be2cabf20d/
Log: merge
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -483,11 +483,14 @@
self.emit_operation(op)
def _optimize_CALL_ARRAYCOPY(self, op):
+ length = self.get_constant_box(op.getarg(5))
+ if length and length.getint() == 0:
+ return True # 0-length arraycopy
+
source_value = self.getvalue(op.getarg(1))
dest_value = self.getvalue(op.getarg(2))
source_start_box = self.get_constant_box(op.getarg(3))
dest_start_box = self.get_constant_box(op.getarg(4))
- length = self.get_constant_box(op.getarg(5))
extrainfo = op.getdescr().get_extra_info()
if (source_start_box and dest_start_box
and length and (dest_value.is_virtual() or length.getint() <= 8) and
@@ -498,6 +501,8 @@
dest_start = dest_start_box.getint()
# XXX fish fish fish
arraydescr = extrainfo.write_descrs_arrays[0]
+ if arraydescr.is_array_of_structs():
+ return False # not supported right now
for index in range(length.getint()):
if source_value.is_virtual():
assert isinstance(source_value, VArrayValue)
@@ -527,8 +532,6 @@
descr=arraydescr)
self.emit_operation(newop)
return True
- if length and length.getint() == 0:
- return True # 0-length arraycopy
return False
def optimize_CALL_PURE(self, op):
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
@@ -999,6 +999,40 @@
"""
self.optimize_loop(ops, expected)
+ def test_virtual_array_of_struct_arraycopy(self):
+ ops = """
+ [f0, f1]
+ p0 = new_array_clear(3, descr=complexarraydescr)
+ setinteriorfield_gc(p0, 0, f0, descr=compleximagdescr)
+ setinteriorfield_gc(p0, 0, f1, descr=complexrealdescr)
+ call(0, p0, p0, 0, 2, 1, descr=complexarraycopydescr)
+ f2 = getinteriorfield_gc(p0, 2, descr=complexrealdescr)
+ f3 = getinteriorfield_gc(p0, 2, descr=compleximagdescr)
+ escape(f2)
+ escape(f3)
+ finish(1)
+ """
+ expected = """
+ [f0, f1]
+ escape(f1)
+ escape(f0)
+ finish(1)
+ """
+ self.optimize_loop(ops, ops)
+ py.test.skip("XXX missing optimization: ll_arraycopy(array-of-structs)")
+
+ def test_nonvirtual_array_of_struct_arraycopy(self):
+ ops = """
+ [p0]
+ call(0, p0, p0, 0, 2, 1, descr=complexarraycopydescr)
+ f2 = getinteriorfield_gc(p0, 2, descr=compleximagdescr)
+ f3 = getinteriorfield_gc(p0, 2, descr=complexrealdescr)
+ escape(f2)
+ escape(f3)
+ finish(1)
+ """
+ self.optimize_loop(ops, ops)
+
def test_nonvirtual_1(self):
ops = """
[i]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -223,6 +223,10 @@
complexarraydescr = cpu.arraydescrof(complexarray)
complexrealdescr = cpu.interiorfielddescrof(complexarray, "real")
compleximagdescr = cpu.interiorfielddescrof(complexarray, "imag")
+ complexarraycopydescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
+ EffectInfo([], [complexarraydescr], [], [], [complexarraydescr], [],
+ EffectInfo.EF_CANNOT_RAISE,
+ oopspecindex=EffectInfo.OS_ARRAYCOPY))
rawarraydescr = cpu.arraydescrof(lltype.Array(lltype.Signed,
hints={'nolength': True}))
More information about the pypy-commit
mailing list