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

    <tr>
        <th>Summary</th>
        <td>
            missing instcombine: select (icmp ugt A, N), (shr A, M), 0 -> shr A, M, when N < 2^M
        </td>
    </tr>

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

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

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

<pre>
    [Example](https://godbolt.org/z/qvo39qTbv), seen [in the wild in libcap-ng](https://github.com/stevegrubb/libcap-ng/blob/f6ac52c2d659392fbd1b47cf27ed25916ad3487b/src/cap-ng.c#L726):

```c++
void f(int, int);
void g(unsigned int capability) {
        int idx;

        if (capability > 31) {
                idx = capability>>5;
                capability %= 32;
        } else
                idx = 0;

        f(idx, capability);
}
```

produces:

```llvm
define dso_local void @g(i32 noundef %0) local_unnamed_addr #0 {
  %2 = icmp ugt i32 %0, 31
  %3 = lshr i32 %0, 5
  %4 = and i32 %0, 31
  %5 = select i1 %2, i32 %3, i32 0
  tail call void @f(i32 noundef %5, i32 noundef %4) #2
  ret void
}
```

This could be optimized further to:

```llvm
define dso_local void @g(i32 noundef %0) local_unnamed_addr #0 {
  %1 = lshr i32 %0, 5
  %2 = and i32 %0, 31
  tail call void @f(i32 noundef %1, i32 noundef %2) #2
  ret void
}
```

The general pattern here is:

`select (icmp ugt A, N), (shr A, M), 0` -> `shr A, M`

whenever `N` < 2<sup>`M`</sup>.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFVUtz2yAQ_jXShYlHAj2sgw6JnZyanHrP8JJEBwlFIOfx67tgu5ZTp8m0h3qwBMu3Hx_LamFGvNZRfnP7QvtRyyjfRnjdOTfaiFxH-A5aawQz2q3M1MLoDf5PO0Oqp-9sF-EqwhtkpRwQkKgBuU6iZ6UFgr5WjNPxamgvsirXzWzFTQ8D6-ROttPMGAxObviOaeNNTUF5jjkWRV6RCjdMpCwreYNLKXBepQUVJFuXHmonDs89wQq65FuJC68TFk62UXJ8Fsm-AeTGt2DdGSVQA1rV4PzGwgtcl9Mgaz0PVrWD9Lt0CNaiTGnlXgGLovIARlFS-WklXn4RHJ-VahDQnDxRRG4RSc8IAOaR4gUmt8tVyC20fEHqcUsunHsPgs8g5RZJbeUl7uSdQHT4hUiAfIjE2SZP8HL7LpxLmnEyYubSfhR6rXf93iRkowaJhDWP2nCqUYh0lCU-2IpgNJh5AJDfWuKDFFCP8zDQXopHKsQEUyRZRN9Dcdid4v2I5hZOAoj2BBsf6xOOBJy23XSGyReQLEDoID5myQPESi05rJUGASGJ9g7k2E-OPo4qDYHVp-02v283P7otbFnIEwwHfGCapAscXzmV752yiJsZvlEmkRmd6tUbpHIzT_DxTsiZ_3Ze6efngD85hy_FNL0QU_xvMZWolYOcIBQjdU5OA4JYSqQuJP8hQ7ysY2Zee0EPh2oKEz4CwXZ_sPkF0ZUvEp7gNHsu47kDDTs4Q7A_eI-IbBBUgY2dR181iiR4kI2vk8G0ikVNBNRUGjvltKx7Za0aWihs1kFtZnDMsAP0V5r3gpf2DfIS0cNBWH57H8-Trv9wM4Sc27-uoJ78ABUwBJEz1BV8l2fJuoq7WpZJlhQ05RSq_brIElYUtOGcVUmDm5THmjKofv6mizAe5DMKFNCHuylWNU6wbzlOc5Jlq2KdEloWeUEqzgmlkEayh8xaeR3-IoynOkhic2thUivr7GmS2nA9yLAc8NPZdWaq315boyGj4rB2HbT_BLiCDwI">