<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/70658>70658</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64][neon] combine the (a -1)* b into fnmsub for fixed vector type
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vfdff
</td>
</tr>
</table>
<pre>
* test: https://gcc.godbolt.org/z/sr6Mevf9G
```
float test2_float (float a, float b) {
return -b + a * b;
}
float32x4_t test2_float_vec (float32x4_t a, float32x4_t b) {
return -b + a * b;
}
```
* now both gcc and clang can fold the `(a -1)* b` with scalar type into fnmsub, while clang can't do that for fixed vector type
```
test2_float_vec: // @test2_float_vec
fneg v2.4s, v1.4s
fmla v2.4s, v1.4s, v0.4s
mov v0.16b, v2.16b
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycU8uOpDoM_RqzsQoF86hiwYK6Je5qvqGVF49RIC0SqO75-lEAdalqejYTIXIgts9xbHPnhm7SuoL8Cvkt4ovv7VytrWrbSFj1WQHV6LXzkNbYe__uIK2BGqCmkzLurBLW-NjOHVDzC6hxc_FDr235P7AbsBoKdjzbZ2ss91s8etsx0GUHHOg_3KEAKhHO190HEXHWfpknPAkEuiLHoEpAeljA-XaAB0lKH9nbE9XbquUX3XH8ID1-_Dv1c6LHm2qc7B2F9T12UiKfFErDpw4ln7C1RqHvNQY3unA8JUDlTlAwvA--Rye54TP6z3eNw-QtYjuNbhFB-L0fjH7EAzp7VBZ9zz22dsZ2-NAKVy293SN8K_XlikKh_7L2uiNk7NXn67bCaifdhX2lOHNB55oE8GwzGv6NTQDsD-PRrtu-sjgptsxX2tCT1az9S36RqlJVpiWPdJUU5aU4Z0nGor5iBaVESStEUVxyxVtSuj0LkVGWKc5UNFTEKE1YypI0zzMW61IxqQviorgkKS8hY3rkg4mNWcfQ_tHg3KKrMyvyS2S40MZtQ0U06Ttuh0AUZmyugs9JLJ2DjJnBefeI4gdvtmms61n2RQb5DfLrpO0E-Q2lHcUw6b1nnhtmb469N74vfrTMpnoZ4cH3i4ilHYGaoOHYTu-z_amlB2o25Q6o2TL7HQAA___j_zPG">