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

    <tr>
        <th>Summary</th>
        <td>
            `exact` flag in `udiv` isn't used when folding away comparison [InstCombine]
        </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>
    Today <https://llvm.godbolt.org/z/aqEabMT17>, LLVM optimizes
```llvm
define noundef i1 @src(i64 noundef %a, i64 noundef %b) unnamed_addr #0 {
start:
  %db = sub nuw i64 %b, %a
  %de = udiv exact i64 %db, 4
  %inrange = icmp ule i64 %de, 127
  tail call void @llvm.assume(i1 %inrange)
  %z = icmp eq i64 %de, 0
  ret i1 %z
}
```
to
```llvm
  %inrange = icmp ult i64 %db, 512
  tail call void @llvm.assume(i1 %inrange)
```

That's good, but it could be better -- that `ult(%db, 512)` is what it needs to be when it might be in-`exact`.

Because the `udiv`ision is marked `exact` here, though, it could be simplified to a tighter check:
```llvm
  %inrange = icmp ult i64 %db, 509
  tail call void @llvm.assume(i1 %inrange)
```

Alive proof: <https://alive2.llvm.org/ce/z/YTVqCH>

---

Context: I'm trying to give LLVM more value range information for slice iterators in rust, and was surprised to see 
```llvm
    %_10.i = icmp ult i64 %5, -9223372036854775807 ; 0x8000000000000001
    tail call void @llvm.assume(i1 %_10.i)
```
in the output, when it could have just been `ult(%5, 0x80…00)` aka `sgt(%5, -1)`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VUtv4zYQ_jX0ZWCDot4HHRJnjS6wewsW6GlBiWOJG4l0yKGd5NcXlPJQ0qYosKhh2CD58ZuZbx6U3uveIDYsv2b5zUYGGqxrfGeJpm7atFY9NrdWyUdg6X4gOnmWXjFxYOIwjudp11vV2pF21vVMHJ6YOMj7L7L9fpuULP3CxB6-ffvxHeyJ9KSf0DN-w_gVK_jyjRzLlsKjNgjGBqPwCDoBlnHvOiYqXWSv-0zkMrJ-2GuZqCEYIydUP6VSDphIObDyemH3JB1Fz-cVxCuqBZbegA8tmHCZCRei_WJkhcQZGZQ-Az7Ijl7AakZnK6g2Tpp-wetuOkEY8RWNEZ2I8gVPUo_QyXGEs9UqxjtLKr0PE8a4kxUlE_XKztObBbx_b4C_wBwSLBRPz6qXNx_kX5ZkP83KZ0F9kCBPxO8F9cGj5fd2kMRE6aG3VkUzbSDQBJ0No4IWoUUidLDdAg2SgBU8jMRE9c4vUbOCg_ZwiRhNYBCVB7KR4TKgiXuT7geKG9psWcHnLLOC79buXGMng0egAWdTSp9ZwbXX1kT6Sbo7VLC6DQO6OSU02NAPc9muvPd6Oo36qFFFZyRQ9AEddAN2d6-1-htJ4fX_kJSrUZ8RTs7aI0uv_j4VZDwXu5l_GQodPk-GP29_3O__iGNhxbfdbtfLvTWED7FV4SsT5QTkHrXpo0J9NDxPk8k6hLMcA8IigjZH6yZJMRVH68CPukPQhE6SdR60ARc8RVWkUXCRHnxwJ6f9Ir5HhH-Rexb8Z8J3-h_lziPvthYiTUvB06LKs7LMK14CS6-BP1T83Sd5o_1veZktf5YVbeaCtIFOYQ7wpaSXOhvkGeFX8LG40bxrkdnt6B37IljF2VXB-XO3yDsZob5fQ7fJcrrbqCZVdVrLDTZJmYgsreq83AxNUReywyIry0QWaSZSbHnNpUzzJEtEnWx0I7jIeMYLEdflTlb8yEt-LGRX5VWtWMZxknp8rZ-N9j5gU5VVnW9G2eLo57dKCIMXmA-ZEPHpck28s21D76OO2pN_YyFNIzbr3jyOso918dbJoL1hoiQIsSpmGY92VLH65EU-Qmenk3TaWwMsv_5qPO3t1GqD0XpwY_O-EXpNQ2h3nZ2e38rnv-3J2V_YEROH2X3PxGEO768AAAD__4SrMIw">