middle-end: check for vector mode before calling get_mask_mode [PR116074]
[official-gcc.git] / gcc / testsuite / gcc.dg / pr48616.c
blob555532c641c63251a39aafb53430647d8af71a2e
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-*-*" } } */
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)));
14 __attribute__((noinline, noclone))
15 int
16 foo (int x)
18 asm ("" : "+r" (x));
19 return x;
22 __attribute__((noinline, noclone))
23 void
24 fn1 (int i)
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)
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];
39 __attribute__((noinline, noclone))
40 void
41 fn2 (int i)
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)
49 d[0] = e[0] >> 1;
50 d[1] = e[1] >> 2;
51 d[2] = e[2] >> 3;
52 d[3] = e[3] >> 4;
56 __attribute__((noinline, noclone))
57 void
58 fn3 (int i, int j)
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)
67 d[0] = e[0] >> x;
68 d[1] = e[1] >> x;
69 d[2] = e[2] >> x;
70 d[3] = e[3] >> x;
74 __attribute__((noinline, noclone))
75 void
76 fn4 (int i)
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)
84 d[0] = e[0] >> 1;
85 d[1] = e[1] >> 1;
86 d[2] = e[2] >> 1;
87 d[3] = e[3] >> 1;
91 int
92 main ()
94 int i;
95 int *t;
96 for (i = 0; i < 4; i++)
98 b[i] = 32;
99 c[i] = i + 1;
100 e[i] = 32;
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++)
108 if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
109 abort ();
110 a[i] = 0;
111 d[i] = 0;
113 fn2 (t != 0);
114 for (i = 0; i < 4; i++)
116 if (a[i] != (32 << (i + 1)) || d[i] != (32 >> (i + 1)))
117 abort ();
118 a[i] = 0;
119 d[i] = 0;
121 fn3 (t != 0, t != 0);
122 for (i = 0; i < 4; i++)
124 if (a[i] != (32 << 1) || d[i] != (32 >> 1))
125 abort ();
126 a[i] = 0;
127 d[i] = 0;
129 fn4 (t != 0);
130 for (i = 0; i < 4; i++)
132 if (a[i] != (32 << 1) || d[i] != (32 >> 1))
133 abort ();
135 return 0;