[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