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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization for signed nonnegative number modulo 16
        </td>
    </tr>

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

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

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

<pre>
    ```c++
int foo(int x) {
    if (x >= 0) {
        return x % 16;
    } else {
        return 42;
    }
}
```

This is equivalent to `x >= 0 ? x & 15 : 42`.

However, clang 14.0.0 compiles this to something that like:
`x >= 0 ? x - ((x >= 0 ? x : x + 15) & -16) : 42`

Note that the second `x >= 0` is completely redundant.

https://godbolt.org/z/KfnbGKnha
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx1kl9z2yAMwD8NfuHiA_wn9oMf2mXd7nrb074ANrJNiyEzOG3z6SecZknaKydjCQnph06tU28NKdlJOiLuo7AdYXfaBto7R0QVtVciakq27z6KS_cUfa-UZN9JtqPsU0BcM4RlthSjREF5SbIrP9nuKBgPX97Kxcf4k3FRzuDv5rr_GbWnKPB30QdpAOGDoxh0QUXlYWUqKS_QuIulSpZep_npXuAAMxHfaGekHSjPU5Yy2rlprw14GmIdzOzdBKhjRBhloEY_A2b8D_ip6ia27aZzZxzkiFD3CLU2E_E22LOonhGvCX-7AKeaYQTqoXNW3b4TjdiJiGwggHnDzqrFKmnDzVvHEPY-QosHlMGp1pmQunlA64jfY2_bH492lAk0vCx5nZdcsEQ1maqzWiZBBwPNL-09KOr2QU_6KIN2Fgdopl4PFs-tsxYGPD4AtcvUwkwnpxbjcC6SZTbNBwodxqVNkR0NYw7n32Y_uyfoAppYbwGPSrHNtyIZG2irreq6LudcVbgJIYqSlzXvlKhrViVGtjhxDSlwzIWFF7qmQJ0Uu0Q3ggnBqoxzngvG0raoetarqhIsL6DnJGcwSW3SyBHbk8zNitQug0en0T74i1P69eWwlsP8cgmjm5vQHeXTs0zW0s2K_g9f9_4J">