(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
slp-19c.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 * 2 / 32)
       8  #else
       9  #define N 16
      10  #endif
      11  
      12  int
      13  main1 ()
      14  {
      15    unsigned int i;
      16    unsigned int out[N*8];
      17  #if N == 16
      18    unsigned int in[N*8] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
      19  #else
      20    unsigned int in[N * 8];
      21    for (unsigned int i = 0; i < N * 8; ++i)
      22      {
      23        in[i] = i & 63;
      24        asm volatile ("" ::: "memory");
      25      }
      26  #endif
      27    unsigned int ia[N*2], a0, a1, a2, a3;
      28  
      29    /* The last stmt requires interleaving of not power of 2 size - not
      30       vectorizable.  */
      31    for (i = 0; i < N/2; i++)
      32      {
      33        out[i*12] = in[i*12];
      34        out[i*12 + 1] = in[i*12 + 1];
      35        out[i*12 + 2] = in[i*12 + 2];
      36        out[i*12 + 3] = in[i*12 + 3];
      37        out[i*12 + 4] = in[i*12 + 4];
      38        out[i*12 + 5] = in[i*12 + 5];
      39        out[i*12 + 6] = in[i*12 + 6];
      40        out[i*12 + 7] = in[i*12 + 7];
      41        out[i*12 + 8] = in[i*12 + 8];
      42        out[i*12 + 9] = in[i*12 + 9];
      43        out[i*12 + 10] = in[i*12 + 10];
      44        out[i*12 + 11] = in[i*12 + 11];
      45  
      46        ia[i] = in[i*12 + 7];
      47      }
      48  
      49    /* check results:  */
      50    for (i = 0; i < N/2; i++)
      51      {
      52        if (out[i*12] !=  in[i*12]
      53           || out[i*12 + 1] != in[i*12 + 1]
      54           || out[i*12 + 2] != in[i*12 + 2]
      55           || out[i*12 + 3] != in[i*12 + 3]
      56           || out[i*12 + 4] != in[i*12 + 4]
      57           || out[i*12 + 5] != in[i*12 + 5]
      58           || out[i*12 + 6] != in[i*12 + 6]
      59           || out[i*12 + 7] != in[i*12 + 7]
      60           || out[i*12 + 8] != in[i*12 + 8]
      61           || out[i*12 + 9] != in[i*12 + 9]
      62           || out[i*12 + 10] != in[i*12 + 10]
      63           || out[i*12 + 11] != in[i*12 + 11]
      64           || ia[i] != in[i*12 + 7])
      65          abort ();
      66      }
      67  
      68    /* Hybrid SLP with unrolling by 2.  */
      69    for (i = 0; i < N; i++)
      70      {
      71        out[i*6] = in[i*6];
      72        out[i*6 + 1] = in[i*6 + 1];
      73        out[i*6 + 2] = in[i*6 + 2];
      74        out[i*6 + 3] = in[i*6 + 3];
      75        out[i*6 + 4] = in[i*6 + 4];
      76        out[i*6 + 5] = in[i*6 + 5];
      77  
      78        ia[i] = i;
      79      }
      80  
      81    /* check results:  */
      82    for (i = 0; i < N/2; i++)
      83      {
      84        if (out[i*6] !=  in[i*6]
      85           || out[i*6 + 1] != in[i*6 + 1]
      86           || out[i*6 + 2] != in[i*6 + 2]
      87           || out[i*6 + 3] != in[i*6 + 3]
      88           || out[i*6 + 4] != in[i*6 + 4]
      89           || out[i*6 + 5] != in[i*6 + 5]
      90           || ia[i] != i)
      91          abort ();
      92      }
      93  
      94    return 0;
      95  }
      96  
      97  int main (void)
      98  {
      99    check_vect ();
     100  
     101    main1 ();
     102  
     103    return 0;
     104  }
     105  
     106  /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
     107  /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" } } */