(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
vect-reduc-in-order-2.c
       1  /* { dg-xfail-run-if "" { { i?86-*-* x86_64-*-* } && ia32 } } */
       2  /* { dg-require-effective-target vect_double } */
       3  /* { dg-add-options ieee } */
       4  /* { dg-additional-options "-fno-fast-math" } */
       5  
       6  #include "tree-vect.h"
       7  
       8  #define N (VECTOR_BITS * 17)
       9  
      10  double __attribute__ ((noinline, noclone))
      11  reduc_plus_double (double *restrict a, int n)
      12  {
      13    double res = 0.0;
      14    for (int i = 0; i < n; i++)
      15      for (int j = 0; j < N; j++)
      16        res += a[i];
      17    return res;
      18  }
      19  
      20  int __attribute__ ((optimize (1)))
      21  main ()
      22  {
      23    int n = 19;
      24    double a[N];
      25    double r = 0;
      26    for (int i = 0; i < N; i++)
      27      {
      28        a[i] = (i * 0.1) * (i & 1 ? 1 : -1);
      29        asm volatile ("" ::: "memory");
      30      }
      31    for (int i = 0; i < n; i++)
      32      for (int j = 0; j < N; j++)
      33        {
      34  	r += a[i];
      35  	asm volatile ("" ::: "memory");
      36        }
      37    double res = reduc_plus_double (a, n);
      38    if (res != r)
      39      __builtin_abort ();
      40    return 0;
      41  }
      42  
      43  /* { dg-final { scan-tree-dump {in-order double reduction not supported} "vect" } } */
      44  /* { dg-final { scan-tree-dump-times {using an in-order \(fold-left\) reduction} 1 "vect" } } */