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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization of uaddo(x, x)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:codegen,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    ```c
_Bool src(unsigned x, unsigned* acc) {
    unsigned s = x + x;
    *acc = s;
    return (s < x);
}

_Bool tgt(unsigned x, unsigned* acc) {
    return __builtin_uadd_overflow(x, x, acc);
}
```
https://godbolt.org/z/PsGoGGWj8

The `uaddo` is not created for the case of `x + x`. This would save us single `cmp` instruction. This may be because the `x + x` is optimized to `x << 1`. 

Discovered while analyzing https://github.com/llvm/llvm-project/issues/57316.


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylU12PoyAU_TX4QsYgVK0PPvQj06dN9mGSfWwQqTJBaQTaaX_9XrCdcTfzslmDAp57zj33oo1pbzUqyDwEIntENsetMRrbSSC69qNV3Shb_IHoDj93iG4wF4BXGJXbmYXh-oy2GLE9_sCIboHJFiFABWaE7R_AJJ2fRsDXgbwLCavPAFTuH4uFQ9e5f3b4yHI8Nl5pp8aj5217NBc5nbS5glxUiY-Z_o2FZ7vmbe_cGSrZIPoKozNtY7RLzdTB7g73T3swh8Ov9_WygLdeYlAIyQ3MWFk8GofFJLmDUk5mwg5CBLcSm1MIffayICl-6yH-aryGRvOLxN5iq8ZOR00xnKPiaN3khVNmfBAGfsONhCG4B1k3W_jSDSbM2alB3cGCMw-U7cJpZDHxsoS9siL0DWKvvYLcfOT6dgcf-K-WKNf7JhVmgI3Wl-f0cp7MuxRwhq_KWi8tLPKSZUW6TJPIOiuKjNEyJ1XS1qytWMUTp5yW9Q8gQv6Hax6KDe2a2_p1llXiJ13_lytGkr7OJGGsqaqM8LYgjSilKIssa0_lmglKZKJ5I7WtUb5FlEZRthGmlZ0c4UVwA9MQTb8sTQcw3yeqpoRSsqYrUubZqkqlJFW-KpqikKXMG4ZWRA5c6TRoh28smepouvGdBVAr6-wXyG38GWQ0BPrcu95MtehP3LokllfH2n4DcmU1lw">