http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48774

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-04-29 
18:55:48 UTC ---
Slightly reduced testcase, fails with -O2 -funroll-loops on x86_64-linux,
succeeds with -O2:

unsigned long int s[12][2]
  = { { 12, 2114 }, { 12, 37 }, { 12, 1034 }, { 12, 532 },
      { 12, 296 }, { 12, 82 }, { 12, 161 }, { 12, 2368 },
      { 12, 656 }, { 12, 1288 }, { 12, 2564 }, { 12, 1153 } };
struct { int n; unsigned long *edges[12]; } g
  = { 12, { &s[0][1], &s[1][1], &s[2][1], &s[3][1],
        &s[4][1], &s[5][1], &s[6][1], &s[7][1],
        &s[8][1], &s[9][1], &s[10][1], &s[11][1] } };
#define SET_BIT_MASK(x) ((unsigned long)1<<(x))
#define SET_ELEMENT_CONTAINS(e,v)   ((e)&SET_BIT_MASK(v))
#define SET_CONTAINS_FAST(s,a) (SET_ELEMENT_CONTAINS((s)[0], (a)))
#define GRAPH_IS_EDGE(g,i,j) \
    (((j)<(((g)->edges[(0)]))[-1])?SET_CONTAINS_FAST((g)->edges[(i)],j):0)

int
main ()
{
  int i, j, v, a[12], c[12], e = 0;

  for (i = 0; i < 12; i++)
    c[i] = 0;
  for (i = 0; i < g.n; i++)
    for (j = 0; j < g.n; j++)
      {
    if (i == j && GRAPH_IS_EDGE (&g, i, j))
      __builtin_exit (0);
    if (GRAPH_IS_EDGE (&g, i, j))
      c[i]++;
      }
  for (i = 0; i < 12; i++)
    if (c[i] != 3)
      __builtin_abort ();
  for (v = 0; v < 2; v++)
    {
      __builtin_memset (a, 0, 12 * sizeof (int));
      for (i = 0; i < 12; i++)
    if (a[i])
      e = i;
      v++;
    }
  return e;
}

Reply via email to