]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/71874 (memmove works wrong)
authorJakub Jelinek <jakub@redhat.com>
Tue, 19 Jul 2016 17:42:26 +0000 (19:42 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 19 Jul 2016 17:42:26 +0000 (19:42 +0200)
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

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr71874.C [new file with mode: 0644]

index 77f8dfedc88901c5d3604070791d5e913e097369..aec77f19d3d01b0843ace67fe11cc3c6592d34f2 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-19  Jakub Jelinek  <jakub@redhat.com>
+
+       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  <mjambor@suse.cz>
 
         PR fortran/71688
index 7d536398daa3976f149e498c4b1ef9e448f3d405..6c1d81794e7b7e0f3e6e03c2d706a7bf5b53ff04 100644 (file)
@@ -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))
                {
index 87cef82d544e3108aa64f068718e6399c0dde432..78e80bec32ca98c93019e3af0d2bdd1e4cd753d9 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/71874
+       * g++.dg/torture/pr71874.C: New test.
+
 2016-07-19  Martin Jambor  <mjambor@suse.cz>
 
         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 (file)
index 0000000..d9b4e2f
--- /dev/null
@@ -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;
+}