[X86] Don't fold select for vXi1 on X86 target.
authorLuo, Yuanke <yuanke.luo@intel.com>
Mon, 16 Jan 2023 14:39:06 +0000 (22:39 +0800)
committerLuo, Yuanke <yuanke.luo@intel.com>
Tue, 17 Jan 2023 00:00:41 +0000 (08:00 +0800)
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

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

index 5815f33..e3e04a2 100644 (file)
@@ -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;
index 0d7927f..31afe97 100644 (file)
@@ -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