https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82698
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |diagnostic
Status|UNCONFIRMED |RESOLVED
Resolution|--- |DUPLICATE
--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
I believe this is a dupe of bug 80641. The invalid memset is introduced by the
loop distribution pass. I would expect it to be possible to detect these cases
and either avoid inserting such invalid calls or replace them with
__builtin_unreachable. That should not only eliminate these false positives
but also improve the quality of the generated code.
foo (struct vector & bar)
{
int * __first;
long unsigned int _1;
int * _5;
int * _6;
long int _7;
long int _8;
long int _9;
long int _10;
long unsigned int _11;
long unsigned int _20;
int * _21;
long int __pos.12_22;
int * _23;
long int _24;
long int _27;
<bb 2> [100.00%] [count: INV]:
_5 = MEM[(int * *)bar_3(D)];
_6 = MEM[(int * *)bar_3(D) + 8B];
_7 = (long int) _6;
_8 = (long int) _5;
_9 = _7 - _8;
_10 = _9 /[ex] 4;
_11 = (long unsigned int) _10;
_1 = _11 + 18446744073709551615;
if (_1 > _11)
goto <bb 3>; [33.00%]
else
goto <bb 6>; [67.00%]
<bb 3> [16.50%] [count: INV]:
_23 = bar_3(D)->D.15765._M_impl._M_end_of_storage;
_24 = (long int) _23;
_27 = _24 - _7;
if (_27 == -4)
goto <bb 4>; [67.00%]
else
goto <bb 5>; [33.00%]
<bb 4> [11.06%] [count: INV]:
__builtin_memset (_6, 0, 18446744073709551612);
__first_28 = _6 + 18446744073709551612;
bar_3(D)->D.15765._M_impl._M_finish = __first_28;
goto <bb 8>; [100.00%]
<bb 5> [5.45%] [count: INV]:
std::__throw_length_error ("vector::_M_default_append");
<bb 6> [33.50%] [count: INV]:
_20 = _1 * 4;
_21 = _5 + _20;
__pos.12_22 = (long int) _21;
if (_7 != __pos.12_22)
goto <bb 7>; [66.00%]
else
goto <bb 8>; [34.00%]
<bb 7> [22.11%] [count: INV]:
MEM[(int * *)bar_3(D) + 8B] = _21;
<bb 8> [100.00%] [count: INV]:
return;
}
*** This bug has been marked as a duplicate of bug 80641 ***