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

    <tr>
        <th>Summary</th>
        <td>
            Comparison in loop generates slightly worse code than GCC
        </td>
    </tr>

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

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

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

<pre>
    Apologies in advance when I am on the wrong track here. I still (and probably always will) have issues with understanding byte code properly.

```cpp
int multiCompare1(const char *tok, const char *haystack)
{
    const char *needle = tok;
    const char *needlePointer = needle;
    for (;;) {
        if (*haystack == ' ' || *haystack == '\0') {
            if (needlePointer == needle)
 return 0;
            break;
        }
        else {
 do {
                ++haystack;

                if (*haystack == ' ' || *haystack == '\0') { // <---
 return -1;
                }
                if (*haystack == '|') {
                    break;
                }
            } while (true);

            ++haystack;
        }
    }

 return -1;
}
```

If I replace the marked `if` with a `switch` it will generate one less branch. If I pull out the code and try to get a more reduced case it will generate the same code for both cases. If you remove the `if` after that check it will also generate the "expected" code.

Using the `switch` will match the code GCC generates for the `if` case. But with `switch` GCC will generate different code.

https://godbolt.org/z/9bbdfWejh

If I reduce the code too much GCC is also able to recognize that the loop won't do anything: https://godbolt.org/z/YMEz46hdE. That's probably a different ticket though.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVUFv6zYM_jXKhUjgyEmcHHxo0pehhwE7bBh2lCXa0ossGRLdLP31g-y2iV_Tvh2e0dY1TX78-NEiRYymcYglW-_Z-nEmetI-lLUJeBbPOKu8upQPnbe-MRjBOBDqWTiJcNbo4AlEC94BaYRz8K4BCkKeQGPABTxBJGMtML4VTkEXfCUqewFhz-IS4WysZXwHWjwjmBh7TDbS0DuFIZJwyrgGqgshSK8wAXQY7GXBskeWPbz-3WTjj-y60WIcQdtbMgffdiLgkvGt9C4SSC0CMP5A_sT4AaZGLS6RhDwxvntFLvbjPwDwg69DVBaB5Y-QsPKfOP7hjSMMg_9omYTUPvluky3fJ0UmmdNl6sHhSjJBJTTGi_G3OLDiAPc92PqQpds95Cv6B6o3bN8kgYDUBwfZhP_bVQUUpw9vWPE4NaCNeENE-fushli-Z3z_3pk36PvOv1IkYPzI-BFYfpjP59Pi58u71d-t9f9wS7S-6M7X6n6ZmRWPcNYmfal8S6EfGvm5iJ-ofTfF-8On2lw93k7obcBTDU8QsLNC4jA-WhFOqIBtMlOzTTZOApGe49mQ1MlmaBga0KDDIAjBOwSLMUIVhJN6AQNs11sLvqcBd5gcafxQuAB5aJBAQOsDQkDVS1QgRcSP2Ck4ivYVIZ3RypMenOOQ6OJ7CNj659H3nbmo0wEiLdIYQHl6hxY2-ik-4xz_7VASKsb5kGky3P6KaQK-ol91GNBaQVJfS_ztcHjHjgPdCalEewH7nkZhJ3ApdFq7MnWNAR19pKSJusjyh_GANF5V3tLCh4bx4wvjx11Vqfpv_K7vdDvJfWVM3kPbSz3kN3GUR1Q2vYGA0jfOvOAoZAqy3ndw9o7xgtLUEO5C2riG5Q_wM1b__P7tZbXR6tsC_tSCGC_izT66qZeMPGHK5_tGL2aqzNUu34kZlstNsVmti7xYzXQp-LqWUmxXSuUryUVecCmKYrPOtkrVvJ6Zkmc8z_hyvczyzXK1ELisVqvtMsM11rttxlYZtsLYhbXPbWI6G1ZgucmKzXJmRYU2DluZc4fncT8yztOSDmWKmVd9E9kqsyZSvKKQIYvluPpM9C7t7EG568cRrWk02QucfYhvzdDCpUbM-mDLH9Q0pPtqIX3L-DHleb3Nu-C_oyTGj-P2Zvw4sP8vAAD__5Ahbwo">