/* PR tree-optimization/53265 */
/* { dg-do compile } */
/* { dg-options "-O2 -Wall" } */
/* { dg-require-effective-target size32plus } */

void bar (void *);
int baz (int);

void
fn1 (void)
{
  unsigned int a[128];
  int i;

  for (i = 0; i < 128; ++i)	/* { dg-message "note: within this loop" } */
    a[i] = i * 0x02000001;	/* { dg-warning "64 invokes undefined behavior" } */
  bar (a);
}

void
fn2 (void)
{
  unsigned long long a[128];
  int i;

  for (i = 0; i < 128; i++)			/* { dg-message "note: within this loop" } */
    a[i] = (i + 1LL) * 0x0123456789ABCDEFLL;	/* { dg-warning "112 invokes undefined behavior" } */
  bar (a);
}

void
fn3 (void)
{
  unsigned char a[16], b[16], c[16];
  int i;

  bar (b);
  for (i = 0; i < (int) (sizeof (a) / sizeof (a[0])); i++)	/* { dg-message "note: within this loop" } */
    {
      c[i + 8] = b[i];	/* { dg-warning "8 invokes undefined behavior" } */
	/* { dg-warning "out of the bounds" "" { target *-*-* } .-1 } */
      a[i + 8] = b[i + 8]; /* { dg-warning "out of the bounds" } */
    }
  bar (a);
  bar (c);
}

void
fn4 (void)
{
  unsigned int *a[32], *o, i;

  bar (a);
  for (i = 0; i <= sizeof (a) / sizeof (a[0]); i++)	/* { dg-message "note: within this loop" } */
    {
      o = a[i];	/* { dg-warning "32 invokes undefined behavior" } */
      bar (o);
    }
}

void
fn5 (void)
{
  unsigned short a[23940];
  unsigned int b[1140];
  int j;

  bar (b);
  for (j = 0; j < 1140; j++)	/* { dg-message "note: within this loop" } */
    a[23940 + j - 950] = b[j];	/* { dg-warning "950 invokes undefined behavior" } */
  bar (a);
}

void
fn6 (void)
{
  double a[4][3], b[12];
  int i;
  bar (b);
  for (i = 0; i < 12; i++)	/* { dg-message "note: within this loop" } */
    a[0][i] = b[i] / 10000.0;	/* { dg-warning "3 invokes undefined behavior" } */
  bar (a);
}

void
fn7 (void)
{
  int a[16], b, c;
  bar (a);
  for (b = a[c = 0]; c < 16; b = a[++c])
    /* { dg-warning "15 invokes undefined behavior" "" { target *-*-* } .-1 } */
    /* { dg-message "note: within this loop" "" { target *-*-* } .-2 } */
    baz (b);
}


const void *va, *vb, *vc, *vd, *ve;
const void *vf[4];
void
fn8 (void)
{
  unsigned long i;
  vf[0] = va; vf[1] = vb; vf[2] = vc; vf[3] = vd;
  for (i = 0; i < (sizeof (vf) / sizeof (vf[0])); i++)
    if (!vf[i])
      vf[i] = ve;
}

int wa, wb[53][5], wc[53][5];

void
fn9 (void)
{
  int i, j, k;
  for (i = 0; i < 53; i++)
    for (j = 16 / (((wa & 1) != 0) ? 8 : 4); j > 0; j--)
      {
	int d = 1;
	if (wb[i][j] == 0 || wc[i][1] != 0)
	  continue;
	for (k = 0; k < j; k++)
	  if (wc[i + k][1])
	    {
	      d = 0;
	      break;
	    }
	if (!d)
	  continue;
	wc[i][j] = baz (0);
      }
}

int xa[18];

void
fn10 (void)
{
  int i;
  for (i = 16; i < 32; i++)	/* { dg-message "note: within this loop" } */
    xa[i] = 26;			/* { dg-warning "2 invokes undefined behavior" } */
}

__attribute__((noinline)) static void
fn11 (int x)
{
  int i = 1;
  if (x > 1)
    do
      baz (i);
    while (++i != x);		/* { dg-bogus "invokes undefined behavior" } */
}

void
fn12 (void)
{
  fn11 (1);
  fn11 (1);
  fn11 (1);
}
