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%]