173 lines
3.3 KiB
C
173 lines
3.3 KiB
C
/* 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;
|
|
}
|