blob: 484844e491d5e5052336e672c659df3ca116d295 [file] [log] [blame]
/* PR tree-optimization/57233 */
/* { dg-do run { target { ilp32 || lp64 } } } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-fno-common" { target hppa*-*-hpux* } } */
typedef unsigned V4 __attribute__((vector_size(4 * sizeof (int))));
typedef unsigned V8 __attribute__((vector_size(8 * sizeof (int))));
typedef unsigned V16 __attribute__((vector_size(16 * sizeof (int))));
V4 a, b, g;
V8 c, d, h;
V16 e, f, j;
__attribute__((noinline)) void
f1 (void)
{
a = (a << 2) | (a >> 30);
}
__attribute__((noinline)) void
f2 (void)
{
a = (a << 30) | (a >> 2);
}
__attribute__((noinline)) void
f3 (void)
{
a = (a << b) | (a >> (32 - b));
}
__attribute__((noinline, noclone)) void
f4 (int x)
{
a = (a << x) | (a >> (32 - x));
}
__attribute__((noinline)) void
f5 (void)
{
c = (c << 2) | (c >> 30);
}
__attribute__((noinline)) void
f6 (void)
{
c = (c << 30) | (c >> 2);
}
__attribute__((noinline)) void
f7 (void)
{
c = (c << d) | (c >> (32 - d));
}
__attribute__((noinline, noclone)) void
f8 (int x)
{
c = (c << x) | (c >> (32 - x));
}
__attribute__((noinline)) void
f9 (void)
{
e = (e << 2) | (e >> 30);
}
__attribute__((noinline)) void
f10 (void)
{
e = (e << 30) | (e >> 2);
}
__attribute__((noinline)) void
f11 (void)
{
e = (e << f) | (e >> (32 - f));
}
__attribute__((noinline, noclone)) void
f12 (int x)
{
e = (e << x) | (e >> (32 - x));
}
unsigned
r (void)
{
static unsigned x = 0xdeadbeefU;
static unsigned y = 0x12347654U;
static unsigned z = 0x1a2b3c4dU;
static unsigned w = 0x87654321U;
unsigned t = x ^ (x << 11);
x = y;
y = z;
z = w;
w = w ^ (w >> 19) ^ t ^ (t >> 8);
return w;
}
void
init (unsigned int *p, int count, int mod)
{
int i;
for (i = 0; i < count; i++)
{
unsigned int v = r ();
if (mod)
v = (v % 31) + 1;
p[i] = v;
}
}
void
check (unsigned int *p, unsigned int *q, int count, unsigned int *s, int ss)
{
int i;
for (i = 0; i < count; i++)
{
if (s)
ss = s[i];
if (p[i] != ((q[i] << ss) | (q[i] >> (32 - ss))))
__builtin_abort ();
}
}
int
main ()
{
init ((unsigned int *) &a, 4, 0);
init ((unsigned int *) &b, 4, 1);
init ((unsigned int *) &c, 8, 0);
init ((unsigned int *) &d, 8, 1);
init ((unsigned int *) &e, 16, 0);
init ((unsigned int *) &f, 16, 1);
g = a;
h = c;
j = e;
f1 ();
f5 ();
f9 ();
check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 2);
check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 2);
check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 2);
g = a;
h = c;
j = e;
f2 ();
f6 ();
f10 ();
check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 30);
check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 30);
check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 30);
g = a;
h = c;
j = e;
f3 ();
f7 ();
f11 ();
check ((unsigned int *) &a, (unsigned int *) &g, 4, (unsigned int *) &b, 0);
check ((unsigned int *) &c, (unsigned int *) &h, 8, (unsigned int *) &d, 0);
check ((unsigned int *) &e, (unsigned int *) &j, 16, (unsigned int *) &f, 0);
g = a;
h = c;
j = e;
f4 (5);
f8 (5);
f12 (5);
check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 5);
check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 5);
check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 5);
return 0;
}