[llvm] ba3f266 - [DAG] Add MaskedVectorIsZero helper
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 19 09:56:52 PDT 2022
Author: Simon Pilgrim
Date: 2022-06-19T17:56:30+01:00
New Revision: ba3f2667b60cf730105dc6f3146e67b1b938a348
URL: https://github.com/llvm/llvm-project/commit/ba3f2667b60cf730105dc6f3146e67b1b938a348
DIFF: https://github.com/llvm/llvm-project/commit/ba3f2667b60cf730105dc6f3146e67b1b938a348.diff
LOG: [DAG] Add MaskedVectorIsZero helper
Equivalent to MaskedValueIsZero, except its checking if all of the demanded vectors elements are known to be zero
Added:
Modified:
llvm/include/llvm/CodeGen/SelectionDAG.h
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/lib/Target/X86/X86ISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h
index e844eb8f4a79..294c000386b7 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -1888,6 +1888,11 @@ class SelectionDAG {
bool MaskedValueIsZero(SDValue Op, const APInt &Mask,
const APInt &DemandedElts, unsigned Depth = 0) const;
+ /// Return true if 'Op' is known to be zero in DemandedElts. We
+ /// use this predicate to simplify operations downstream.
+ bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts,
+ unsigned Depth = 0) const;
+
/// Return true if '(Op & Mask) == Mask'.
/// Op and Mask are known to be the same type.
bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask,
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 598f0c5f1247..3b54916f80bf 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -2539,6 +2539,14 @@ bool SelectionDAG::MaskedValueIsZero(SDValue V, const APInt &Mask,
return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
}
+/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
+/// DemandedElts. We use this predicate to simplify operations downstream.
+bool SelectionDAG::MaskedVectorIsZero(SDValue V, const APInt &DemandedElts,
+ unsigned Depth /* = 0 */) const {
+ APInt Mask = APInt::getAllOnes(V.getScalarValueSizeInBits());
+ return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
+}
+
/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
bool SelectionDAG::MaskedValueIsAllOnes(SDValue V, const APInt &Mask,
unsigned Depth) const {
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 56e40806c4ac..ef8753e2be0c 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -48127,7 +48127,7 @@ static SDValue combineOr(SDNode *N, SelectionDAG &DAG,
APInt UpperElts = APInt::getHighBitsSet(NumElts, HalfElts);
if (NumElts >= 16 && N1.getOpcode() == X86ISD::KSHIFTL &&
N1.getConstantOperandAPInt(1) == HalfElts &&
- DAG.MaskedValueIsZero(N0, APInt(1, 1), UpperElts)) {
+ DAG.MaskedVectorIsZero(N0, UpperElts)) {
return DAG.getNode(
ISD::CONCAT_VECTORS, dl, VT,
extractSubVector(N0, 0, DAG, dl, HalfElts),
@@ -48135,7 +48135,7 @@ static SDValue combineOr(SDNode *N, SelectionDAG &DAG,
}
if (NumElts >= 16 && N0.getOpcode() == X86ISD::KSHIFTL &&
N0.getConstantOperandAPInt(1) == HalfElts &&
- DAG.MaskedValueIsZero(N1, APInt(1, 1), UpperElts)) {
+ DAG.MaskedVectorIsZero(N1, UpperElts)) {
return DAG.getNode(
ISD::CONCAT_VECTORS, dl, VT,
extractSubVector(N1, 0, DAG, dl, HalfElts),
More information about the llvm-commits
mailing list