(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
slp-23.c
       1  /* Disabling epilogues until we find a better way to deal with scans.  */
       2  /* { dg-additional-options "--param vect-epilogues-nomask=0" } */
       3  /* { dg-require-effective-target vect_int } */
       4  
       5  #include <stdarg.h>
       6  #include "tree-vect.h"
       7  
       8  #define N 128 
       9  
      10  typedef struct {
      11     int a;
      12     int b;
      13     int c;
      14     int d;
      15     int e;
      16     int f;
      17     int g;
      18     int h;
      19  } s;
      20  
      21  int
      22  main1 (s *arr)
      23  {
      24    int i;
      25    s *ptr = arr;
      26    s res[N];
      27  
      28    for (i = 0; i < N; i++)
      29      {
      30        res[i].c = ptr->c + ptr->c;
      31        res[i].a = ptr->a + ptr->a;
      32        res[i].d = ptr->d + ptr->d;
      33        res[i].b = ptr->b + ptr->b;
      34        res[i].f = ptr->f + ptr->f;
      35        res[i].e = ptr->e + ptr->e; 
      36        res[i].h = ptr->h + ptr->h;   
      37        res[i].g = ptr->g + ptr->g;
      38        ptr++; 
      39      } 
      40     
      41    /* check results:  */
      42    for (i = 0; i < N; i++)
      43      { 
      44        if (res[i].c != arr[i].c + arr[i].c
      45            || res[i].a != arr[i].a + arr[i].a
      46            || res[i].d != arr[i].d + arr[i].d
      47            || res[i].b != arr[i].b + arr[i].b
      48            || res[i].f != arr[i].f + arr[i].f
      49            || res[i].e != arr[i].e + arr[i].e
      50            || res[i].h != arr[i].h + arr[i].h
      51            || res[i].g != arr[i].g + arr[i].g)
      52           abort();
      53      }
      54  
      55    ptr = arr;
      56    for (i = 0; i < N; i++)
      57      {
      58        res[i].c = ptr->c + ptr->c;
      59        res[i].a = ptr->a + ptr->a;
      60        res[i].d = ptr->d + ptr->d;
      61        res[i].b = ptr->b + ptr->b;
      62        res[i].f = ptr->f + ptr->f;
      63        res[i].e = ptr->e + ptr->e;
      64        res[i].h = ptr->e + ptr->e;
      65        res[i].g = ptr->g + ptr->g;
      66        ptr++;
      67      }
      68  
      69    /* check results:  */
      70    for (i = 0; i < N; i++)
      71      {
      72        if (res[i].c != arr[i].c + arr[i].c
      73            || res[i].a != arr[i].a + arr[i].a
      74            || res[i].d != arr[i].d + arr[i].d
      75            || res[i].b != arr[i].b + arr[i].b
      76            || res[i].f != arr[i].f + arr[i].f
      77            || res[i].e != arr[i].e + arr[i].e
      78            || res[i].h != arr[i].e + arr[i].e
      79            || res[i].g != arr[i].g + arr[i].g)
      80           abort();
      81      }
      82  
      83  }
      84  
      85  int main (void)
      86  {
      87    int i;
      88    s arr[N];
      89    
      90    check_vect ();
      91  
      92    for (i = 0; i < N; i++)
      93      { 
      94        arr[i].a = i;
      95        arr[i].b = i * 2;
      96        arr[i].c = 17;
      97        arr[i].d = i+34;
      98        arr[i].e = i * 3 + 5;
      99        arr[i].f = i * 5;
     100        arr[i].g = i - 3;
     101        arr[i].h = 56;
     102        asm volatile ("" ::: "memory");
     103      } 
     104  
     105    main1 (arr);
     106  
     107    return 0;
     108  }
     109  
     110  /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target { vect_strided8 && { ! { vect_no_align} } } } } } */
     111  /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { ! { vect_strided8 || vect_no_align } } } } } */
     112  /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target { ! vect_perm } } } } */
     113  /* SLP fails for the second loop with variable-length SVE because
     114     the load size is greater than the minimum vector size.  */
     115  /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" { target vect_perm xfail { aarch64_sve && vect_variable_length } } } } */
     116