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

```

Reply via email to