@@ -899,3 +899,36 @@ define <4 x float> @multi_use_binop(<4 x float> %x, <4 x float> %y) {
899
899
%r = fadd <4 x float > %mul0 , %mul1
900
900
ret <4 x float > %r
901
901
}
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