1  /* { dg-require-effective-target vect_int } */
       2  /* { dg-require-effective-target vect_shift } */
       3  /* { dg-require-effective-target vect_pack_trunc } */
       4  /* { dg-require-effective-target vect_unpack } */
       5  
       6  #include "tree-vect.h"
       7  
       8  #define N 1024
       9  
      10  /* This should not be treated as an over-widening pattern, even though
      11     "(b[i] & 0xef) | 0x80)" could be done in unsigned chars.  */
      12  
      13  void __attribute__ ((noipa))
      14  f (unsigned short *restrict a, unsigned short *restrict b)
      15  {
      16    for (__INTPTR_TYPE__ i = 0; i < N; ++i)
      17      {
      18        unsigned short foo = ((b[i] & 0xef) | 0x80) + (a[i] << 4);
      19        a[i] = foo;
      20      }
      21  }
      22  
      23  int
      24  main (void)
      25  {
      26    check_vect ();
      27  
      28    unsigned short a[N], b[N];
      29    for (int i = 0; i < N; ++i)
      30      {
      31        a[i] = i;
      32        b[i] = i * 3;
      33        asm volatile ("" ::: "memory");
      34      }
      35    f (a, b);
      36    for (int i = 0; i < N; ++i)
      37      if (a[i] != ((((i * 3) & 0xef) | 0x80) + (i << 4)))
      38        __builtin_abort ();
      39  
      40    return 0;
      41  }
      42  
      43  /* { dg-final { scan-tree-dump-not {vect_recog_over_widening_pattern: detected} "vect" } } */
      44  /* On Power, if there is no vect_hw_misalign support, unaligned vector access
      45     adopts realign_load scheme.  It requires rs6000_builtin_mask_for_load to
      46     generate mask whose return type is vector char.  */
      47  /* { dg-final { scan-tree-dump-not {vector[^\n]*char} "vect" { target vect_hw_misalign } } } */
      48  /* { dg-final { scan-tree-dump-not {vector[^ ]* int} "vect" } } */
      49  /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */