(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
slp-28.c
       1  /* { dg-require-effective-target vect_int } */
       2  
       3  #include <stdarg.h>
       4  #include "tree-vect.h"
       5  
       6  #if VECTOR_BITS > 128
       7  #define N (VECTOR_BITS * 4 / 16)
       8  #else
       9  #define N 32
      10  #endif
      11  
      12  unsigned short in[N] = {};
      13  unsigned short in2[N] = {};
      14  unsigned short in3[N] = {};
      15  
      16  int
      17  main1 ()
      18  {
      19    int i;
      20  
      21    for (i = 0; i < N; i++)
      22      {
      23        in[i] = in2[i] = in3[i] = i;
      24        asm volatile ("" ::: "memory");
      25      }
      26  
      27    for (i = 0; i < N/4; i++)
      28      {
      29        in[i*4] = in[i*4] + 5;
      30        in[i*4 + 1] = in[i*4 + 1] + 5;
      31        in[i*4 + 2] = in[i*4 + 2] + 5;
      32        in[i*4 + 3] = in[i*4 + 3] + 5;
      33  
      34      }
      35  
      36    /* check results:  */
      37    for (i = 0; i < N; i++)
      38      {
      39        if (in[i] != i+5)
      40          abort ();
      41      }
      42  
      43    /* Not vectorizable because of data dependencies.  */
      44    for (i = 1; i < N/4; i++)
      45      {
      46        in2[i*4] = in2[(i-1)*4] + 5;
      47        in2[i*4 + 1] = in2[(i-1)*4 + 1] + 5;
      48        in2[i*4 + 2] = in2[(i-1)*4 + 2] + 5;
      49        in2[i*4 + 3] = in2[(i-1)*4 + 3] + 5;
      50  
      51      }
      52  
      53    /* check results:  */
      54    for (i = 0; i < N; i++)
      55      {
      56        if (in2[i] != (i % 4) + (i / 4) * 5)
      57          abort ();
      58      }
      59    
      60    /* Not vectorizable because of data dependencies: distance 3 is greater than 
      61       the actual VF with SLP (2), but the analysis fail to detect that for now.  */
      62    for (i = 3; i < N/4; i++)
      63      {
      64        in3[i*4] = in3[(i-3)*4] + 5;
      65        in3[i*4 + 1] = in3[(i-3)*4 + 1] + 5;
      66        in3[i*4 + 2] = in3[(i-3)*4 + 2] + 5;
      67        in3[i*4 + 3] = in3[(i-3)*4 + 3] + 5;
      68  
      69      }
      70  
      71    /* check results:  */
      72    for (i = 0; i < N; i++)
      73      {
      74        if (in3[i] != (i % 12) + (i / 12) * 5)
      75          abort ();
      76      }
      77  
      78  
      79    return 0;
      80  }
      81  
      82  int main (void)
      83  {
      84    check_vect ();
      85  
      86    main1 ();
      87  
      88    return 0;
      89  }
      90  
      91  /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { ! vect32 } } } } */
      92  /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target vect32 } } } */
      93  /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target { ! vect32 } } } } */
      94