<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/86785>86785</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LoopVectorize] LoopVectorize produces redundant instructions due to IV widening in IndVarSimplify
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
LittleMeepo
</td>
</tr>
</table>
<pre>
```
void fun1(int* restrict A ,int* restrict B){
int i;
for(i = 1; i <= 1000; i++){
if (i % 2 == 0) {
A[i] = B[i] * B[i];
} else {
A[i] = B[i] + B[i];
}
}
}
```
Difference between GCC13.2 and LLVM:
https://godbolt.org/z/4v993aq9j
If set `-mllvm --indvars-widen-indvars=false` , the merge operation of p register will be simplified. The reason is that the type of IV is converted from i32 to i64 in IndVarSimplify.
GCC uses `.s` format insts when `i` is `int`, uses `.d` format insts when `i` is `long long`.
Can LLVM achieve similar operations? Adding options manually doesn't look very smart after all.
```
.LBB0_1: // =>This Inner Loop Header: Depth=1
mov z3.d, z1.d
add z4.d, z0.d, z2.d
and z0.d, z0.d, #0x1
add z1.d, z1.d, z2.d
and z3.d, z3.d, #0x1
cmpeq p2.d, p0/z, z0.d, #0 // <-- redundant inst
ld1w { z0.s }, p1/z, [x11, x8, lsl #2]
cmpeq p3.d, p0/z, z3.d, #0 // <-- redundant inst
mul z3.s, z0.s, z0.s
lsl z0.s, z0.s, #1
uzp1 p2.s, p2.s, p3.s // <-- redundant inst
mov z0.s, p2/m, z3.s
st1w { z0.s }, p1, [x12, x8, lsl #2]
mov z0.d, z4.d
incw x8
cmp x10, x8
b.ne .LBB0_1
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVt9u4yoTfxpyM4qFIY7ji1zEyZf9KnWvzqq3R8SMY_Zg8AJO2j79EXbSxul2d6VjWR4YZn7zh2Gw8F4dDeKaZCXJdjPRh8a69aMKQeNXxM7ODla-rMmSXl66I3RzskpC3ZuUsJUygbANOPTBqSrABgjb3jNLwgqSl6M2AIAyARThN5zauogGhO8gJbyEONwOM0rpwCCsHN4p1ABXw6jMMmARIupRwgr4IBqfDclKRbLdYKx8m7DN22TiWnxIvgPUHm8AP0Mpf4nyznibvA-maR6_O1XX6NBUCAcMZ0QDX7bblCcMhJHw-Pj0lfDNrUYTQucjj-0J2x-tPFgdEuuOhO1fCdsvTkXBxY_i-63SQw0eA5Alnbdan1qYz5WRJ-H8_KwkmuuM8F0ttEeypHGnITQILbojgu3QiaCsAVtDBw6Pygd0cFZawwHBq7bTqlYoE_jWIDgU3hpQHkIjwgAUXjqM2g9PkV1Zc0IXUELtbAuKMwgW1HIBysCDkU_C_TViviQwRvFlu4Xeo49xJD76WFvXigDK-ODh3KCJSyquqEEqluqSxkje9OSf6GlrjhA_UWM0vhVm2A4QVaPwNESstHDvmfGE72EjpTJHsN3AgVaYXmj9AtKiN4TlAbS1_8AJ3Qv4VrgAoo55FFontzt2Vy3JY1nSv1PCJ6X-s2esi_GY_O9bozw8GIMOHq3t4P8oJLqIssMuNITv0mkNt_Y00FeeyJi21zSRUwkh5SixuEjQC2UfJM1Fkk4lCeP0Of0ENb2x-2vUq4f8c9Sq7fAHAHRslOnoeEimvnyWwO18Dg5lb6QwY61M0bVMz-NRLyOeH858tJJerZCsfE7TOHpexa_2OlpksXv83FH-wVH-3x1te31Nmb8E_06nIXk9XR0t36W1f-1SGNM6SLxRnvjfluVvnb1WIL2CE7ZvL6m4c9eHz3fgkn32B9m_MTmW1OK-6JSpzhHlftMG-pzSi5HJ8iExGOn16E6P9UyuuSx4IWa4TvM0zThLs9WsWRf5AYtikfNsmS-yCvO0oEV2KIQ8rMSKrWZqzShbUM5yWvAsWyWSSyFX-YKzPK-rvCILiq1QOomdPt4MM-V9j-vVMl9lMy0OqP3wT8CYwTMMi4TFtMzcOurMD_3RkwXVygf_jhJU0MPPRGwlT1gF69QrxmtxwoDOWdlX6O-22fXV2BNlj7HVPzzBcPfEdvmh5c96p9d3V50KTX9IKtsSto9OXci8c_Y7VoGw_RCKJ2w_hPpvAAAA__8NPmwo">