<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/118914>118914</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Boolean operations on a custom bool with values -1 and 0 do not use range metadata to optimize
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          saethlin
      </td>
    </tr>
</table>

<pre>
    The original motivating example is all the missed optimizations in https://godbolt.org/z/6ahPs8P6d. All these methods should compile down to just the instruction that implements the desired boolean operation, but none of them do.

Alive2 is sure the desired optimizations (at least on the `and` implementations) are valid:
https://alive2.llvm.org/ce/z/746VLN
```llvm
define noundef range(i8 -1, 1) i8 @src(i8 noundef range(i8 -1, 1) %0, i8 noundef range(i8 -1, 1) %1) unnamed_addr {
  %3 = and i8 %1, %0
  %or.cond = icmp eq i8 %3, -1
 %_0.sroa.0.0 = sext i1 %or.cond to i8
  ret i8 %_0.sroa.0.0
}

define noundef range(i8 -1, 1) i8 @tgt(i8 noundef range(i8 -1, 1) %0, i8 noundef range(i8 -1, 1) %other) unnamed_addr {
  %res = and i8 %0, %other
  ret i8 %res
}
```
https://alive2.llvm.org/ce/z/b-3YI-
```llvm
define noundef range(i8 -1, 1) i8 @src(i8 noundef range(i8 -1, 1) %0, i8 noundef range(i8 -1, 1) %other) unnamed_addr {
  %switch = icmp eq i8 %0, -1
  %other. = select i1 %switch, i8 %other, i8 0
  ret i8 %other.
}

define noundef range(i8 -1, 1) i8 @tgt(i8 noundef range(i8 -1, 1) %0, i8 noundef range(i8 -1, 1) %other) unnamed_addr {
  %res = and i8 %0, %other
  ret i8 %res
}
```

But Alive2 is also sure that if I remove the range metadata, the transformation is invalid. So I think this just comes down to "range metadata is pretty new"?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkVVGL4zYQ_jXKyxAjy3bWfvBD9pbAQikHLYU-HbI1iXWVpVQzzt7dry-yvZtLKNce9KFwEGJsffPNzOfxN5rInjxiK6pHUT1t9MRDiC1p5MFZv-mC-dz-OiCEaE_WawdjYHvRbP0J8JMezw7BEmjngAeE0RKhgXBmO9ovmm3wBNbDwHwmUeyFOgh1OAXTBcdZiCehDl-EOuz08J7q9zuTwX6hIoQReQiGgIYwOQN9GM_WIZjw4oEDfJyI56TWE8epT8mAB81gU1kjeqb53CDZiAa6EBxqD-GMcS5NqHfQTQw-eIRwTOARTMiE3Au53zt7QZW6oyniDdNtf0LVmsGhJoa5BASxk9obsZPXWhawUA3oiHDRzpokiNzfaqPnrJlzl3HVp8dVpIdy99tPP6fidnL5JZSQe4NH6xF8mLzBI0TtTyhUbWvY5qnHPGW1NYhSUuyXk2-Dhapkuvk3wPk6ea9HNB-0MRHEw6OQe0iHBYjiCbQ3c_4Z_G5hXwEhZn3wZobZfjwD_rlCiwTd5gkoVPVBZhSDzmQmZyzhJwabf03BAWw980bkleSrsCTcw9Pybr9DMT7xf61Y4AHjt1SLSHe6yVW3JfS2x4h07e11NL5nsLpt8fvz9n83WP8oE71Y7oe_GR15HZ03omwdG4f96-As8Ws514TzrbwTeeH44WZIyP3jxHD1Qu0ovBpistojPEPEMVwWh5zrTc6tjWadEqanHLWnY4jjbIKJxvrZATP4JcAz8GD9H-mfFlfvw4j0ZvRCqVvaRHCOyPwZPL4IpURx2Ji2ME3R6A22-UNRlFVRqXwztFVvalM30lQPneqO1bHU3bGrm7osq6Jumo1tlVRlruROqkrJPGt2VdVUO10eO6VVX4tS4qite_t2NpZowjbP6yYvN0536Oh1g8Y2obbddCJRSmeJ6RrHlh22j_d7iNLa0NBPxGGc1xS8WB7SkpiQYJvPL1GCCeADw0T3OieV1p2Emym69m7fWh6mLuvDKNRh_rSXy_Ycw0fsWajD3BEJdViburTqrwAAAP__5cJ2yQ">