"H.J. Lu" <hjl.to...@gmail.com> writes: > On Sat, Feb 1, 2014 at 2:28 AM, Richard Sandiford > <rdsandif...@googlemail.com> wrote: >> "H.J. Lu" <hjl.to...@gmail.com> writes: >>> On Thu, Jan 30, 2014 at 10:43 AM, Richard Sandiford >>> <rdsandif...@googlemail.com> wrote: >>>> Hi H.J., >>>> >>>> "H.J. Lu" <hjl.to...@gmail.com> writes: >>>>> diff --git a/gcc/testsuite/gcc.dg/pr59605.c >>>>> b/gcc/testsuite/gcc.dg/pr59605.c >>>>> new file mode 100644 >>>>> index 0000000..4556843 >>>>> --- /dev/null >>>>> +++ b/gcc/testsuite/gcc.dg/pr59605.c >>>>> @@ -0,0 +1,55 @@ >>>>> +/* { dg-do run } */ >>>>> +/* { dg-options "-O2" } */ >>>>> +/* { dg-additional-options "-minline-stringops-dynamically" { target >>>>> { i?86-*-* x86_64-*-* } } } */ >>>>> + >>>>> +extern void abort (void); >>>>> + >>>>> +#define MAX_OFFSET (sizeof (long long)) >>>>> +#define MAX_COPY (1024 + 8192) >>>>> +#define MAX_EXTRA (sizeof (long long)) >>>>> + >>>>> +#define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA) >>>>> + >>>>> +static union { >>>>> + char buf[MAX_LENGTH]; >>>>> + long long align_int; >>>>> + long double align_fp; >>>>> +} u; >>>>> + >>>>> +char A[MAX_LENGTH]; >>>>> + >>>>> +int >>>>> +main () >>>>> +{ >>>>> + int off, len, i; >>>>> + char *p, *q; >>>>> + >>>>> + for (i = 0; i < MAX_LENGTH; i++) >>>>> + A[i] = 'A'; >>>>> + >>>>> + for (off = 0; off < MAX_OFFSET; off++) >>>>> + for (len = 1; len < MAX_COPY; len++) >>>>> + { >>>>> + for (i = 0; i < MAX_LENGTH; i++) >>>>> + u.buf[i] = 'a'; >>>>> + >>>>> + p = __builtin_memcpy (u.buf + off, A, len); >>>>> + if (p != u.buf + off) >>>>> + abort (); >>>>> + >>>>> + q = u.buf; >>>>> + for (i = 0; i < off; i++, q++) >>>>> + if (*q != 'a') >>>>> + abort (); >>>>> + >>>>> + for (i = 0; i < len; i++, q++) >>>>> + if (*q != 'A') >>>>> + abort (); >>>>> + >>>>> + for (i = 0; i < MAX_EXTRA; i++, q++) >>>>> + if (*q != 'a') >>>>> + abort (); >>>>> + } >>>>> + >>>>> + return 0; >>>>> +} >>>> >>>> The innermost loop bodies are executed over 6x10⁸ times on most targets >>>> and so the test times out for me when using the GDB MIPS simulator. >>>> I'm not sure what the best fix is though. E.g.: >>>> >>>> 1. It looks like the PR was for a compile-time failure rather than a >>>> run-time >>>> failure, so one option might be to drop it to dg-do compile. That'd >>>> lose >>>> a nice executable conformance test though. I don't like this option. >>>> >>>> 2. We could drop it to dg-do compile for simulator targets only. >>>> That's still >>>> lose some conformance testing for simulator targets. >>>> >>>> 3. We could use a smaller MAX_COPY for simulator targets, which is >>>> typically >>>> how check_effective_target_simulator is used. I'm not sure >>>> whether having >>>> a smaller MAX_COPY would defeat the original ICE test though. >>>> >>>> 4. We could split the test into two, a dg-do compile one and a dg-do >>>> run one. >>>> We could then do (3) on the run one. >>>> >>>> But there are probably other alternatives too. >>>> >>>> I'm willing to do the patch, but has anyone got any suggestions for >>>> what would be best? >>>> >>> >>> Can you reduce the loop count and still trigger the bug without >>> the fix? >> >> Not by much. AFAICT the lowest MAX_COPY for which the ICE still triggers >> is 8194, which only reduces the 6x10⁸ to something over 5.38x10⁸. >> >> So I think it's a choice between (2) and (4). How about the patch below? >> Tested on mipsisa64-sde-elf and x86_64-linux-gnu. Both tests failed before >> the i386.c fix. >> >> Thanks, >> Richard >> >> >> gcc/testsuite/ >> * gcc.dg/pr59605.c: Convert to a compile test. Protect MAX_COPY >> definition with an ifdef. >> * gcc.dg/pr59605-2.c: New test. >> >> Index: gcc/testsuite/gcc.dg/pr59605-2.c >> =================================================================== >> --- /dev/null 2014-01-30 08:06:21.701666182 +0000 >> +++ gcc/testsuite/gcc.dg/pr59605-2.c 2014-02-01 10:25:08.674430391 +0000 >> @@ -0,0 +1,6 @@ >> +/* { dg-do run } */ >> +/* { dg-options "-O2" } */ >> +/* { dg-additional-options "-DMAX_COPY=1025" { target simulator } } */ >> +/* { dg-additional-options "-minline-stringops-dynamically" { target { >> i?86-*-* x86_64-*-* } } } */ >> + >> +#include "pr59605.c" >> Index: gcc/testsuite/gcc.dg/pr59605.c >> =================================================================== >> --- gcc/testsuite/gcc.dg/pr59605.c 2014-02-01 10:13:26.176018090 +0000 >> +++ gcc/testsuite/gcc.dg/pr59605.c 2014-02-01 10:24:22.713003808 +0000 >> @@ -1,11 +1,13 @@ >> -/* { dg-do run } */ >> +/* { dg-do compile } */ >> /* { dg-options "-O2" } */ >> /* { dg-additional-options "-minline-stringops-dynamically" { target { >> i?86-*-* x86_64-*-* } } } */ >> >> extern void abort (void); >> >> #define MAX_OFFSET (sizeof (long long)) >> +#ifndef MAX_COPY >> #define MAX_COPY (1024 + 8192) >> +#endif >> #define MAX_EXTRA (sizeof (long long)) >> >> #define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA) > > That is fine with me.
Thanks. Is it OK to commit? Richard