(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
pr110381.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target vect_float_strict } */
       3  
       4  #include "tree-vect.h"
       5  
       6  struct FOO {
       7     double a;
       8     double b;
       9     double c;
      10  };
      11  
      12  double __attribute__((noipa))
      13  sum_8_foos(const struct FOO* foos)
      14  {
      15    double sum = 0;
      16  
      17    for (int i = 0; i < 8; ++i)
      18      {
      19        struct FOO foo = foos[i];
      20  
      21        /* Need to use an in-order reduction here, preserving
      22           the load permutation.  */
      23        sum += foo.a;
      24        sum += foo.c;
      25        sum += foo.b;
      26      }
      27  
      28    return sum;
      29  }
      30  
      31  int main()
      32  {
      33    struct FOO foos[8];
      34  
      35    check_vect ();
      36  
      37    __builtin_memset (foos, 0, sizeof (foos));
      38    foos[0].a = __DBL_MAX__;
      39    foos[0].b = 5;
      40    foos[0].c = -__DBL_MAX__;
      41  
      42    if (sum_8_foos (foos) != 5)
      43      __builtin_abort ();
      44    return 0;
      45  }