From: Uros Bizjak Date: Sun, 16 Aug 2015 17:52:51 +0000 (+0200) Subject: backport: re PR target/66648 (incorrect memcpy expansion with unrolled_loop strategy... X-Git-Tag: releases/gcc-4.9.4~646 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b1ef35e2ad76abb245be2a75f94234c92872ac46;p=thirdparty%2Fgcc.git backport: re PR target/66648 (incorrect memcpy expansion with unrolled_loop strategy at -O2) Backport from mainline: 2015-07-25 Uros Bizjak PR target/66648 * config/i386/i386.c (ix86_expand_set_or_movmem): Emit main loop execution guard when min_size is less than size_needed. testsuite/ChangeLog: Backport from mainline: 2015-07-25 Uros Bizjak PR target/66648 * gcc.target/i386/pr66648.c: New test. From-SVN: r226926 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 41755d790719..5959f9dab298 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-08-16 Uros Bizjak + + Backport from mainline: + 2015-07-25 Uros Bizjak + + PR target/66648 + * config/i386/i386.c (ix86_expand_set_or_movmem): Emit main loop + execution guard when min_size is less than size_needed. + 2015-08-04 Szabolcs Nagy Backport from mainline: diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 716b766e4ad5..1a06d46cebbe 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -24419,7 +24419,8 @@ ix86_expand_set_or_movmem (rtx dst, rtx src, rtx count_exp, rtx val_exp, dst = change_address (dst, BLKmode, destreg); set_mem_align (dst, desired_align * BITS_PER_UNIT); epilogue_size_needed = 0; - if (need_zero_guard && !min_size) + if (need_zero_guard + && min_size < (unsigned HOST_WIDE_INT) size_needed) { /* It is possible that we copied enough so the main loop will not execute. */ @@ -24551,7 +24552,7 @@ ix86_expand_set_or_movmem (rtx dst, rtx src, rtx count_exp, rtx val_exp, max_size -= align_bytes; } if (need_zero_guard - && !min_size + && min_size < (unsigned HOST_WIDE_INT) size_needed && (count < (unsigned HOST_WIDE_INT) size_needed || (align_bytes == 0 && count < ((unsigned HOST_WIDE_INT) size_needed diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b9213d2ad34a..d90d3d7ea99d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-08-16 Uros Bizjak + + Backport from mainline: + 2015-07-25 Uros Bizjak + + PR target/66648 + * gcc.target/i386/pr66648.c: New test. + 2015-08-07 Mikael Morin PR fortran/66929 diff --git a/gcc/testsuite/gcc.target/i386/pr66648.c b/gcc/testsuite/gcc.target/i386/pr66648.c new file mode 100644 index 000000000000..88c126fff8c0 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr66648.c @@ -0,0 +1,33 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -mstringop-strategy=unrolled_loop -mtune=nocona" } */ + +#define PATTERN 0xdeadbeef +#define SIZE 32 + +struct S { int i; char str[SIZE]; int j; }; + +void __attribute__((noclone, noinline)) +my_memcpy (char *, const char *, unsigned int); + +void +my_memcpy (char *dst, const char *src, unsigned int len) +{ + if (len < 8) + __builtin_abort (); + + __builtin_memcpy (dst, src, len); +} + +int +main (void) +{ + const char str[SIZE]= "1234567890123456789012345678901"; + struct S *s = __builtin_malloc (sizeof (struct S)); + + s->j = PATTERN; + my_memcpy (s->str, str, SIZE); + if (s->j != PATTERN) + __builtin_abort (); + + return 0; +}