<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">