aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Sawdey <acsawdey@gcc.gnu.org>2017-12-12 16:22:53 -0600
committerAaron Sawdey <acsawdey@gcc.gnu.org>2017-12-12 16:22:53 -0600
commit708eab9b5bfdb5be44253dbac5f58cea5c652c55 (patch)
treeeae294451e639aa701218cf4b0cb5c1211fa70be
parent48f43f9547392ede42dbd56514d7386c564baa8d (diff)
downloadgcc-708eab9b5bfdb5be44253dbac5f58cea5c652c55.zip
gcc-708eab9b5bfdb5be44253dbac5f58cea5c652c55.tar.gz
gcc-708eab9b5bfdb5be44253dbac5f58cea5c652c55.tar.bz2
re PR target/82190 (Possibly latent miscompilation issue on ppc64le-linux-gnu for memcpy-bi.c with -fweb -fno-optimize-strlen)
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
-rw-r--r--gcc/config/rs6000/rs6000-string.c12
-rw-r--r--gcc/testsuite/gcc.dg/pr82190.c22
2 files changed, 28 insertions, 6 deletions
diff --git a/gcc/config/rs6000/rs6000-string.c b/gcc/config/rs6000/rs6000-string.c
index 8c2a93e..1ff4284 100644
--- a/gcc/config/rs6000/rs6000-string.c
+++ b/gcc/config/rs6000/rs6000-string.c
@@ -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
index 0000000..aa8cc85
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr82190.c
@@ -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;
+}
+
+