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

            Bug ID: 99929
           Summary: SVE: Wrong code at -O2 -ftree-vectorize
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: acoplan at gcc dot gnu.org
  Target Milestone: ---

AArch64 GCC miscompiles the following testcase:

#include <arm_sve.h>
static void e(unsigned long long *g, int p2) { *g ^= p2; }
static unsigned long long b;
static int f[1][1][1][1];
static long l[23][2];
static short m[23];
int main() {
  for (unsigned i = 0; i < 23; ++i)
    for (unsigned j = 0; j < 2; ++j)
      l[i][j] = m[i] = 4;
  if (svaddv(svptrue_pat_b32(SV_VL1), svdup_u32(1)) != 1)
    __builtin_abort();
  for (unsigned i = 0; i < 3; ++i)
    e(&b, m[i]);
}

with -march=armv8.2-a+sve -O2 -ftree-vectorize. At -O2 (without
-ftree-vectorize), we do the reduction with:

  uaddv d0, p0, z0.s

where the predicate is generated by:

  ptrue p0.b, vl1

which gives the expected result. With -ftree-vectorize, we do the reduction
with:

  uaddv d0, p1, z0.s

where the predicate is generated by:

  ptrue p1.h, all

which does not give the expected result.

Reply via email to