https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115579

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2024-06-21
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Confirmed. LIM is doing it wrong:
```
  <bb 2> [local count: 118111600]:
  a.0_1 = a;
...
  b_lsm.10_17 = _16(D);
  goto <bb 4>; [100.00%]
...
  <bb 4> [local count: 1073741824]:
  # d_I_lsm.9_13 = PHI <d_I_lsm.9_15(2), d_I_lsm.9_18(3)>
  # b_lsm.10_14 = PHI <b_lsm.10_17(2), b_lsm.10_19(3)>
  if (a.0_1 != 0)
    goto <bb 3>; [89.00%]
  else
    goto <bb 5>; [11.00%]

  <bb 5> [local count: 118111600]:
  # d_I_lsm.9_23 = PHI <d_I_lsm.9_13(4)>
  # b_lsm.10_24 = PHI <b_lsm.10_14(4)>
  d[1] = d_I_lsm.9_23;
  b = b_lsm.10_24;
...
```

Why was the store to b an unconditional one here?



Before LIM:
```
  <bb 2> [local count: 118111600]:
  goto <bb 4>; [100.00%]

  <bb 3> [local count: 955630224]:
  d[1] = 0;
  b = 0;

  <bb 4> [local count: 1073741824]:
  a.0_1 = a;
  if (a.0_1 != 0)
    goto <bb 3>; [89.00%]
  else
    goto <bb 5>; [11.00%]
```

It looks like it is pulling out d[1] of the loop unconditionally and that also
causes b to be done unconditionally ...

So -Os is needed because we can't see the loop is an infinite one too ...

Reply via email to