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

    <tr>
        <th>Summary</th>
        <td>
            Checked range of variables is forgotten after a slightly non-trivial condition
        </td>
    </tr>

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

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

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

<pre>
    ```c
#include <assert.h>

int choose(int v[], int len, int a, int b, int cond) {
    if (a >= len || b >= len) {
 return 0;
    }

    int res = v[a] > cond || v[b] > cond ? a : b;
 assert(res < len);
    return res;
}
```

I would expect `assert` to be optimized out, because the only possible values for `res` are either `a` or `b`, and both had their range checked at the beginning of the function.

What is really weird about this is that changing `||` to `|` makes this optimization work (`int res = v[a] > cond | v[b] > cond ? a : b`). I [originally](https://github.com/rust-lang/rust/issues/144522) thought it was related to reading two different memory locations, but in this minimized example it seems to be caused by having an extra branch in the short-circuiting condition.

https://gcc.godbolt.org/z/jx8zje6v8
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyEVMFu4zgM_RrlQjRQ5NhxDj606QaYL9izJNO2GlkKJDpp-vUL2g7a2cMMECASaT6-Rz5I5-z6gNiI8k2U7xs90RBTc4kpoM8XtzGxfTSiksvPCvkqVOGC9VOLIIqTzhkTbQdR_MM5-eoCgR1izChUzZfbAi3UCfjqMTyP-nkwz4ONoRXqCOLwJuQrAIDrQKhaA-MX71wN4nAShxOYH7EfNQlpSgGkKJ4Q4vC-UJvxAkHCDFzIzLQo3xlobv2E5oT5PVGcgUm8glmBF-FC1QvaaaXx3XYlkjAvsZXGc5QLpV9wj5NvAT-vaAlEJVfcSgJFMAjxSm50X9hCnIjnZNDqKSPQgBCDf8A15uyMR7hpP2GGLiYG4saVBJ0Q0NGAc1BzaMkbJqFOoEMLJtIAg24Z1CVIOvQIdkB7wRY0zb0M9i4EF3qI3RzopmDJxbBdpPw7aAKXIaH2_gF3dKkFbeLE5S5zivgTO-jQMwz3n-e9il3vlYRRXzAvVat8zY3gHtOF7SAq-dc9_mWJrP24hV8gyreYXO8Cs559Wg9E1yyKV6HOQp17R8NktjaOQp3TlOnF69CvZ6HOLucJs1Dn3X5fKsVWpCFO_UDgCO6aJ-I1YcsaE-qWtdM9Quu6DhMGghHHmB7go5115nnNE4ELyxBGF1YP4Kcerx4ZOSOOeTXJ7IgWzAMGfWN8HQA_KWkwSQc7LEgIeYiJXqxLdnLE3_Fc3I8l_k-6tds-tiZ62sbEmr-EOn981l8fWN3qTdsU7bE46g02u0NZHKpdVe43Q2MPtlStrC2qQtuuqoq2lkdb1Lv9Xu3KcuMaJVUpD-oo91KW-21ZSOxK28ljoZSxO7GXOGrnt97fRu69mcfc7MqdPNQbrw36PD9aSgW8w5wVSvEblhouejFTn8Veepcpf8OQI4_NabX2YvTYwU0np43H2aZdTH0kwgC6I0ygIXvXD-QfEGJ4oeRuTvvv2W2m5Js_mIabr38v1xQ_0P7um0XTrVH_BQAA__8Gj7xQ">