This is the mail archive of the gcc-bugs@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]

[Bug rtl-optimization/69691] [6 Regression] wrong code at -O2 on x86_64-linux-gnu


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69691

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-02-05
                 CC|                            |jakub at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Adjusted testcase, so that it doesn't depend on ASCII ordering, tolower etc.

char u[] = { 46, 97, 99, 104, 52, 0 };
char *v[] = { u, 0 };
static struct S { char a[10]; struct S *b[31]; } *w = 0;

__attribute__((noinline, noclone)) int
fn (int x)
{
  if (__builtin_strchr (u, x) || x == 96)
    return x;
  __builtin_abort ();
}

__attribute__((noinline, noclone)) int
foo (char x)
{
  if (x == 0)
    __builtin_abort ();
  if (fn (x) >= 96 && fn (x) <= 122)
    return (fn (x) - 96);
  else if (x == 46)
    return 0;
  else
    {
      __builtin_printf ("foo %d\n", x);
      return -1;
    }
}

__attribute__((noinline, noclone)) void
bar (char **x)
{
  char **b, c, *d, e[500], *f, g[10];
  int z, l, h, i;
  struct S *s;

  w = __builtin_calloc (1, sizeof (struct S));
  for (b = x; *b; b++)
    {
      __builtin_strcpy (e, *b);
      f = e;
      do
        {
          d = __builtin_strchr (f, 32);
          if (d)
            *d = 0;
          l = __builtin_strlen (f);
          h = 0;
          s = w;
          __builtin_memset (g, 0, sizeof (g));
          for (z = 0; z < l; z++)
            {
              c = f[z];
              if (c >= 48 && c <= 57)
                g[h] = c - 48;
              else
                {
                  i = foo (c);
                  if (!s->b[i])
                    s->b[i] = __builtin_calloc (1, sizeof (struct S));
                  s = s->b[i];
                  h++;
                }
            }
          __builtin_memcpy (s->a, g, 10);
          if (d)
            f = d + 1;
        }
      while (d);
    }
}

__attribute__((noinline, noclone)) void
baz (char *x)
{
  char a[300], b[300];
  int z, y, t, l;
  struct S *s;

  l = __builtin_strlen (x);
  *a = 96;
  for (z = 0; z < l; z++)
    {
      a[z + 1] = fn ((unsigned int) x[z]);
      if (foo (a[z + 1]) <= 0)
        return;
    }
  a[l + 1] = 96;
  l += 2;
  __builtin_memset (b, 0, l + 2);

  if (!w)
    return;

  for (z = 0; z < l; z++)
    {
      s = w;
      for (y = z; y < l; y++)
        {
          s = s->b[foo (a[y])];
          if (!s)
            break;
          for (t = 0; t <= y - z + 2; t++)
            if (s->a[t] > b[z + t])
              b[z + t] = s->a[t];
        }
    }
  for (z = 3; z < l - 2; z++)
    if ((b[z] & 1) == 1)
     asm ("");
}

int
main ()
{
  bar (v);
  char c[] = { 97, 97, 97, 97, 97, 0 };
  baz (c);
  return 0;
}

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