[llvm] 159cac5 - [X86] Don't fold select for vXi1 on X86 target.

via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 16 16:00:56 PST 2023


Author: Luo, Yuanke
Date: 2023-01-17T08:00:41+08:00
New Revision: 159cac50cfc12f8951e80d640909ff08364e65de

URL: https://github.com/llvm/llvm-project/commit/159cac50cfc12f8951e80d640909ff08364e65de
DIFF: https://github.com/llvm/llvm-project/commit/159cac50cfc12f8951e80d640909ff08364e65de.diff

LOG: [X86] Don't fold select for vXi1 on X86 target.

Since there is no mask instruction for vXi1 with avx512f in X86 target.
Folding select for vXi1 doesn't help to reduce instructions.

Differential Revision: https://reviews.llvm.org/D141782

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86ISelLowering.cpp
    llvm/test/CodeGen/X86/fold-select.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 5815f334a6842..e3e04a2fd68c9 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -34857,7 +34857,7 @@ bool X86TargetLowering::shouldFoldSelectWithIdentityConstant(unsigned Opcode,
     return false;
   if (!Subtarget.hasVLX() && !VT.is512BitVector())
     return false;
-  if (!VT.isVector())
+  if (!VT.isVector() || VT.getScalarType() == MVT::i1)
     return false;
 
   return true;

diff  --git a/llvm/test/CodeGen/X86/fold-select.ll b/llvm/test/CodeGen/X86/fold-select.ll
index 0d7927fa1e64a..31afe979a33b3 100644
--- a/llvm/test/CodeGen/X86/fold-select.ll
+++ b/llvm/test/CodeGen/X86/fold-select.ll
@@ -4,16 +4,9 @@
 define <8 x float> @select_and_v8i1(<8 x i1> %a, <8 x i1> %b, <8 x i1> %c, <8 x float> %d) {
 ; CHECK-LABEL: select_and_v8i1:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpsllw $15, %xmm2, %xmm4
+; CHECK-NEXT:    vpternlogq $200, %xmm1, %xmm2, %xmm0
 ; CHECK-NEXT:    vpsllw $15, %xmm0, %xmm0
 ; CHECK-NEXT:    vpmovw2m %xmm0, %k1
-; CHECK-NEXT:    vpxor %xmm0, %xmm0, %xmm0
-; CHECK-NEXT:    vpcmpgtw %xmm4, %xmm0, %k0 {%k1}
-; CHECK-NEXT:    vpand %xmm1, %xmm2, %xmm0
-; CHECK-NEXT:    vpsllw $15, %xmm0, %xmm0
-; CHECK-NEXT:    vpmovw2m %xmm0, %k2
-; CHECK-NEXT:    kandnb %k2, %k1, %k1
-; CHECK-NEXT:    korb %k1, %k0, %k1
 ; CHECK-NEXT:    vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
 ; CHECK-NEXT:    vmovaps %ymm3, %ymm0 {%k1}
 ; CHECK-NEXT:    retq
@@ -26,13 +19,9 @@ define <8 x float> @select_and_v8i1(<8 x i1> %a, <8 x i1> %b, <8 x i1> %c, <8 x
 define <8 x float> @select_and_v8i1_2(i8 %m1, i8 %m2, i8 %m3, <8 x float> %d) {
 ; CHECK-LABEL: select_and_v8i1_2:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    kmovd %edi, %k0
-; CHECK-NEXT:    andl %edx, %esi
-; CHECK-NEXT:    kmovd %edx, %k1
-; CHECK-NEXT:    kandb %k0, %k1, %k1
-; CHECK-NEXT:    kmovd %esi, %k2
-; CHECK-NEXT:    kandnb %k2, %k0, %k0
-; CHECK-NEXT:    korb %k0, %k1, %k1
+; CHECK-NEXT:    orl %esi, %edi
+; CHECK-NEXT:    andl %edx, %edi
+; CHECK-NEXT:    kmovd %edi, %k1
 ; CHECK-NEXT:    vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
 ; CHECK-NEXT:    vmovaps %ymm0, %ymm1 {%k1}
 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
@@ -49,11 +38,10 @@ define <8 x float> @select_and_v8i1_2(i8 %m1, i8 %m2, i8 %m3, <8 x float> %d) {
 define <8 x float> @select_and_v8i1_3(<8 x i16> %m1, <8 x i16> %m2, <8 x i16> %m3, <8 x float> %d) {
 ; CHECK-LABEL: select_and_v8i1_3:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm1, %k1
-; CHECK-NEXT:    vpcmpeqw %xmm1, %xmm0, %k0 {%k1}
-; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm0, %k1 {%k1}
-; CHECK-NEXT:    vpcmpneqw %xmm1, %xmm0, %k1 {%k1}
+; CHECK-NEXT:    vpcmpeqw %xmm1, %xmm0, %k0
+; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm0, %k1
 ; CHECK-NEXT:    korb %k1, %k0, %k1
+; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm1, %k1 {%k1}
 ; CHECK-NEXT:    vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
 ; CHECK-NEXT:    vmovaps %ymm3, %ymm0 {%k1}
 ; CHECK-NEXT:    retq
@@ -69,15 +57,13 @@ define <8 x float> @select_and_v8i1_3(<8 x i16> %m1, <8 x i16> %m2, <8 x i16> %m
 define <8 x float> @select_or_v8i1(<8 x i1> %a, <8 x i1> %b, <8 x i1> %c, <8 x float> %d) {
 ; CHECK-LABEL: select_or_v8i1:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpsllw $15, %xmm2, %xmm4
-; CHECK-NEXT:    vpsllw $15, %xmm0, %xmm0
-; CHECK-NEXT:    vpmovw2m %xmm0, %k1
-; CHECK-NEXT:    vpxor %xmm0, %xmm0, %xmm0
-; CHECK-NEXT:    vpcmpgtw %xmm4, %xmm0, %k0 {%k1}
-; CHECK-NEXT:    vpor %xmm1, %xmm2, %xmm0
+; CHECK-NEXT:    vpsllw $15, %xmm2, %xmm2
+; CHECK-NEXT:    vpmovw2m %xmm2, %k0
+; CHECK-NEXT:    vpsllw $15, %xmm1, %xmm1
+; CHECK-NEXT:    vpmovw2m %xmm1, %k1
 ; CHECK-NEXT:    vpsllw $15, %xmm0, %xmm0
 ; CHECK-NEXT:    vpmovw2m %xmm0, %k2
-; CHECK-NEXT:    kandnb %k2, %k1, %k1
+; CHECK-NEXT:    kandnb %k1, %k2, %k1
 ; CHECK-NEXT:    korb %k1, %k0, %k1
 ; CHECK-NEXT:    vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
 ; CHECK-NEXT:    vmovaps %ymm3, %ymm0 {%k1}
@@ -92,12 +78,10 @@ define <8 x float> @select_or_v8i1_2(i8 %m1, i8 %m2, i8 %m3, <8 x float> %d) {
 ; CHECK-LABEL: select_or_v8i1_2:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    kmovd %edi, %k0
-; CHECK-NEXT:    orl %edx, %esi
-; CHECK-NEXT:    kmovd %edx, %k1
-; CHECK-NEXT:    kandb %k0, %k1, %k1
-; CHECK-NEXT:    kmovd %esi, %k2
-; CHECK-NEXT:    kandnb %k2, %k0, %k0
-; CHECK-NEXT:    korb %k0, %k1, %k1
+; CHECK-NEXT:    kmovd %esi, %k1
+; CHECK-NEXT:    kmovd %edx, %k2
+; CHECK-NEXT:    kandnb %k1, %k0, %k0
+; CHECK-NEXT:    korb %k0, %k2, %k1
 ; CHECK-NEXT:    vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
 ; CHECK-NEXT:    vmovaps %ymm0, %ymm1 {%k1}
 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
@@ -114,12 +98,10 @@ define <8 x float> @select_or_v8i1_2(i8 %m1, i8 %m2, i8 %m3, <8 x float> %d) {
 define <8 x float> @select_or_v8i1_3(<8 x i16> %m1, <8 x i16> %m2, <8 x i16> %m3, <8 x float> %d) {
 ; CHECK-LABEL: select_or_v8i1_3:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm0, %k0
-; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm1, %k1
-; CHECK-NEXT:    korb %k0, %k1, %k2
-; CHECK-NEXT:    vpcmpneqw %xmm1, %xmm0, %k0 {%k2}
-; CHECK-NEXT:    vpcmpeqw %xmm1, %xmm0, %k1 {%k1}
-; CHECK-NEXT:    korb %k0, %k1, %k1
+; CHECK-NEXT:    vpcmpneqw %xmm1, %xmm0, %k1
+; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm1, %k0
+; CHECK-NEXT:    vpcmpeqw %xmm2, %xmm0, %k1 {%k1}
+; CHECK-NEXT:    korb %k1, %k0, %k1
 ; CHECK-NEXT:    vbroadcastss {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]
 ; CHECK-NEXT:    vmovaps %ymm3, %ymm0 {%k1}
 ; CHECK-NEXT:    retq


        


More information about the llvm-commits mailing list