[llvm] 37c3b83 - [X86] combineBitcastvxi1 - handle boolmask sign-extension through vselect
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 15 08:40:51 PST 2022
Author: Simon Pilgrim
Date: 2022-12-15T16:40:44Z
New Revision: 37c3b83bd8518f9dc2700509ad385a3a6249f023
URL: https://github.com/llvm/llvm-project/commit/37c3b83bd8518f9dc2700509ad385a3a6249f023
DIFF: https://github.com/llvm/llvm-project/commit/37c3b83bd8518f9dc2700509ad385a3a6249f023.diff
LOG: [X86] combineBitcastvxi1 - handle boolmask sign-extension through vselect
See if we can freely sign-extend both sources of a vselect operand, also handle allones constant build vectors (easily rematerializable and uses in the test case).
Fixes #59526
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/bitcast-vector-bool.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 512d7a60d2bc3..16fa4401bb74d 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -43006,6 +43006,13 @@ static bool checkBitcastSrcVectorSize(SDValue Src, unsigned Size,
case ISD::OR:
return checkBitcastSrcVectorSize(Src.getOperand(0), Size, AllowTruncate) &&
checkBitcastSrcVectorSize(Src.getOperand(1), Size, AllowTruncate);
+ case ISD::VSELECT:
+ return Src.getOperand(0).getScalarValueSizeInBits() == 1 &&
+ checkBitcastSrcVectorSize(Src.getOperand(1), Size, AllowTruncate) &&
+ checkBitcastSrcVectorSize(Src.getOperand(2), Size, AllowTruncate);
+ case ISD::BUILD_VECTOR:
+ return ISD::isBuildVectorAllZeros(Src.getNode());
+
}
return false;
}
@@ -43061,6 +43068,7 @@ static SDValue signExtendBitcastSrcVector(SelectionDAG &DAG, EVT SExtVT,
switch (Src.getOpcode()) {
case ISD::SETCC:
case ISD::TRUNCATE:
+ case ISD::BUILD_VECTOR:
return DAG.getNode(ISD::SIGN_EXTEND, DL, SExtVT, Src);
case ISD::AND:
case ISD::XOR:
@@ -43069,6 +43077,11 @@ static SDValue signExtendBitcastSrcVector(SelectionDAG &DAG, EVT SExtVT,
Src.getOpcode(), DL, SExtVT,
signExtendBitcastSrcVector(DAG, SExtVT, Src.getOperand(0), DL),
signExtendBitcastSrcVector(DAG, SExtVT, Src.getOperand(1), DL));
+ case ISD::VSELECT:
+ return DAG.getSelect(
+ DL, SExtVT, Src.getOperand(0),
+ signExtendBitcastSrcVector(DAG, SExtVT, Src.getOperand(1), DL),
+ signExtendBitcastSrcVector(DAG, SExtVT, Src.getOperand(2), DL));
}
llvm_unreachable("Unexpected node type for vXi1 sign extension");
}
diff --git a/llvm/test/CodeGen/X86/bitcast-vector-bool.ll b/llvm/test/CodeGen/X86/bitcast-vector-bool.ll
index 6d87c31013800..5dbd7663a2781 100644
--- a/llvm/test/CodeGen/X86/bitcast-vector-bool.ll
+++ b/llvm/test/CodeGen/X86/bitcast-vector-bool.ll
@@ -744,17 +744,13 @@ define i8 @PR59526(<8 x i32> %a, <8 x i32> %b, ptr %mask) {
;
; AVX1-LABEL: PR59526:
; AVX1: # %bb.0:
-; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
+; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
+; AVX1-NEXT: vpcmpeqd %xmm2, %xmm3, %xmm2
; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vpcmpgtd (%rdi), %xmm1, %xmm3
-; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
-; AVX1-NEXT: vpcmpgtd 16(%rdi), %xmm1, %xmm1
-; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpackssdw %xmm0, %xmm2, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
+; AVX1-NEXT: vandps (%rdi), %ymm0, %ymm0
+; AVX1-NEXT: vmovmskps %ymm0, %eax
; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
@@ -763,12 +759,8 @@ define i8 @PR59526(<8 x i32> %a, <8 x i32> %b, ptr %mask) {
; AVX2-LABEL: PR59526:
; AVX2: # %bb.0:
; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX2-NEXT: vpcmpgtd (%rdi), %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpmovmskb %xmm0, %eax
+; AVX2-NEXT: vpand (%rdi), %ymm0, %ymm0
+; AVX2-NEXT: vmovmskps %ymm0, %eax
; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
More information about the llvm-commits
mailing list