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

H.J. Lu hjl.tools@gmail.com
Mon Feb 10 20:19:00 GMT 2014


On Mon, Feb 10, 2014 at 11:54 AM, Richard Sandiford
<rdsandiford@googlemail.com> wrote:
> "H.J. Lu" <hjl.tools@gmail.com> writes:
>> On Sat, Feb 1, 2014 at 2:28 AM, Richard Sandiford
>> <rdsandiford@googlemail.com> wrote:
>>> "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)
>>
>> That is fine with me.
>
> Thanks.  Is it OK to commit?
>

This is my testcase.  I think you can check it in.


-- 
H.J.



More information about the Gcc-patches mailing list