<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/83289>83289</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] [ISEL] Redundant instructions selected for storing vector of floats
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nurmukhametov
</td>
</tr>
</table>
<pre>
Consider the following code (does `A = max(A, B)` for vectors of `float`):
```
declare <8 x float> @llvm.x86.avx.max.ps.256(<8 x float>, <8 x float>) #0
define void @foo(float* noalias nocapture %A, float* noalias nocapture readonly %B) local_unnamed_addr {
allocas:
%V1_load_bitcast_load.unpack.unpack.i = load float, float* %A, align 4
%V1_load_bitcast_load.unpack.elt17.i = getelementptr inbounds float, float* %A, i64 1
%V1_load_bitcast_load.unpack.unpack18.i = load float, float* %V1_load_bitcast_load.unpack.elt17.i, align 4
%V1_load_bitcast_load.unpack.elt19.i = getelementptr inbounds float, float* %A, i64 2
%V1_load_bitcast_load.unpack.unpack20.i = load float, float* %V1_load_bitcast_load.unpack.elt19.i, align 4
%V1_load_bitcast_load.unpack.elt21.i = getelementptr inbounds float, float* %A, i64 3
%V1_load_bitcast_load.unpack.unpack22.i = load float, float* %V1_load_bitcast_load.unpack.elt21.i, align 4
%S0.0.vec.insert.i = insertelement <8 x float> undef, float %V1_load_bitcast_load.unpack.unpack.i, i64 0
%S0.4.vec.insert.i = insertelement <8 x float> %S0.0.vec.insert.i, float %V1_load_bitcast_load.unpack.unpack18.i, i64 1
%S0.8.vec.insert.i = insertelement <8 x float> %S0.4.vec.insert.i, float %V1_load_bitcast_load.unpack.unpack20.i, i64 2
%S0.12.vec.insert.i = insertelement <8 x float> %S0.8.vec.insert.i, float %V1_load_bitcast_load.unpack.unpack22.i, i64 3
%V2_load_bitcast_load.unpack.unpack.i = load float, float* %B, align 4
%V2_load_bitcast_load.unpack.elt25.i = getelementptr inbounds float, float* %B, i64 1
%V2_load_bitcast_load.unpack.unpack26.i = load float, float* %V2_load_bitcast_load.unpack.elt25.i, align 4
%V2_load_bitcast_load.unpack.elt27.i = getelementptr inbounds float, float* %B, i64 2
%V2_load_bitcast_load.unpack.unpack28.i = load float, float* %V2_load_bitcast_load.unpack.elt27.i, align 4
%V2_load_bitcast_load.unpack.elt29.i = getelementptr inbounds float, float* %B, i64 3
%V2_load_bitcast_load.unpack.unpack30.i = load float, float* %V2_load_bitcast_load.unpack.elt29.i, align 4
%S1.0.vec.insert.i = insertelement <8 x float> undef, float %V2_load_bitcast_load.unpack.unpack.i, i64 0
%S1.4.vec.insert.i = insertelement <8 x float> %S1.0.vec.insert.i, float %V2_load_bitcast_load.unpack.unpack26.i, i64 1
%S1.8.vec.insert.i = insertelement <8 x float> %S1.4.vec.insert.i, float %V2_load_bitcast_load.unpack.unpack28.i, i64 2
%S1.12.vec.insert.i = insertelement <8 x float> %S1.8.vec.insert.i, float %V2_load_bitcast_load.unpack.unpack30.i, i64 3
%call.i.i.i = tail call <8 x float> @llvm.x86.avx.max.ps.256(<8 x float> %S0.12.vec.insert.i, <8 x float> %S1.12.vec.insert.i)
%Result.0.vec.extract.i = extractelement <8 x float> %call.i.i.i, i64 0
%Result.4.vec.extract.i = extractelement <8 x float> %call.i.i.i, i64 1
%Result.8.vec.extract.i = extractelement <8 x float> %call.i.i.i, i64 2
%Result.12.vec.extract.i = extractelement <8 x float> %call.i.i.i, i64 3
store float %Result.0.vec.extract.i, float* %A, align 4
store float %Result.4.vec.extract.i, float* %V1_load_bitcast_load.unpack.elt17.i, align 4
store float %Result.8.vec.extract.i, float* %V1_load_bitcast_load.unpack.elt19.i, align 4
store float %Result.12.vec.extract.i, float* %V1_load_bitcast_load.unpack.elt21.i, align 4
ret void
}
```
When built as follow:
```
llc -O3 -march=x86-64 -mcpu=core-avx2 -mattr=avx2 -x86-asm-syntax=intel t.ll -o -
```
contains redundant instructions `vmovd` and `vpinsrd`:
```asm
vmovups xmm0, xmmword ptr [rdi]
vmaxps xmm0, xmm0, xmmword ptr [rsi]
vmovd eax, xmm0
vpinsrd xmm0, xmm0, eax, 0
vmovdqu xmmword ptr [rdi], xmm0
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysWFtv6jgQ_jXmZUSUOBeSBx5KOZVWWmmlU2l33yrHdsB7HJu1HZr--yOHUFpIuYReVHDi-eb7JjPj2MRasVKcz1G6QOlyQhq31mauGlM3v9ak5k5vJ6Vmb_NHraxg3IBbc6i0lPpVqBVQzTggnDPNLaAsfAAUL6EmLcL5A8KPsEC4QFkIlTaw5dRpY0FXfmolNXEoC_2E-AGFSxQ--OHurxsyTiUxHFD8mEMLO4v4B6AklHJbB22eBWTbBjVpg40NcJohnB9N9iROLhWAcNw72buqhOKw1YJ5-EprhPOdAX4ApYkUxILSlGxc4ynhtNN3ZorhhGkl3_xcHwaQmhL50ihFas5eCGMG0Gyx80-kv2vfIwHe6u_oRWrCXkrhKLGuGwSN2hD6a_8huoD7G3sqHzjtSRIpVgqSK5G5dNGsB15xxyWvuXIbZ0CoUjeK2TOuRJZA1Du6SkGUX9RwBdlTlVfYFfeIxDc9JxzerbIYpxJH96iMb1OJ71Xp2Q5n7HMYhMGW00Aoy43rHe0Gva6TPtEoxqt3BtdW1F57-Nl7cqv3IdI3kvHFcVxVPW4-jk5yDx2fxUP5_xwGER7HJ7-LDz7wiT9UBL67bS6GS-0MsE_edESpLYae72UFOLtcapfZjlI5Zm1YDLbNyyqvWBwusx2lcszisBhsmxdVxlcsDpfZftE2o29pm1dU1GDbjMa1zWPSN5LxxTHYNqNxbfNYxa108i_aZjSybR7LuJFPHJ62TW9JiZSB8L8dD0eEBH_trvfv4fVh4K18OCJ-d3Bg-JPbRro-OXjrDKH7qPWjM2E7yBtK1R46-Sbo6BQ6_yZofArdB-1-7Pd0sE4bfkiq4cBfs9kYBkrOA4164__CVX6fq-HOOuzq-DF8z8uv4a7bl_bb1dlycK-8-__PmisoGyEdENvv07_aXUtJYfpXDNOaGLpG8bLNs2mWwLSmmwbFS6oNn5Jti_0M5wyKl7uRn0dsPbVvypEWxUuhHJfgAilhqmF6hh_VyhGhLBjOGsWIcr7dOdNQJ7TqjhC2td4ylIVAFOvGG6Gs8VcOQj47ILbex2r34yGajYW2rkMf0LauX7Vh4FdwlC4MEyjtowjbmrQbCx_nDtrYDzYf3DAA4KR9t-xBd5xPQPuZ4QDO_80XND8jG-6O1E_YPGZFXJAJn0ezsIjiPMuSyXpeMRpVCZ9VtCxmNInLPOSsjCtOSVGlrJyIOQ5xEmKcR1mS4CTIyiplOGQ0jUmRRAQlIa-JkEHX7bVZTYS1DZ_nMc6LiSQll7Y7OsJY8VfobiKMUbqcmLm3mZbNyvrVQlhnDyhOONmdOf2bZyhderF_PP_403_9OZwXlktOHWfdOZIvPqFW_XkS6GpXZHbSGDlfO7fpjlHwE8JPK-HWTRlQXSP85P33H9ON0f9x6hB-6lhbhJ86Vb8DAAD__71m9kE">