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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to work|13.1.0                      |

--- Comment #4 from Drea Pinski <pinskia at gcc dot gnu.org> ---
GCC 13 optimizes this almost all the way:
        ldrb    w1, [x0, 1]
        cmp     w1, 255
        beq     .L4
        cmp     w1, 7
        bhi     .L4
        ret
.L4:
        mov     w0, 0

After pre/"commoning" we get on the trunk:
```
  if (_5 != 255)
    goto <bb 3>; [78.28%]
  else
    goto <bb 5>; [21.72%]

  <bb 3> [local count: 840525096]:
  i_4 = (int) _5;
  _17 = (unsigned int) i_4;
  _16 = _5 == 7;
  _15 = _17 <= 6;
  _12 = _15 | _16;
  if (_12 != 0)
    goto <bb 4>; [99.28%]
  else
    goto <bb 5>; [0.72%]
```

Then reassociation is able to optmize it to:
```
  if (_5 != 255)
    goto <bb 3>; [78.28%]
  else
    goto <bb 5>; [21.72%]

  <bb 3> [local count: 840525096]:
  i_4 = (int) _5;
  _17 = (unsigned int) i_4;
  _16 = _5 == 7;
  _8 = _5 <= 7;
  _15 = _17 <= 6;
  _12 = _8;
  if (_12 != 0)
    goto <bb 4>; [99.28%]
  else
    goto <bb 5>; [0.72%]
```

But not combine the 2 ifs.

So the question is if inside pre we could do better and optimize:
```
  i_4 = (int) _5;
  _17 = (unsigned int) i_4;
  _16 = _5 == 7;
  _15 = _17 <= 6;
  _12 = _15 | _16;
```
into just `_5 <= 7` and then `_5 <= 7 && _5 != 255` just becomes `_5 <= 7`.

Looks like a mismatch in the types which is exposing that:
```
  <bb 15> [local count: 0]:
  if (i_4 == 6)
    goto <bb 16>; [34.00%]
  else
    goto <bb 17>; [66.00%]

  <bb 16> [local count: 12149537]:
  _13 = &in_3(D)->a;
  goto <bb 19>; [100.00%]

  <bb 17> [local count: 1]:
  if (_5 == 7)
    goto <bb 18>; [75.61%]
  else
    goto <bb 19>; [24.39%]
```

i_4 is:
  i_4 = (int) _5;
  unsigned char _5;

Reply via email to