(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
vect-strided-u16-i3.c
       1  #include <stdarg.h>
       2  #include "tree-vect.h"
       3  
       4  #define N 128
       5  
       6  typedef struct {
       7     unsigned short a;
       8     unsigned short b;
       9     unsigned short c;
      10  } s;
      11  
      12  #define A(I) (I)
      13  #define B(I) ((I) * 2)
      14  #define C(I) ((unsigned short) ~((I) ^ 0x18))
      15  
      16  void __attribute__ ((noinline))
      17  check1 (s *res)
      18  {
      19    int i;
      20  
      21    for (i = 0; i < N; i++)
      22      if (res[i].a != C (i)
      23  	|| res[i].b != A (i)
      24  	|| res[i].c != B (i))
      25        abort ();
      26  }
      27  
      28  void __attribute__ ((noinline))
      29  check2 (unsigned short *res)
      30  {
      31    int i;
      32  
      33    for (i = 0; i < N; i++)
      34      if (res[i] != (unsigned short) (A (i) + B (i) + C (i)))
      35        abort ();
      36  }
      37  
      38  void __attribute__ ((noinline))
      39  check3 (s *res)
      40  {
      41    int i;
      42  
      43    for (i = 0; i < N; i++)
      44      if (res[i].a != i
      45  	|| res[i].b != i
      46  	|| res[i].c != i)
      47        abort ();
      48  }
      49  
      50  void __attribute__ ((noinline))
      51  check4 (unsigned short *res)
      52  {
      53    int i;
      54  
      55    for (i = 0; i < N; i++)
      56      if (res[i] != (unsigned short) (A (i) + B (i)))
      57        abort ();
      58  }
      59  
      60  void __attribute__ ((noinline))
      61  main1 (s *arr)
      62  {
      63    int i;
      64    s *ptr = arr;
      65    s res1[N];
      66    unsigned short res2[N];
      67  
      68    for (i = 0; i < N; i++)
      69      {
      70        res1[i].a = arr[i].c;
      71        res1[i].b = arr[i].a;
      72        res1[i].c = arr[i].b;
      73      }
      74    check1 (res1);
      75  
      76    for (i = 0; i < N; i++)
      77      res2[i] = arr[i].a + arr[i].b + arr[i].c;
      78    check2 (res2);
      79  
      80    for (i = 0; i < N; i++)
      81      {
      82        res1[i].a = i;
      83        res1[i].b = i;
      84        res1[i].c = i;
      85      }
      86    check3 (res1);
      87  
      88    for (i = 0; i < N; i++)
      89      res2[i] = arr[i].a + arr[i].b;
      90    check4 (res2);
      91  }
      92  
      93  int main (void)
      94  {
      95    int i;
      96    s arr[N];
      97  
      98    check_vect ();
      99  
     100    for (i = 0; i < N; i++)
     101      {
     102        arr[i].a = A (i);
     103        arr[i].b = B (i);
     104        arr[i].c = C (i);
     105      }
     106    main1 (arr);
     107  
     108    return 0;
     109  }
     110  
     111  /* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect"  { target vect_strided3 } } } */