/* 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; }