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

            Bug ID: 71271
           Summary: SLP loop vectorized twice
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alahay01 at gcc dot gnu.org
  Target Milestone: ---

Created attachment 38559
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=38559&action=edit
Vectorizer pass output

Consider the following code, compiled with -O3 -fno-common:

__attribute__ ((noinline)) int
liveloop (int start, int n, int *x, int *y)
{
  int i = start;
  int n0, n1, n2, n3;
  int j;

  for (j = 0; j < n; ++j)
    {
      i += 1;
      n0 = x[(j*4)];
      n1 = x[(j*4)+1];
      n2 = x[(j*4)+2];
      n3 = x[(j*4)+3];
      y[(j*4)] = n0 +1;
      y[(j*4)+1] = n1 +2;
      y[(j*4)+2] = n2 +7;
      y[(j*4)+3] = n3 +9;
    }
  return 0;
}


The vectorizer pass will split the loop using versioning (due to alias
dependencies). One version will be vectorized using SLP, the second will be
kept in scalar form.

However, the slp1 pass will then SLP vectorize the second scalar loop.

This results in the final assembler output containing two versions of the loop,
both of which are vectorized and are almost identical.

Whilst (i think) the code is correct, the code is not ideal.

Tested on x86 and aarch64.

Reply via email to