https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91096

            Bug ID: 91096
           Summary: Openmp vector max reduction incorrect
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wilco at gcc dot gnu.org
  Target Milestone: ---

The new gcc.dg/vect/vect-simd-14.c test produces incorrect reduction due to the
vectorizer adding fmax (result, FLT_MAX):

float b[1024], a[1024];

__attribute__((noipa)) float
bar (void)
{
  float s = -__builtin_inff ();
  #pragma omp simd reduction (inscan, max:s)
  for (int i = 0; i < 1024; i++)
    {
      b[i] = s;
      #pragma omp scan exclusive(s)
      s = s > a[i] ? s : a[i];
    }
  return s;
}

When built with -ffast-math -ftree-vectorize -O2 -fdump-tree-vect-details
-fopenmp-simd it shows the following constants being used in the fmax
operations:

  vect_cst__30 = { -3.4028234663852885981170418348451692544e+38,
-3.4028234663852885981170418348451692544e+38,
-3.4028234663852885981170418348451692544e+38,
-3.4028234663852885981170418348451692544e+38 };

This is 0xff7fffff / -0x1.fffffep+127 / FLT_MAX. As a result b[0] has the wrong
value - it should be -inff.

Reply via email to