https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80641
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Priority|P3 |P2
Target Milestone|--- |7.2
Summary|Warning with std::vector |[7/8 Regression] Warning
|resize in loop |with std::vector resize in
| |loop
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
The warning could be improved to print the size signed or say that a negative
number passed as size is likely the reason.
It looks like the memset call is produced by loop distribution:
<bb 11> [9.15%]:
-
- <bb 12> [51.85%]:
- # __niter_77 = PHI <__niter_59(13), 18446744073709551615(11)>
- # __first_61 = PHI <__first_60(13), c$D15833$_M_impl$_M_finish_68(11)>
- *__first_61 = 0;
- __niter_59 = __niter_77 + 18446744073709551615;
- __first_60 = __first_61 + 4;
- if (__niter_59 == 0)
- goto <bb 5>; [17.65%]
- else
- goto <bb 13>; [82.35%]
-
- <bb 13> [42.70%]:
- goto <bb 12>; [100.00%]
+ __builtin_memset (c$D15833$_M_impl$_M_finish_68, 0, 18446744073709551612);
+ goto <bb 5>; [17.65%]
where the loop iterates { -1, +, -1 } thus quite a bit... This is all
guarded by an overflow check it seems:
<bb 9> [85.56%]:
sz_13 = _17 + 18446744073709551615;
if (sz_13 > _17)
goto <bb 10>; [29.56%]
else
goto <bb 15>; [70.44%]
so maybe libstdc++ could avoid this bogus loop.