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