1 /* { dg-require-effective-target vect_int } */
2 /* { dg-require-effective-target vect_shift } */
3
4 #include <stdarg.h>
5 #include "tree-vect.h"
6
7 extern void abort(void);
8
9 struct s {
10 unsigned a : 23; unsigned b : 8;
11 };
12
13 #define N 32
14 #define ELT0 {0x7FFFFFUL, 0}
15 #define ELT1 {0x7FFFFFUL, 1}
16 #define ELT2 {0x7FFFFFUL, 2}
17 #define ELT3 {0x7FFFFFUL, 3}
18 #define RES 48
19 struct s A[N]
20 = { ELT0, ELT1, ELT2, ELT3, ELT0, ELT1, ELT2, ELT3,
21 ELT0, ELT1, ELT2, ELT3, ELT0, ELT1, ELT2, ELT3,
22 ELT0, ELT1, ELT2, ELT3, ELT0, ELT1, ELT2, ELT3,
23 ELT0, ELT1, ELT2, ELT3, ELT0, ELT1, ELT2, ELT3};
24
25 int __attribute__ ((noipa))
26 f(struct s *ptr, unsigned n) {
27 int res = 0;
28 for (int i = 0; i < n; ++i)
29 res += ptr[i].b;
30 return res;
31 }
32
33 int main (void)
34 {
35 check_vect ();
36
37 if (f(&A[0], N) != RES)
38 abort ();
39
40 return 0;
41 }
42
43 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */