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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] `add` and `mul` not replaced by `madd/msub` when branching on result
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    Usually code of the form `x * y + z` is compiled to `madd`. But if branching on the result, clang instead emits a pair of `mul` and `subs`:

# C code
```c
uint32_t msub0(uint32_t x, uint32_t y, uint32_t z) {
 if (x * y - z == 0) {
        return f();
    } else {
 return g();
    }
}

uint32_t madd0(uint32_t x, uint32_t y, uint32_t z) {
    if (x * y + z == 0) {
        return f();
    } else {
        return g();
    }
}
```

# Resulting assembly
```asm
msub0:
        mul     w8, w1, w0
        cmp w8, w2
        b.ne    .LBB0_2
        b       f
.LBB0_2:
 b       g
madd0:
        mul     w8, w1, w0
        cmn     w8, w2
        b.ne    .LBB1_2
        b       f
.LBB1_2:
        b g
```

# Optimal assembly
```asm
msub0:
        msub w0, w0, w1, w2
        cbnz    w0, .L6
        b       f
.L6:
 b       g
madd0:
        madd    w0, w0, w1, w2
        cbnz w0, .L6
        b       f
.L6:
        b       g
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVV2P6jYQ_TWTl9EiM4YEHvIAi3jplSpV6vOVvwjudRwUO90Lv75yPtglqrpbdBGyM57j8TkzlkeEYCtvTAnrPawPmejiuWnL32ojflifyUZfyz9DJ5y7omq0weaE8Wzw1LQ1Qs5-ItAOrwi0xxvkDG1A1dQX64zG2CRILbSGnC1w30W0J5St8OpsfYWN72O1JnQuAr2icsJXaH2IRmg0tY0BBV6EbdO5KVbn0iHC62SFTgbIGfAdsAOwaSSOrz3Z0c7Z8FeD3VkfOX2PWIdOMqDNfeFn4nC3rg_WDWiLUOyHGEkH0GZS_4I3BH4AfkD2iBt_rYld6_EEtAHaAv_ghuKAxgXzYdOIrv4dPaq6f8xECa2fFYU409VX9Vcqe9z0RYFT_eZF_qO_N-kiiRBMLd11tkGEelgZKj1dk4lF3bl-ftukpLwt-5E9YlR9mfz06JELb9K8-Lbfs-9z5zifhuUJc2cw-auRX1-05_j5j5j_4Lj8AsflR453WPVJHX6_RFsL92wVQieTrEHcu9AZWyX9rRfaYxbf8k_E5P832ULr9_ifMnmCxgwyz2qmS663fCsyUy4Lxnmx4TnPzuVaq6IQpEjo7ZaLrdyYXDPShorVieiU2ZIY8SXRijG-Jb4gs8oVrdhGKi2UlLBiphbWLZz7u140bZXZEDpTFjlnReaENC70DYBICvXDeA18t9u16pyvgAjoFYhqG4LRL00qtr2JaBuffOtD1pYp7ovsqgAr5myI4f2kaKPru8sUb31IT_fQE6aHfHzWfROxNRcnlNEor_fmQcd0SRLi7Wz8YwMZmkfWta48x3gJKd90BDpWNp47uVBNDXRMdMbp5dI2fxkVgY59FgLQsU_EPwEAAP__UrPWeQ">