@@ -899,3 +899,36 @@ define <4 x float> @multi_use_binop(<4 x float> %x, <4 x float> %y) {
899899 %r = fadd <4 x float > %mul0 , %mul1
900900 ret <4 x float > %r
901901}
902+
903+ ; PR140693
904+ define <4 x float > @merge_fcmp_cmpeqss_v4f32 (<4 x float > %x , <4 x float > %y ) {
905+ ; SSE-LABEL: merge_fcmp_cmpeqss_v4f32:
906+ ; SSE: # %bb.0:
907+ ; SSE-NEXT: cmpeqss %xmm0, %xmm1
908+ ; SSE-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
909+ ; SSE-NEXT: retq
910+ ;
911+ ; AVX1-LABEL: merge_fcmp_cmpeqss_v4f32:
912+ ; AVX1: # %bb.0:
913+ ; AVX1-NEXT: vcmpeqss %xmm0, %xmm1, %xmm1
914+ ; AVX1-NEXT: vmovd %xmm1, %eax
915+ ; AVX1-NEXT: vmovd %eax, %xmm1
916+ ; AVX1-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
917+ ; AVX1-NEXT: retq
918+ ;
919+ ; AVX512-LABEL: merge_fcmp_cmpeqss_v4f32:
920+ ; AVX512: # %bb.0:
921+ ; AVX512-NEXT: vcmpeqss %xmm0, %xmm1, %k0
922+ ; AVX512-NEXT: kmovw %k0, %eax
923+ ; AVX512-NEXT: negl %eax
924+ ; AVX512-NEXT: vmovd %eax, %xmm1
925+ ; AVX512-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
926+ ; AVX512-NEXT: retq
927+ %cmp = fcmp oeq <4 x float > %y , %x
928+ %ext = extractelement <4 x i1 > %cmp , i64 0
929+ %neg = sext i1 %ext to i32
930+ %vec = insertelement <4 x i32 > poison, i32 %neg , i64 0
931+ %vecinit.i = bitcast <4 x i32 > %vec to <4 x float >
932+ %vecinit3.i = shufflevector <4 x float > %vecinit.i , <4 x float > %x , <4 x i32 > <i32 0 , i32 5 , i32 6 , i32 7 >
933+ ret <4 x float > %vecinit3.i
934+ }
0 commit comments