Author: Maciej Fijalkowski <fij...@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})) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit