blob: 555532c641c63251a39aafb53430647d8af71a2e [file] [log] [blame]
/* PR tree-optimization/48616 */
/* { dg-do run } */
/* { dg-options "-O2 -ftree-vectorize" } */
/* { dg-additional-options "-fno-common" { target hppa*-*-hpux* } } */
/* { dg-skip-if "no alignment > 2" { "pdp11-*-*" } } */
extern void abort (void);
int a[4] __attribute__((aligned (32)));
int b[4] __attribute__((aligned (32)));
int c[4] __attribute__((aligned (32)));
int d[4] __attribute__((aligned (32)));
int e[4] __attribute__((aligned (32)));
__attribute__((noinline, noclone))
int
foo (int x)
{
asm ("" : "+r" (x));
return x;
}
__attribute__((noinline, noclone))
void
fn1 (int i)
{
a[0] = b[0] << c[0];
a[1] = b[1] << c[1];
a[2] = b[2] << c[2];
a[3] = b[3] << c[3];
if (i)
{
d[0] = e[0] >> c[0];
d[1] = e[1] >> c[1];
d[2] = e[2] >> c[2];
d[3] = e[3] >> c[3];
}
}
__attribute__((noinline, noclone))
void
fn2 (int i)
{
a[0] = b[0] << 1;
a[1] = b[1] << 2;
a[2] = b[2] << 3;
a[3] = b[3] << 4;
if (i)
{
d[0] = e[0] >> 1;
d[1] = e[1] >> 2;
d[2] = e[2] >> 3;
d[3] = e[3] >> 4;
}
}
__attribute__((noinline, noclone))
void
fn3 (int i, int j)
{
int x = foo (j);
a[0] = b[0] << x;
a[1] = b[1] << x;
a[2] = b[2] << x;
a[3] = b[3] << x;
if (i)
{
d[0] = e[0] >> x;
d[1] = e[1] >> x;
d[2] = e[2] >> x;
d[3] = e[3] >> x;
}
}
__attribute__((noinline, noclone))
void
fn4 (int i)
{
a[0] = b[0] << 1;
a[1] = b[1] << 1;
a[2] = b[2] << 1;
a[3] = b[3] << 1;
if (i)
{
d[0] = e[0] >> 1;
d[1] = e[1] >> 1;
d[2] = e[2] >> 1;
d[3] = e[3] >> 1;
}
}
int
main ()
{
int i;
int *t;
for (i = 0; i < 4; i++)
{
b[i] = 32;
c[i] = i + 1;
e[i] = 32;
}
asm volatile ("" : : "r" (b) : "memory");
asm volatile ("" : : "r" (c) : "memory");
asm volatile ("" : "=r" (t) : "0" (d) : "memory");
fn1 (t != 0);
for (i = 0; i < 4; i++)
{
if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
abort ();
a[i] = 0;
d[i] = 0;
}
fn2 (t != 0);
for (i = 0; i < 4; i++)
{
if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
abort ();
a[i] = 0;
d[i] = 0;
}
fn3 (t != 0, t != 0);
for (i = 0; i < 4; i++)
{
if (a[i] != (32 << 1) || d[i] != (32 >> 1))
abort ();
a[i] = 0;
d[i] = 0;
}
fn4 (t != 0);
for (i = 0; i < 4; i++)
{
if (a[i] != (32 << 1) || d[i] != (32 >> 1))
abort ();
}
return 0;
}