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