<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/111906>111906</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[PowerPC] missing VSX FMA Mutation optimize in some case for -schedule-ppc-vsx-fma-mutation-early
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:PowerPC,
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
diggerlin
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
diggerlin
</td>
</tr>
</table>
<pre>
Description:
bash> cat test.c
```
extern "C" {
#include "altivec.h"
void vsexp (float* __restrict __output_a,float* __restrict var1321In_a,int* __restrict n)
{
int j;
# pragma nounroll
for(j=j*4;j<*n;j++) {
vector float var1321;
vector unsigned char var1326;
vector unsigned char var1323=(vector unsigned char) {63,184,170,59,63,184,170,59,63,184,170,59,63,184,170,59};
vector unsigned char var1325=(vector unsigned char) {69,195,244,0,69,195,244,0,69,195,244,0,69,195,244,0};
var1321=vec_xl(0,var1321In_a+4*(j));
var1326=(vector unsigned char) vec_madd((vector float)(var1321), (vector float)(var1323), (vector float)(var1325));
vec_xst((vector float)var1326,0,__output_a+4*(j));
}
return;
}
} //extern "C"
```
when compile with `-mllvm -disable-ppc-vsx-fma-mutation=false -mllvm -schedule-ppc-vsx-fma-mutation-early`
it generate the asm as (the loop has 6 instructions)
```
.vsexp:
# %bb.0: # %entry
lwz r5, 0(r5)
cmpwi r5, 1
bltlr cr0
# %bb.1: # %for.body.preheader
xxspltiw vs0, 1069066811
mtctr r5
li r5, 0
.align 5
L..BB0_2: # %for.body
# =>This Inner Loop Header: Depth=1
lxvx vs1, r4, r5
xxspltiw vs2, 1170469888
xvmaddasp vs2, vs1, vs0
stxvx vs2, r3, r5
addi r5, r5, 16
bdnz L..BB0_2
# %bb.3: # %for.end
blr
```
obviously , there is more efficient code as which pull ` xxspltiw vs2, 1170469888` put the loop and
change the `xvmaddasp ` to `xvmaddmsp' , the asm code as (the loop only has 5 instructions)
```
.vsexp:
# %bb.0: # %entry
lwz r5, 0(r5)
cmpwi r5, 1
bltlr cr0
# %bb.1: # %for.body.preheader
xxspltiw vs0, 1069066811
xxspltiw vs1, 1170469888
mtctr r5
li r5, 0
.align 5
L..BB0_2: # %for.body
# =>This Inner Loop Header: Depth=1
lxvx vs2, r4, r5
xvmaddmsp vs2, vs0, vs1
stxvx vs2, r3, r5
addi r5, r5, 16
bdnz L..BB0_2
# %bb.3: # %for.end
blr
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUV1Gv2rgS_jXmZQRybBKSBx6A9OhWaqVK9-pq35DjGOKzjh3ZTuD0168cEiCUnna30moXRQ6xP898M_Y3cZhz8qiFWKN4iwgp5fEorJIaEYLifMZaXxm7vnbPClO-rSEXjlvZeGk0ohuEc4Q3MLkVzFWIfgDOPHjh_IJf-lGCh-uCBhBnL6wGRMgOEQJotR2QhErNVVuKMMaUl53giyoQu4z3bWdkCZ0T5wYQSQ_KMI_IBvZ7K5y3knvY703rm9bvGSK7Z4CO2YiS6KPuEVI_jmtEssHlyA1Aag-viN64QmPZsWagTautUWoEHoxFJH1FNH9FZLNEdPuK6A6Rje7_km1_ZXBnG6AT3BsLPduR39XZHaDV_eqVwCtmB2ByA76DoojmiKTPEAObhCKyi9JlaFcYkV2cIbL71d5V_rNxxD9mGJxEWYzIjiyDl-Djlzrv2V3TnneC788KkTTMmuyW7RKRTb-8JAvXJLRxNd6LIpiuWVkikt5QwybNQs9AIjzs4B0I_TEkfkKyJ3B2_qn_MYJLuu519L24QwIH21b41upvR9AqB0ReEHmZCv95eRhup0po4KZupBJwkr4ClOB5rVRXw7yUjhVKzJuGzzt3nh9qNq9bzy7VKT8w5QSMYMcrUbbfQc8Fs-rtG-_Sw1FoYZkX4CsBzNXAHIRch0dlTAMVc5CA1M7blgdb7lo14Hloi75qXctnKCGIxEWxwIhuYHgU2tu3u-UCAHX6CjZsWsCIpDa--Rl-vG5OEmAARcNgobyyYdTiR4dRcPiD34A-GLsIr4BFY0UlWCns1Pf57Brl5Qk6h3vvOMlwkqRRNMXVnnsbGE5Dk9fIJv0LpuRRAwzwT4vFdov35C5PI6_pvJ8KiuaIfvhfJR181FpY-BSW8z-X2OgGctH4CtH8IQB17s7QuSiwtcu-jb-bCtKnIlrhZZKlafqA60IBYK4ZgYPVkMEJ0PmLzx5k6TOfrCzHFA6rn0wBRam_wjV_D_uAPiRU6PJhtrJP9_KlNUUnTevUGwTPvhJWgHRQGytAHA6SS6E9cFMGBcGpkryCplUqaPm9bCUYmtbDVWpMl4OkeMX08aJJlOBbIsMUb259tWsQWY20ev2ONEYRX0wbrd56KcfPpTxppzn4m-V8XZF_kqrvcNF7W_4vqf-J-P9UcGMx_mXNk3c0P263m5bxKOl_lZZn5ZqWGc3YTKyjFUnjDGOCZ9U6FmWZLA88i2JGDzFJWBpFq7JMSx4VSRbP5JpgsoxwhKMspku84ISW5YpmaVTgtEhjtMSiZlItwgt5YexxJp1rxTqKogwnM8UKodzwOVIw_ntgTjdfzEnYL_1BoT8uaHGCft7woWLXwdy8aI8OLbGSzrubAy-96r9wRitxDrV0Tuoj_P-_v8HL5w18Hs4AYBova_lVgNTgTC2AMyfCMf6nDg-z1qp15X3jQinozzlH6au2WHBTI_ISOA23eWPNq-AekZc-EofIy5CEbk3-CAAA__801q3y">