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

            Bug ID: 126465
           Summary: [16/17 Regression] Wrong code with IFN_COND_FMA
                    folding on SVE
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: aarch64-sve, wrong-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ktkachov at gcc dot gnu.org
  Target Milestone: ---

On aarch64 with SVE the testcase:
float a[256], b[256], c[256], d[256], r[256];

__attribute__((noipa)) void
f (int n)
{
  for (int i = 0; i < n; i++)
    {
      float t = d[i] > 0.f ? __builtin_fmaf (a[i], b[i], c[i]) : d[i];
      r[i] = -t;
    }
}

__attribute__((noipa)) void
g (int n)
{
  for (int i = 0; i < n; i++)
    {
      float t = d[i] > 0.f ? __builtin_fmaf (-a[i], b[i], c[i]) : d[i];
      r[i] = -t;
    }
}

int
main (void)
{
  for (int i = 0; i < 256; i++)
    {
      a[i] = 1.f; b[i] = 2.f; c[i] = 3.f; d[i] = -1.f; r[i] = 0.f;
    }
  f (256);
  for (int i = 0; i < 256; i++)
    if (r[i] != 1.f)
      __builtin_abort ();
  for (int i = 0; i < 256; i++)
    r[i] = 0.f;
  g (256);
  for (int i = 0; i < 256; i++)
    if (r[i] != 1.f)
      __builtin_abort ();
  return 0;
}

aborts with -O3 -march=armv8-a+sve but passes without +sve and also passes
anyway with GCC 15.
I suspect this is a generic bug though.

Reply via email to