This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: PR target/59605: Create jump_around_label only if it doesn't exist


"H.J. Lu" <hjl.tools@gmail.com> writes:
> On Thu, Jan 30, 2014 at 10:43 AM, Richard Sandiford
> <rdsandiford@googlemail.com> wrote:
>> Hi H.J.,
>>
>> "H.J. Lu" <hjl.tools@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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]