aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-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;
+}
+
+