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. -- H.J.