(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
slp-13-big-array.c
       1  /* { dg-require-effective-target vect_int } */
       2  
       3  #include <stdarg.h>
       4  #include "tree-vect.h"
       5  
       6  #define N 64
       7  
       8  int
       9  main1 ()
      10  {
      11    int i;
      12    unsigned short out[N*8];
      13    unsigned short in[N*8];
      14    unsigned int in2[N*8];
      15    unsigned int out2[N*8];
      16  
      17    for (i = 0; i < N*8; i++)
      18      {
      19        in[i] = in2[i] = i;
      20        asm volatile ("" ::: "memory");
      21      }
      22  
      23    /* Induction is SLPable.  */
      24    for (i = 0; i < N; i++)
      25      {
      26        out[i*8] = in[i*8] + i;
      27        out[i*8 + 1] = in[i*8 + 1] + i;
      28        out[i*8 + 2] = in[i*8 + 2] + i;
      29        out[i*8 + 3] = in[i*8 + 3] + i;
      30        out[i*8 + 4] = in[i*8 + 4] + i;
      31        out[i*8 + 5] = in[i*8 + 5] + i;
      32        out[i*8 + 6] = in[i*8 + 6] + i;
      33        out[i*8 + 7] = in[i*8 + 7] + i;
      34      }
      35  
      36    /* check results:  */
      37    for (i = 0; i < N; i++)
      38      {
      39        if (out[i*8] !=  in[i*8] + i
      40           || out[i*8 + 1] != in[i*8 + 1] + i
      41           || out[i*8 + 2] != in[i*8 + 2] + i
      42           || out[i*8 + 3] != in[i*8 + 3] + i
      43           || out[i*8 + 4] != in[i*8 + 4] + i
      44           || out[i*8 + 5] != in[i*8 + 5] + i
      45           || out[i*8 + 6] != in[i*8 + 6] + i
      46           || out[i*8 + 7] != in[i*8 + 7] + i)
      47  	abort ();
      48      }
      49  
      50    /* Induction is SLPable.  */
      51    for (i = 0; i < N/2; i++)
      52      {
      53        out2[i*12] = in2[i*12] + i;
      54        out2[i*12 + 1] = in2[i*12 + 1] + i;
      55        out2[i*12 + 2] = in2[i*12 + 2] + i;
      56        out2[i*12 + 3] = in2[i*12 + 3] + i;
      57        out2[i*12 + 4] = in2[i*12 + 4] + i;
      58        out2[i*12 + 5] = in2[i*12 + 5] + i;
      59        out2[i*12 + 6] = in2[i*12 + 6] + i;
      60        out2[i*12 + 7] = in2[i*12 + 7] + i;
      61        out2[i*12 + 8] = in2[i*12 + 8] + i;
      62        out2[i*12 + 9] = in2[i*12 + 9] + i;
      63        out2[i*12 + 10] = in2[i*12 + 10] + i;
      64        out2[i*12 + 11] = in2[i*12 + 11] + i;
      65      }
      66  
      67    /* check results:  */
      68    for (i = 0; i < N/2; i++)
      69      {
      70          if (out2[i*12] != in2[i*12] + i
      71              || out2[i*12 + 1] != in2[i*12 + 1] + i
      72              || out2[i*12 + 2] != in2[i*12 + 2] + i
      73              || out2[i*12 + 3] != in2[i*12 + 3] + i
      74              || out2[i*12 + 4] != in2[i*12 + 4] + i
      75              || out2[i*12 + 5] != in2[i*12 + 5] + i
      76              || out2[i*12 + 6] != in2[i*12 + 6] + i
      77              || out2[i*12 + 7] != in2[i*12 + 7] + i
      78              || out2[i*12 + 8] != in2[i*12 + 8] + i
      79              || out2[i*12 + 9] != in2[i*12 + 9] + i
      80              || out2[i*12 + 10] != in2[i*12 + 10] + i
      81              || out2[i*12 + 11] != in2[i*12 + 11] + i)
      82            abort ();
      83      }
      84  
      85    /* Not power of 2 but SLPable.  */
      86    for (i = 0; i < N/2; i++)
      87      {
      88        out2[i*12] = in2[i*12] + 1;
      89        out2[i*12 + 1] = in2[i*12 + 1] + 2;
      90        out2[i*12 + 2] = in2[i*12 + 2] + 3;
      91        out2[i*12 + 3] = in2[i*12 + 3] + 4;
      92        out2[i*12 + 4] = in2[i*12 + 4] + 5;
      93        out2[i*12 + 5] = in2[i*12 + 5] + 6;
      94        out2[i*12 + 6] = in2[i*12 + 6] + 7;
      95        out2[i*12 + 7] = in2[i*12 + 7] + 8;
      96        out2[i*12 + 8] = in2[i*12 + 8] + 9;
      97        out2[i*12 + 9] = in2[i*12 + 9] + 10;
      98        out2[i*12 + 10] = in2[i*12 + 10] + 11;
      99        out2[i*12 + 11] = in2[i*12 + 11] + 12;
     100      }
     101  
     102    /* check results:  */
     103    for (i = 0; i < N/2; i++)
     104      {
     105          if (out2[i*12] != in2[i*12] + 1
     106              || out2[i*12 + 1] != in2[i*12 + 1] + 2
     107              || out2[i*12 + 2] != in2[i*12 + 2] + 3
     108              || out2[i*12 + 3] != in2[i*12 + 3] + 4
     109              || out2[i*12 + 4] != in2[i*12 + 4] + 5
     110              || out2[i*12 + 5] != in2[i*12 + 5] + 6
     111              || out2[i*12 + 6] != in2[i*12 + 6] + 7
     112              || out2[i*12 + 7] != in2[i*12 + 7] + 8
     113              || out2[i*12 + 8] != in2[i*12 + 8] + 9
     114              || out2[i*12 + 9] != in2[i*12 + 9] + 10
     115              || out2[i*12 + 10] != in2[i*12 + 10] + 11
     116              || out2[i*12 + 11] != in2[i*12 + 11] + 12)
     117            abort ();
     118      }
     119  
     120  
     121  
     122    return 0;
     123  }
     124  
     125  int main (void)
     126  {
     127    check_vect ();
     128  
     129    main1 ();
     130  
     131    return 0;
     132  }
     133  
     134  /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target { { vect_interleave && vect_extract_even_odd } && { ! vect_pack_trunc } } } } } */
     135  /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" { target { ! vect_pack_trunc } } } } */
     136  /* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { target { { vect_interleave && vect_extract_even_odd } && vect_pack_trunc } } } } */
     137  /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 3 "vect" { target vect_pack_trunc xfail vect_variable_length } } } */