https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109849
--- Comment #45 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #2)
> (In reply to Jan Hubicka from comment #0)
> > saving an instruction. Why we do not move stack+8 updating out of the loop?
>
> Maybe because of a clobber:
> cur$second_5 = MEM[(const struct pairD.26349 &)_7 +
> 18446744073709551608].secondD.27577;
> # PT = nonlocal escaped
> _4 = _7 + 18446744073709551608;
> # .MEM_9 = VDEF <.MEM_1>
> stackD.26352.D.27437._M_implD.26667.D.26744._M_finishD.26670 = _4;
> # .MEM_10 = VDEF <.MEM_9>
> MEM[(struct pairD.26349 *)_7 + -8B] ={v} {CLOBBER};
The clobber definitely is NOT helping. If we do `-fno-exceptions -O2
-flifetime-dse=0` LIM can pull the store out.
And then we get:
```
<bb 3> [local count: 1014686025]:
cur$second_8 = MEM[(unsigned int *)stack__lsm.48_10 + -4B];
_5 = stack__lsm.48_10 + 18446744073709551608;
if (cur$second_8 != 0)
goto <bb 4>; [5.50%]
else
goto <bb 5>; [94.50%]
<bb 4> [local count: 55807731]:
MEM[(const struct pair * const &)&stack + 8] = _5;
goto <bb 8>; [100.00%] // return
<bb 5> [local count: 1073741824]:
# stack__lsm.48_10 = PHI <stack__lsm.48_12(2), _5(3)>
# stack__lsm_flag.49_11 = PHI <0(2), 1(3)>
if (_7 != stack__lsm.48_10)
goto <bb 3>; [94.50%]
else
goto <bb 6>; [5.50%]
<bb 6> [local count: 59055800]:
if (stack__lsm_flag.49_11 != 0)
goto <bb 7>; [66.67%]
else
goto <bb 8>; [33.33%]
<bb 7> [local count: 39370533]:
MEM[(const struct pair * const &)&stack + 8] = stack__lsm.48_10;
<bb 8> [local count: 114863531]:
```