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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2023-11-15
     Ever confirmed|0                           |1

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
```
  _7 = (char) c.2_5;
...
  _26 = _7 == 0;
  _27 = c.2_5 == 0;
  _28 = _26 & _27;
  if (_28 != 0)
```
we transform this into:
```
  _26 = _7 == 0;
  _27 = c.2_5 == 0;
  if (c.2_5 == 0)
```
During FRE1
Which is correct. and _26 goes away later on.

Then in evpr GCC changes:
```
  # iftmp.8_29 = PHI <_7(4), 0(5)>

```
into:
```
  # iftmp.8_29 = PHI <-1(4), 0(5)>
```

Which is also correct.

Where it goes wrong is vrp1.

We end up with this mess:
```
  b.0_1 = b;
  _2 = b.0_1 == 0;
  _4 = (int) _2;
  c = _4;
  i.7_12 = (unsigned int) _2;
  _16 = b.0_1 != 0;
  _15 = _16 ? 1 : 2;
  if (_15 == 2)
    goto <bb 3>; [0.00%]
  else
    goto <bb 4>; [100.00%]

  <bb 3> [count: 0]:
  __builtin_unreachable ();
```

But that is basically:
```
...
if (b.0_1 == 0) __builtin_unreachable();
```

Reply via email to