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

    <tr>
        <th>Summary</th>
        <td>
            Use `range` parameter attributes to fold `sub`+`icmp u*` into `icmp s*`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    (This example comes from looking at Rust's discriminant code from <https://rust.godbolt.org/z/1138aGqdb>)

Take this input IR:
```llvm
define noundef zeroext i1 @is_foo(i8 noundef range(i8 -1, 5) %x) unnamed_addr {
start:
  %0 = sub i8 %x, 2
  %1 = zext i8 %0 to i64
  %2 = icmp ule i8 %0, 2
  %3 = add i64 %1, 1
  %_2 = select i1 %2, i64 %3, i64 0
  %_0 = icmp eq i64 %_2, 0
  ret i1 %_0
}
```
Today, LLVM does simplify it a bunch, getting it down to <https://llvm.godbolt.org/z/G7as7Y6o5>
```llvm
define noundef zeroext i1 @is_foo(i8 noundef range(i8 -1, 5) %x) unnamed_addr #0 {
  %0 = add nsw i8 %x, -5
  %1 = icmp ult i8 %0, -3
  ret i1 %1
}
```

It could do better, though.  The range information *was* used to determine the `nsw`, but that doesn't really help the *unsigned* `icmp`.

Specifically, the `range` restriction is enough that it'd be allowed to be just <https://alive2.llvm.org/ce/z/fkVEwL>
```llvm
define noundef zeroext i1 @is_foo(i8 noundef range(i8 -1, 5) %x) unnamed_addr #0 {
start:
  %1 = icmp slt i8 %x, 2
  ret i1 %1
}
```

Eliminating the need for the `add` altogether.

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVU1v2zgQ_TX0ZRCDoixZPuigfBUFspdutsCeDEocSWwo0iWHcZJfv6Bkp07bw552AQMyyDdf7z2NZAh6sIg1K65ZcbuSkUbn69A5oqmbVq1TrzUT1eOoA-CLnA4GoXMTBui9m8A496TtAJLgSwzExDaA0qHzetJWWoLOKVygLL8ZiQ6B5Q0T90zc-xhoPTjVOkNr5wcm7t-YuM-yvJKfvquW5XdM7BhvGG8e5RMCpSa0PUSCz19SGt6wki8_Y54nxhuFvbYI1kWrsIc39A5fCHQGbMN12PfOMVHp6h3hpR1wObrKmLiBgokdMFG8pGe0Vk6o9lIpD2x7zXgTSHpaikPCcWD5LYTYgq5OcTcgzrfZfPs291AtcHKgy80ZIGaA7qYDRINn0Icc-QyRSqW4OWm6zs7X-yVFQIPdMqkoREKc0Pn5P3-P4D-K4vczbj8HLSCP50z7dMC2t5dcJz2ckq8J__Dw9Q9QDgMEPR2M7l9BE0hoo-3GBBiQKDlEEyh3tGn8X5yQxPuNEz5tZdj-XboiOeE_1lrk_CT4hcpJAxuOl0pfFR-lPilJl0pe5T-Rmv2WU8abz-mFiUaBctAiEfoUT6OLw7gGeBxxGQK07Z2fJGlngYnmKAMTDcSAKhGskNBPiRwaEVjJbTimGuIG2khAo6RZM8vElsCjNOYVRjSHBS-aaOe1oFJSVvI0FCv5emnyzwN2utddilram2ss7JYcPAbyupt7S1vDpu6XojptCAUtgjTGHZduW4RvMdCvtpBGP6NYz-5YXNHhyRr909e748P_6oufF8GF_uFd_4tt8C_kvzPz2pzfl8SqRVTQO3-mWCqVCJaG3IA0ok-KrFSdq12-kyuss-0mL7Y8L8VqrMui2nZYiVL2qCQWG5SVbIuSoxRdv9mudC24KPiGC17wkot1xXdFV2WyLzZ5hjvBNhwnqc27BCsdQsQ6yzdcVCsjWzRh_nQIYfEI8y0TIn1JfJ2Crto4BLbhRgcKP9KQJoP1X-GjcQ7SyylZFySR120kDMkgvTMqAUNsZxdfnywJkYlEIWibtsrpMCyHq-hN_dFPg6YxtuvOTaedc3pcHbz7hh0xcT9PENJXaBnxuRb_BAAA___fahy9">