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

HaoChen Gui <guihaoc at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |guihaoc at gcc dot gnu.org,
                   |                            |rguenth at gcc dot gnu.org

--- Comment #4 from HaoChen Gui <guihaoc at gcc dot gnu.org> ---
#define LEN 4

struct {
  char c[LEN]
} d;

extern int a;
extern char* b;

int p() {
  for (int i = 0; i < a; i++) {
    d.c[i] = b[i];
  }
  return 0;
}

Above codes cause the same errors on x86. When setting the LEN to 8, it can be
also reproduced on aarch64. It's a common problem.

The iteration number of reset loop after vectorization should not only decided
by variable "a" but also by the length of array. If the len is 5 and vector
size is 4, the reset loop should be only executed once. Currently iteration
number only depends on variable "a". Then it is complete unrolled 3 times if
vector size is 4. That causes the warning.

  <bb 17> [local count: 398179264]:
  # i_30 = PHI <i_36(18), tmp.9_40(20)>
  _32 = (sizetype) i_30;
  _33 = b.0_1 + _32;
  _34 = *_33;
  d.c[i_30] = _34;
  i_36 = i_30 + 1;
   if (i_36 < a.1_13)  // iterations depend on "a" only, the length of array is
not take into consideration
    goto <bb 18>; [89.00%]
  else
    goto <bb 19>; [11.00%]

Reply via email to