(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
vect-over-widen-22.c
       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 111
       9  
      10  /* The addition should be narrowed to short.  */
      11  
      12  void __attribute__ ((noipa))
      13  f (unsigned int *restrict a, unsigned int *restrict b,
      14     unsigned short *restrict c, unsigned char *restrict d, unsigned int e)
      15  {
      16    e &= 0xff;
      17    for (__INTPTR_TYPE__ i = 0; i < N; ++i)
      18      {
      19        unsigned int xor = d[i] ^ e;
      20        a[i] = c[i] | xor;
      21        b[i] = xor;
      22      }
      23  }
      24  
      25  int
      26  main (void)
      27  {
      28    check_vect ();
      29  
      30    unsigned int a[N], b[N];
      31    unsigned short c[N];
      32    unsigned char d[N];
      33    for (int i = 0; i < N; ++i)
      34      {
      35        c[i] = i * 11;
      36        d[i] = i * 2 + 3;
      37        asm volatile ("" ::: "memory");
      38      }
      39    f (a, b, c, d, 0x73);
      40    for (int i = 0; i < N; ++i)
      41      if (b[i] != ((i * 2 + 3) ^ 0x73)
      42  	|| a[i] != ((i * 11) | b[i]))
      43        __builtin_abort ();
      44  
      45    return 0;
      46  }
      47  
      48  /* { dg-final { scan-tree-dump {Splitting pattern statement} "vect" } } */
      49  /* { dg-final { scan-tree-dump {vect_recog_over_widening_pattern: detected:[^\n]* \^} "vect" } } */
      50  /* { dg-final { scan-tree-dump {vect_recog_over_widening_pattern: detected:[^\n]* \|} "vect" } } */
      51  /* { dg-final { scan-tree-dump {demoting [^\n]* to [^\n]*char} "vect" } } */
      52  /* { dg-final { scan-tree-dump {demoting [^\n]* to [^\n]*short} "vect" } } */
      53  /* { dg-final { scan-tree-dump-times "vectorized 1 loop" 1 "vect" } } */