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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|pinskia at gcc dot gnu.org         |unassigned at gcc dot 
gnu.org
             Status|ASSIGNED                    |NEW

--- Comment #12 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
So what r14-1691-gbc5a2c2e793  does is correct.
  # RANGE [irange] unsigned int [0, 0][4, 4][+INF, +INF]
  unsigned intD.14 l_14(D) = lD.2821;

vs before:
  # RANGE [irange] unsigned int [0, 0][4, +INF]
  unsigned intD.14 l_14(D) = lD.2821;


This change causes:
  c_16 = (short int) l_14(D);
  if (c_16 == 0)
    goto <bb 9>; [50.00%]
  else
    goto <bb 7>; [50.00%]

To be optimized to `goto <bb 7>` because it is on the path where `l_14(D) !=
0`.

And then from:
  <bb 7> [local count: 628138967]:
  # iftmp.1_7 = PHI <1(3), 0(6)>

We get:
  <bb 6> [local count: 628138968]:
  # iftmp.1_7 = PHI <_16(3), 0(5)>


Which DOM is not able to jump thread ...

If could copy `bb 6`, then it might be optimizable.

the path along 5, gets optimized to false.

The other path we have:
```
  _16 = l_14(D) == 0; (iftmp.1_7)
  _4 = (int) iftmp.1_7;
  _6 = e;
  _19 = _4 == _6;
  _5 = ~iftmp.1_7;
  _20 = _6 != 0;
  _9 = _5 & _20;
  _3 = _9 & _19;
...
```
or
```
_20 = _6 != 0;
_19 = _6 == (l_14(D) == 0 ? 1 : 0)
_5 = l_14(D) != 0
_3 = _5 & _20 & _19;
```

`_5 & _19` simplifies down to `l_14(D) != 0` & _6 == 0`
and that  with `_6 != 0` gets you false. too.

So I am thinking there is a missing jump thread here.

Reply via email to