Skip to content

Commit 3a0c1d5

Browse files
committed
[X86] combineSetCCMOVMSK - fold anyof/noneof movmskps/movmskpd -> testps/testpd
Another part of Issue rust-lang#60007
1 parent d4a5844 commit 3a0c1d5

File tree

8 files changed

+103
-131
lines changed

8 files changed

+103
-131
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47656,6 +47656,17 @@ static SDValue combineSetCCMOVMSK(SDValue EFLAGS, X86::CondCode &CC,
4765647656
}
4765747657
}
4765847658

47659+
// MOVMSKPS(V) !=/== 0 -> TESTPS(V,V)
47660+
// MOVMSKPD(V) !=/== 0 -> TESTPD(V,V)
47661+
// iff every element is referenced.
47662+
if (NumElts <= CmpBits && IsAnyOf && Subtarget.hasAVX() && IsOneUse &&
47663+
(NumEltBits == 32 || NumEltBits == 64)) {
47664+
MVT FloatSVT = MVT::getFloatingPointVT(NumEltBits);
47665+
MVT FloatVT = MVT::getVectorVT(FloatSVT, NumElts);
47666+
SDValue V = DAG.getBitcast(FloatVT, Vec);
47667+
return DAG.getNode(X86ISD::TESTP, SDLoc(EFLAGS), MVT::i32, V, V);
47668+
}
47669+
4765947670
return SDValue();
4766047671
}
4766147672

llvm/test/CodeGen/X86/avx-win64.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ target triple = "x86_64-pc-win32"
99

