(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
pr87288-3.c
       1  #include "tree-vect.h"
       2  
       3  #define N (VECTOR_BITS / 32)
       4  #define MAX_COUNT 4
       5  
       6  #define RUN_COUNT(COUNT)				\
       7    void __attribute__ ((noipa))				\
       8    run_##COUNT (int *restrict a, int *restrict b)	\
       9    {							\
      10      for (int i = 0; i < N * COUNT + 1; ++i)		\
      11        {							\
      12  	a[i * 2] = b[i * 2] + COUNT;			\
      13  	a[i * 2 + 1] = COUNT;				\
      14        }							\
      15    }
      16  
      17  RUN_COUNT (1)
      18  RUN_COUNT (2)
      19  RUN_COUNT (3)
      20  RUN_COUNT (4)
      21  
      22  void __attribute__ ((noipa))
      23  check (int *restrict a, int count)
      24  {
      25    for (int i = 0; i < count * N + 1; ++i)
      26      if (a[i * 2] != i * 41 + count || a[i * 2 + 1] != count)
      27        __builtin_abort ();
      28    if (a[count * 2 * N + 2] != 999)
      29      __builtin_abort ();
      30  }
      31  
      32  int a[N * MAX_COUNT * 2 + 3], b[N * MAX_COUNT * 2 + 2];
      33  
      34  int
      35  main (void)
      36  {
      37    check_vect ();
      38  
      39    for (int i = 0; i < N * MAX_COUNT + 1; ++i)
      40      {
      41        b[i * 2] = i * 41;
      42        asm volatile ("" ::: "memory");
      43      }
      44  
      45    a[N * 2 + 2] = 999;
      46    run_1 (a, b);
      47    check (a, 1);
      48  
      49    a[N * 4 + 2] = 999;
      50    run_2 (a, b);
      51    check (a, 2);
      52  
      53    a[N * 6 + 2] = 999;
      54    run_3 (a, b);
      55    check (a, 3);
      56  
      57    a[N * 8 + 2] = 999;
      58    run_4 (a, b);
      59    check (a, 4);
      60  
      61    return 0;
      62  }
      63  
      64  /* { dg-final { scan-tree-dump {LOOP VECTORIZED} "vect" { target { { vect_int && vect_perm } && vect_element_align } } } } */