re PR target/82190 (Possibly latent miscompilation issue on ppc64le-linux-gnu for...
authorAaron Sawdey <acsawdey@gcc.gnu.org>
Tue, 12 Dec 2017 22:22:53 +0000 (16:22 -0600)
committerAaron Sawdey <acsawdey@gcc.gnu.org>
Tue, 12 Dec 2017 22:22:53 +0000 (16:22 -0600)
2017-12-12  Aaron Sawdey  <acsawdey@linux.vnet.ibm.com>

PR target/82190
* config/rs6000/rs6000-string.c (expand_block_compare,
expand_strn_compare): Fix set_mem_size() calls.

From-SVN: r255592

gcc/config/rs6000/rs6000-string.c
gcc/testsuite/gcc.dg/pr82190.c [new file with mode: 0644]

index 8c2a93e..1ff4284 100644 (file)
@@ -459,14 +459,14 @@ expand_block_compare (rtx operands[])
          rtx src1_reg = copy_addr_to_reg (XEXP (src1, 0));
          src1 = replace_equiv_address (src1, src1_reg);
        }
-      set_mem_size (src1, cmp_bytes);
+      set_mem_size (src1, load_mode_size);
 
       if (!REG_P (XEXP (src2, 0)))
        {
          rtx src2_reg = copy_addr_to_reg (XEXP (src2, 0));
          src2 = replace_equiv_address (src2, src2_reg);
        }
-      set_mem_size (src2, cmp_bytes);
+      set_mem_size (src2, load_mode_size);
 
       do_load_for_compare (tmp_reg_src1, src1, load_mode);
       do_load_for_compare (tmp_reg_src2, src2, load_mode);
@@ -937,14 +937,14 @@ expand_strn_compare (rtx operands[], int no_length)
          rtx src1_reg = copy_addr_to_reg (XEXP (src1, 0));
          src1 = replace_equiv_address (src1, src1_reg);
        }
-      set_mem_size (src1, cmp_bytes);
+      set_mem_size (src1, load_mode_size);
 
       if (!REG_P (XEXP (src2, 0)))
        {
          rtx src2_reg = copy_addr_to_reg (XEXP (src2, 0));
          src2 = replace_equiv_address (src2, src2_reg);
        }
-      set_mem_size (src2, cmp_bytes);
+      set_mem_size (src2, load_mode_size);
 
       do_load_for_compare (tmp_reg_src1, src1, load_mode);
       do_load_for_compare (tmp_reg_src2, src2, load_mode);
@@ -1096,14 +1096,14 @@ expand_strn_compare (rtx operands[], int no_length)
          rtx src1_reg = copy_addr_to_reg (XEXP (src1, 0));
          src1 = replace_equiv_address (src1, src1_reg);
        }
-      set_mem_size (src1, cmp_bytes);
+      set_mem_size (src1, load_mode_size);
 
       if (!REG_P (XEXP (src2, 0)))
        {
          rtx src2_reg = copy_addr_to_reg (XEXP (src2, 0));
          src2 = replace_equiv_address (src2, src2_reg);
        }
-      set_mem_size (src2, cmp_bytes);
+      set_mem_size (src2, load_mode_size);
 
       /* Construct call to strcmp/strncmp to compare the rest of the string.  */
       if (no_length)
diff --git a/gcc/testsuite/gcc.dg/pr82190.c b/gcc/testsuite/gcc.dg/pr82190.c
new file mode 100644 (file)
index 0000000..aa8cc85
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR target/82190 */
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-optimize-strlen -fweb" } */
+
+char src[64] __attribute__ ((aligned)) = "aaaaaaa";
+char dst[64] __attribute__ ((aligned));
+
+int
+main ()
+{
+  __builtin_memcpy (dst, src, 6);
+  if (__builtin_memcmp (dst, src, 6))
+    __builtin_abort ();
+
+  __builtin_memcpy (dst, src, 7);
+  if (__builtin_memcmp (dst, src, 7))
+    __builtin_abort ();
+
+  return 0;
+}
+
+