1010
; CHECK: f___vyf
1111
; CHECK: pushq %rbp
12-
; CHECK: vmovmsk
12+
; CHECK: vtestps
1313
; CHECK: vmovaps %ymm{{.*}}(%r
1414
; CHECK: vmovaps %ymm{{.*}}(%r
1515
; CHECK: call

llvm/test/CodeGen/X86/bitcast-vector-bool.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,19 +1450,15 @@ define i8 @PR59526(<8 x i32> %a, <8 x i32> %b, ptr %mask) {
14501450
; AVX1-NEXT: vpcmpeqd %xmm2, %xmm3, %xmm2
14511451
; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
14521452
; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1453-
; AVX1-NEXT: vandps (%rdi), %ymm0, %ymm0
1454-
; AVX1-NEXT: vmovmskps %ymm0, %eax
1455-
; AVX1-NEXT: testl %eax, %eax
1453+
; AVX1-NEXT: vtestps (%rdi), %ymm0
14561454
; AVX1-NEXT: setne %al
14571455
; AVX1-NEXT: vzeroupper
14581456
; AVX1-NEXT: retq
14591457
;
14601458
; AVX2-LABEL: PR59526:
14611459
; AVX2: # %bb.0:
14621460
; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
1463-
; AVX2-NEXT: vpand (%rdi), %ymm0, %ymm0
1464-
; AVX2-NEXT: vmovmskps %ymm0, %eax
1465-
; AVX2-NEXT: testl %eax, %eax
1461+
; AVX2-NEXT: vtestps (%rdi), %ymm0
14661462
; AVX2-NEXT: setne %al
14671463
; AVX2-NEXT: vzeroupper
14681464
; AVX2-NEXT: retq

llvm/test/CodeGen/X86/combine-movmsk-avx.ll

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ define i1 @movmskps_noneof_bitcast_v4f64(<4 x double> %a0) {
1212
; CHECK: # %bb.0:
1313
; CHECK-NEXT: vxorpd %xmm1, %xmm1, %xmm1
1414
; CHECK-NEXT: vcmpeqpd %ymm1, %ymm0, %ymm0
15-
; CHECK-NEXT: vmovmskpd %ymm0, %eax
16-
; CHECK-NEXT: testl %eax, %eax
15+
; CHECK-NEXT: vtestpd %ymm0, %ymm0
1716
; CHECK-NEXT: sete %al
1817
; CHECK-NEXT: vzeroupper
1918
; CHECK-NEXT: retq
@@ -139,10 +138,10 @@ define i32 @movmskps_concat_v4f32(<4 x float> %a0, <4 x float> %a1) {
139138
; CHECK-LABEL: movmskps_concat_v4f32:
140139
; CHECK: # %bb.0:
141140
; CHECK-NEXT: vorps %xmm1, %xmm0, %xmm0
142-
; CHECK-NEXT: vmovmskps %xmm0, %ecx
143141
; CHECK-NEXT: xorl %eax, %eax
144-
; CHECK-NEXT: negl %ecx
145-
; CHECK-NEXT: sbbl %eax, %eax
142+
; CHECK-NEXT: vtestps %xmm0, %xmm0
143+
; CHECK-NEXT: setne %al
144+
; CHECK-NEXT: negl %eax
146145
; CHECK-NEXT: retq
147146
%1 = shufflevector <4 x float> %a0, <4 x float> %a1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
148147
%2 = tail call i32 @llvm.x86.avx.movmsk.ps.256(<8 x float> %1)

llvm/test/CodeGen/X86/combine-movmsk.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ define i1 @movmskps_noneof_bitcast_v2f64(<2 x double> %a0) {
2424
; AVX: # %bb.0:
2525
; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm1
2626
; AVX-NEXT: vcmpeqpd %xmm0, %xmm1, %xmm0
27-
; AVX-NEXT: vmovmskpd %xmm0, %eax
28-
; AVX-NEXT: testl %eax, %eax
27+
; AVX-NEXT: vtestpd %xmm0, %xmm0
2928
; AVX-NEXT: sete %al
3029
; AVX-NEXT: retq
3130
%1 = fcmp oeq <2 x double> zeroinitializer, %a0
@@ -80,8 +79,7 @@ define i1 @pmovmskb_noneof_bitcast_v2i64(<2 x i64> %a0) {
8079
;
8180
; AVX-LABEL: pmovmskb_noneof_bitcast_v2i64:
8281
; AVX: # %bb.0:
83-
; AVX-NEXT: vmovmskpd %xmm0, %eax
84-
; AVX-NEXT: testl %eax, %eax
82+
; AVX-NEXT: vtestpd %xmm0, %xmm0
8583
; AVX-NEXT: sete %al
8684
; AVX-NEXT: retq
8785
%1 = icmp sgt <2 x i64> zeroinitializer, %a0
@@ -136,8 +134,7 @@ define i1 @pmovmskb_noneof_bitcast_v4f32(<4 x float> %a0) {
136134
; AVX: # %bb.0:
137135
; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
138136
; AVX-NEXT: vcmpeqps %xmm1, %xmm0, %xmm0
139-
; AVX-NEXT: vmovmskps %xmm0, %eax
140-
; AVX-NEXT: testl %eax, %eax
137+
; AVX-NEXT: vtestps %xmm0, %xmm0
141138
; AVX-NEXT: sete %al
142139
; AVX-NEXT: retq
143140
%1 = fcmp oeq <4 x float> %a0, zeroinitializer

llvm/test/CodeGen/X86/movmsk-cmp.ll

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -575,8 +575,7 @@ define i1 @allzeros_v4i32_sign(<4 x i32> %arg) {
575575
;
576576
; AVX-LABEL: allzeros_v4i32_sign:
577577
; AVX: # %bb.0:
578-
; AVX-NEXT: vmovmskps %xmm0, %eax
579-
; AVX-NEXT: testl %eax, %eax
578+
; AVX-NEXT: vtestps %xmm0, %xmm0
580579
; AVX-NEXT: sete %al
581580
; AVX-NEXT: retq
582581
%tmp = icmp slt <4 x i32> %arg, zeroinitializer
@@ -619,8 +618,7 @@ define i1 @allzeros_v8i32_sign(<8 x i32> %arg) {
619618
;
620619
; AVX-LABEL: allzeros_v8i32_sign:
621620
; AVX: # %bb.0:
622-
; AVX-NEXT: vmovmskps %ymm0, %eax
623-
; AVX-NEXT: testl %eax, %eax
621+
; AVX-NEXT: vtestps %ymm0, %ymm0
624622
; AVX-NEXT: sete %al
625623
; AVX-NEXT: vzeroupper
626624
; AVX-NEXT: retq
@@ -779,8 +777,7 @@ define i1 @allzeros_v4i64_sign(<4 x i64> %arg) {
779777
;
780778
; AVX-LABEL: allzeros_v4i64_sign:
781779
; AVX: # %bb.0:
782-
; AVX-NEXT: vmovmskpd %ymm0, %eax
783-
; AVX-NEXT: testl %eax, %eax
780+
; AVX-NEXT: vtestpd %ymm0, %ymm0
784781
; AVX-NEXT: sete %al
785782
; AVX-NEXT: vzeroupper
786783
; AVX-NEXT: retq
@@ -865,17 +862,15 @@ define i1 @allzeros_v8i64_sign(<8 x i64> %arg) {
865862
; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
866863
; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
867864
; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
868-
; AVX1-NEXT: vmovmskps %xmm0, %eax
869-
; AVX1-NEXT: testl %eax, %eax
865+
; AVX1-NEXT: vtestps %xmm0, %xmm0
870866
; AVX1-NEXT: sete %al
871867
; AVX1-NEXT: vzeroupper
872868
; AVX1-NEXT: retq
873869
;
874870
; AVX2-LABEL: allzeros_v8i64_sign:
875871
; AVX2: # %bb.0:
876872
; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
877-
; AVX2-NEXT: vmovmskps %ymm0, %eax
878-
; AVX2-NEXT: testl %eax, %eax
873+
; AVX2-NEXT: vtestps %ymm0, %ymm0
879874
; AVX2-NEXT: sete %al
880875
; AVX2-NEXT: vzeroupper
881876
; AVX2-NEXT: retq
@@ -3347,8 +3342,7 @@ define i1 @allzeros_v8f32_nnan(<8 x float> %a0) {
33473342
; AVX1OR2: # %bb.0:
33483343
; AVX1OR2-NEXT: vxorps %xmm1, %xmm1, %xmm1
33493344
; AVX1OR2-NEXT: vcmpneqps %ymm1, %ymm0, %ymm0
3350-
; AVX1OR2-NEXT: vmovmskps %ymm0, %eax
3351-
; AVX1OR2-NEXT: testl %eax, %eax
3345+
; AVX1OR2-NEXT: vtestps %ymm0, %ymm0
33523346
; AVX1OR2-NEXT: setne %al
33533347
; AVX1OR2-NEXT: vzeroupper
33543348
; AVX1OR2-NEXT: retq
@@ -3876,8 +3870,7 @@ define i1 @movmsk_or_v2f64(<2 x double> %x, <2 x double> %y) {
38763870
; AVX1OR2-LABEL: movmsk_or_v2f64:
38773871
; AVX1OR2: # %bb.0:
38783872
; AVX1OR2-NEXT: vcmplepd %xmm0, %xmm1, %xmm0
3879-
; AVX1OR2-NEXT: vmovmskpd %xmm0, %eax
3880-
; AVX1OR2-NEXT: testl %eax, %eax
3873+
; AVX1OR2-NEXT: vtestpd %xmm0, %xmm0
38813874
; AVX1OR2-NEXT: setne %al
38823875
; AVX1OR2-NEXT: retq
38833876
;

0 commit comments

Comments
 (0)