From: Jakub Jelinek Date: Tue, 19 Jul 2016 17:42:26 +0000 (+0200) Subject: re PR middle-end/71874 (memmove works wrong) X-Git-Tag: releases/gcc-4.9.4~62 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4441d44804f2c3c4516f41ae1c0a1a69fc75aa8;p=thirdparty%2Fgcc.git re PR middle-end/71874 (memmove works wrong) PR middle-end/71874 * builtins.c (fold_builtin_memory_op): Use get_addr_base_and_unit_offset instead of get_ref_base_and_extent. * g++.dg/torture/pr71874.C: New test. From-SVN: r238487 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 77f8dfedc889..aec77f19d3d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-07-19 Jakub Jelinek + + PR middle-end/71874 + * builtins.c (fold_builtin_memory_op): Use + get_addr_base_and_unit_offset instead of get_ref_base_and_extent. + 2016-07-19 Martin Jambor PR fortran/71688 diff --git a/gcc/builtins.c b/gcc/builtins.c index 7d536398daa3..6c1d81794e7b 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -8793,21 +8793,21 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src, { tree src_base, dest_base, fn; HOST_WIDE_INT src_offset = 0, dest_offset = 0; - HOST_WIDE_INT size = -1; - HOST_WIDE_INT maxsize = -1; + HOST_WIDE_INT maxsize; srcvar = TREE_OPERAND (src, 0); - src_base = get_ref_base_and_extent (srcvar, &src_offset, - &size, &maxsize); + src_base = get_addr_base_and_unit_offset (srcvar, &src_offset); + if (src_base == NULL) + src_base = srcvar; destvar = TREE_OPERAND (dest, 0); - dest_base = get_ref_base_and_extent (destvar, &dest_offset, - &size, &maxsize); + dest_base = get_addr_base_and_unit_offset (destvar, + &dest_offset); + if (dest_base == NULL) + dest_base = destvar; if (tree_fits_uhwi_p (len)) maxsize = tree_to_uhwi (len); else maxsize = -1; - src_offset /= BITS_PER_UNIT; - dest_offset /= BITS_PER_UNIT; if (SSA_VAR_P (src_base) && SSA_VAR_P (dest_base)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 87cef82d544e..78e80bec32ca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-19 Jakub Jelinek + + PR middle-end/71874 + * g++.dg/torture/pr71874.C: New test. + 2016-07-19 Martin Jambor PR fortran/71688 diff --git a/gcc/testsuite/g++.dg/torture/pr71874.C b/gcc/testsuite/g++.dg/torture/pr71874.C new file mode 100644 index 000000000000..d9b4e2f88497 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr71874.C @@ -0,0 +1,12 @@ +// PR middle-end/71874 +// { dg-do run } + +int +main () +{ + char str[] = "abcdefghijklmnopqrstuvwxyzABCDEF"; + __builtin_memmove (str + 20, str + 15, 11); + if (__builtin_strcmp (str, "abcdefghijklmnopqrstpqrstuvwxyzF") != 0) + __builtin_abort (); + return 0; +}