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

--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> ---

```
  _20 = MEM[(const struct basic_string *)i_8(D)]._M_string_length;
  if (_20 != 0)
    goto <bb 20>; [33.00%]
  else
    goto <bb 68>; [67.00%]
...
  <bb 68> [local count: 719407024]:
  goto <bb 21>; [100.00%]
...
  # port_42 = PHI <port_1(D)(68), _31(20)>
  # port$4_41 = PHI <0(68), 1(20)>
  <bb 21> ...:
...

  <bb 37> [local count: 1073741824]:
  _36 = VIEW_CONVERT_EXPR<bool>(port$4_41);
  if (_36 != 0)
    goto <bb 38>; [50.00%]
  else
    goto <bb 69>; [50.00%]

  <bb 69> [local count: 536870912]:
  goto <bb 39>; [100.00%]

  <bb 38> [local count: 536870912]:

  <bb 39> [local count: 1073741824]:
  # _37 = PHI <port_42(38), 443(69)>
  _22 = std::basic_ostream<char>::operator<< (&reqb.D.91763, _37);
  goto <bb 41>; [100.00%]
```


But:
```
After normalization [DEF]:
        port_42 = PHI <port_1(D)(68), _31(20)>
  is conditional on:
        ((_20 != 0))

After normalization [USE]:
        _37 = PHI <port_42(38), 443(69)>
  is conditional on:
        ((_36 != 0))
```

So uninit does not see the relationship between _20 and _36; they are
equalivant.

Reply via email to