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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: Imperfect optimization of straightforward std::find
        </td>
    </tr>

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

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

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

<pre>
    ```c++
static bool any_of_impl(int* first, int* last, int num)
{
    for (; first != last; ++first) {
 if (*first == num)
            return true;
    }
    return false;
}
bool square(int num) {
    int x[] = {1,2,3};
    return any_of_impl(x, x+3, num);
}

bool cube(int num) {
    return num==1 || num==2 || num==3;
}
```

-O2 or -O3

Expected: Same asm for both

Actual:
```
square(int):
        cmp edi, 1
        sete    cl
        add     edi, -2
        test edi, -2
        sete    al
        or      al, cl
 ret

cube(int):
        dec     edi
        cmp     edi, 3
 setb    al
        ret
```
The expected result shows up on pretty much any simplification of the input, including moving the +3 to the callee, or changing both functions' return type to int. Feels like some optimizer passes are running in wrong order and confusing each other.

https://godbolt.org/z/88938fP3d

Originally found via a std::ranges::any_of call, hence the function name. It turned into std::find when I reduced it. https://godbolt.org/z/GjsE3vEK4
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVctu6zYQ_Rp6M4ghk_JroYVjx0VQFCnQ7i8ocijxliJVPuz4fn1BWbHlm7Q1BIjkPM6cM0OLh6Abi1iR5TNZHmY8xdb5amcE925WO3mpyKq4PoLQ5_wUB1LsQuRRC6idM8Dt5ZtT33TXG0I32kZCd6C0D5HQPYx7w29bsKkjdHtNRNZjRgAA5TwQuiHs-RoPhC4IO1yD2TNcKxhTb-Eeq9UQR3djGDvksCkOTH4eY_IWok9I2ASerA_3zeikuAl3r5vHQDz8nbjHK-cRDB745PP3q7S5pmxcELqnhO5ZTjUFH_EexXzPkr0T-szyYuTzqZhJSSLV_1XQCJJNg0QLIOs9We_vJ_TTCfsC8GMmpvhPbxSch6c3Nj19ee9RRJSE7eAP3iHw0A19rl1sp447ERM3hO2-hJhKPWiwe2yr6HpAqbNKi0dLwIiDh3k851IO7zHqiT6aI4b4b7aPlPynlM6PqU2OugF6jFOi9xZ9RUSiuJX1ieGk3lHkXEv9VS130Ech_2wRcOwJeAzJRAitOwdIPTgLvccYL9Al0eZZhJAnUSsteNTOglMQWwRt-zReZ2GS1LaBzp3yK1vzvEJ0w1pwYxCzq_MgWm6b7JWbDypZkZMGQte3O3npMYdqG-dwRDQBjP4LIbgOwfVRd_oHeuh5CBiAewSfrM0ptYWzd7YB5yV64FaCcFalkI3IRQsutujn01a0MfYht4AeCT02TtbOxLnzDaHHH4QeN5st26jfmZwGvXndaMuNuYByyUo4aQ4cQswzTtjOc9tguK6vt3kQIUvQohU4yPLBHSzvcA6vETJ9lJm4u-dS2ko4t2jhFTzKJLJHnMP_Ff7L9_DCTi-_ljNZMbllWz7DarGmm9WWlnQ1ayulalyKmklWr7f1iqqi5Gy7XG_UqmRiWc50RQtaLooFLQpa0NWcyWXBZF1ul6u1WhUlKQvsuDZzY05dxp7pEBJWiwUtVmxmeI0mDB8WSi2eYbASSvN3xlc56KlOTSBlYXSI4Z4m6miw-k2HgPKj58P05f-Q165Hr1DEB0ueyxA9100blfNn7uWjiLPkTfWTajq2qZ4L1xF6zODj66n37juKSOhxKDkQehw5nSr6TwAAAP__45sYEA">