1 /* PR tree-optimization/48616 */
2 /* { dg-do run } */
3 /* { dg-options "-O2 -ftree-vectorize" } */
4 /* { dg-additional-options "-fno-common" { target hppa*-*-hpux* } } */
5 
6 extern void abort (void);
7 int a[4] __attribute__((aligned (32)));
8 int b[4] __attribute__((aligned (32)));
9 int c[4] __attribute__((aligned (32)));
10 int d[4] __attribute__((aligned (32)));
11 int e[4] __attribute__((aligned (32)));
12 
13 __attribute__((noinline, noclone))
14 int
foo(int x)15 foo (int x)
16 {
17   asm ("" : "+r" (x));
18   return x;
19 }
20 
21 __attribute__((noinline, noclone))
22 void
fn1(int i)23 fn1 (int i)
24 {
25   a[0] = b[0] << c[0];
26   a[1] = b[1] << c[1];
27   a[2] = b[2] << c[2];
28   a[3] = b[3] << c[3];
29   if (i)
30     {
31       d[0] = e[0] >> c[0];
32       d[1] = e[1] >> c[1];
33       d[2] = e[2] >> c[2];
34       d[3] = e[3] >> c[3];
35     }
36 }
37 
38 __attribute__((noinline, noclone))
39 void
fn2(int i)40 fn2 (int i)
41 {
42   a[0] = b[0] << 1;
43   a[1] = b[1] << 2;
44   a[2] = b[2] << 3;
45   a[3] = b[3] << 4;
46   if (i)
47     {
48       d[0] = e[0] >> 1;
49       d[1] = e[1] >> 2;
50       d[2] = e[2] >> 3;
51       d[3] = e[3] >> 4;
52     }
53 }
54 
55 __attribute__((noinline, noclone))
56 void
fn3(int i,int j)57 fn3 (int i, int j)
58 {
59   int x = foo (j);
60   a[0] = b[0] << x;
61   a[1] = b[1] << x;
62   a[2] = b[2] << x;
63   a[3] = b[3] << x;
64   if (i)
65     {
66       d[0] = e[0] >> x;
67       d[1] = e[1] >> x;
68       d[2] = e[2] >> x;
69       d[3] = e[3] >> x;
70     }
71 }
72 
73 __attribute__((noinline, noclone))
74 void
fn4(int i)75 fn4 (int i)
76 {
77   a[0] = b[0] << 1;
78   a[1] = b[1] << 1;
79   a[2] = b[2] << 1;
80   a[3] = b[3] << 1;
81   if (i)
82     {
83       d[0] = e[0] >> 1;
84       d[1] = e[1] >> 1;
85       d[2] = e[2] >> 1;
86       d[3] = e[3] >> 1;
87     }
88 }
89 
90 int
main()91 main ()
92 {
93   int i;
94   int *t;
95   for (i = 0; i < 4; i++)
96     {
97       b[i] = 32;
98       c[i] = i + 1;
99       e[i] = 32;
100     }
101   asm volatile ("" : : "r" (b) : "memory");
102   asm volatile ("" : : "r" (c) : "memory");
103   asm volatile ("" : "=r" (t) : "0" (d) : "memory");
104   fn1 (t != 0);
105   for (i = 0; i < 4; i++)
106     {
107       if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
108 	abort ();
109       a[i] = 0;
110       d[i] = 0;
111     }
112   fn2 (t != 0);
113   for (i = 0; i < 4; i++)
114     {
115       if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
116 	abort ();
117       a[i] = 0;
118       d[i] = 0;
119     }
120   fn3 (t != 0, t != 0);
121   for (i = 0; i < 4; i++)
122     {
123       if (a[i] != (32 << 1) || d[i] != (32 >> 1))
124 	abort ();
125       a[i] = 0;
126       d[i] = 0;
127     }
128   fn4 (t != 0);
129   for (i = 0; i < 4; i++)
130     {
131       if (a[i] != (32 << 1) || d[i] != (32 >> 1))
132 	abort ();
133     }
134   return 0;
135 }
136