forked from OSchip/llvm-project
[SelectionDAG] Update getNode asserts for EXTRACT/INSERT_SUBVECTOR.
Summary: The description of EXTACT_SUBVECTOR and INSERT_SUBVECTOR has been changed to accommodate scalable vectors (see ISDOpcodes.h). This patch updates the asserts used to verify these requirements when using SelectionDAG's getNode interface. This patch introduces the MVT function getVectorMinNumElements that can be used against fixed-length and scalable vectors when only the known minimum vector length is required. Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D80709
This commit is contained in:
parent
dac21fd29c
commit
92f3d29af0
|
@ -292,6 +292,11 @@ namespace llvm {
|
|||
return {getExtendedVectorNumElements(), isExtendedScalableVector()};
|
||||
}
|
||||
|
||||
/// Given a vector type, return the minimum number of elements it contains.
|
||||
unsigned getVectorMinNumElements() const {
|
||||
return getVectorElementCount().Min;
|
||||
}
|
||||
|
||||
/// Return the size of the specified value type in bits.
|
||||
///
|
||||
/// If the value type is a scalable vector type, the scalable property will
|
||||
|
|
|
@ -706,6 +706,11 @@ namespace llvm {
|
|||
return { getVectorNumElements(), isScalableVector() };
|
||||
}
|
||||
|
||||
/// Given a vector type, return the minimum number of elements it contains.
|
||||
unsigned getVectorMinNumElements() const {
|
||||
return getVectorElementCount().Min;
|
||||
}
|
||||
|
||||
/// Returns the size of the specified MVT in bits.
|
||||
///
|
||||
/// If the value type is a scalable vector type, the scalable property will
|
||||
|
|
|
@ -5461,21 +5461,24 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
|
|||
}
|
||||
break;
|
||||
case ISD::EXTRACT_SUBVECTOR:
|
||||
assert(VT.isVector() && N1.getValueType().isVector() &&
|
||||
"Extract subvector VTs must be a vectors!");
|
||||
assert(VT.getVectorElementType() ==
|
||||
N1.getValueType().getVectorElementType() &&
|
||||
EVT N1VT = N1.getValueType();
|
||||
assert(VT.isVector() && N1VT.isVector() &&
|
||||
"Extract subvector VTs must be vectors!");
|
||||
assert(VT.getVectorElementType() == N1VT.getVectorElementType() &&
|
||||
"Extract subvector VTs must have the same element type!");
|
||||
assert(VT.getVectorNumElements() <=
|
||||
N1.getValueType().getVectorNumElements() &&
|
||||
assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
|
||||
"Cannot extract a scalable vector from a fixed length vector!");
|
||||
assert((VT.isScalableVector() != N1VT.isScalableVector() ||
|
||||
VT.getVectorMinNumElements() <= N1VT.getVectorMinNumElements()) &&
|
||||
"Extract subvector must be from larger vector to smaller vector!");
|
||||
assert(N2C && "Extract subvector index must be a constant");
|
||||
assert(VT.getVectorNumElements() + N2C->getZExtValue() <=
|
||||
N1.getValueType().getVectorNumElements() &&
|
||||
assert((VT.isScalableVector() != N1VT.isScalableVector() ||
|
||||
(VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
|
||||
N1VT.getVectorMinNumElements()) &&
|
||||
"Extract subvector overflow!");
|
||||
|
||||
// Trivial extraction.
|
||||
if (VT == N1.getValueType())
|
||||
if (VT == N1VT)
|
||||
return N1;
|
||||
|
||||
// EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
|
||||
|
@ -5665,22 +5668,27 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
|
|||
// Inserting undef into undef is still undef.
|
||||
if (N1.isUndef() && N2.isUndef())
|
||||
return getUNDEF(VT);
|
||||
assert(VT.isVector() && N1.getValueType().isVector() &&
|
||||
N2.getValueType().isVector() &&
|
||||
"Insert subvector VTs must be a vectors");
|
||||
|
||||
EVT N2VT = N2.getValueType();
|
||||
assert(VT == N1.getValueType() &&
|
||||
"Dest and insert subvector source types must match!");
|
||||
assert(N2.getSimpleValueType() <= N1.getSimpleValueType() &&
|
||||
assert(VT.isVector() && N2VT.isVector() &&
|
||||
"Insert subvector VTs must be vectors!");
|
||||
assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
|
||||
"Cannot insert a scalable vector into a fixed length vector!");
|
||||
assert((VT.isScalableVector() != N2VT.isScalableVector() ||
|
||||
VT.getVectorMinNumElements() >= N2VT.getVectorMinNumElements()) &&
|
||||
"Insert subvector must be from smaller vector to larger vector!");
|
||||
assert(isa<ConstantSDNode>(N3) &&
|
||||
"Insert subvector index must be constant");
|
||||
assert(N2.getValueType().getVectorNumElements() +
|
||||
cast<ConstantSDNode>(N3)->getZExtValue() <=
|
||||
VT.getVectorNumElements() &&
|
||||
assert((VT.isScalableVector() != N2VT.isScalableVector() ||
|
||||
(N2VT.getVectorMinNumElements() +
|
||||
cast<ConstantSDNode>(N3)->getZExtValue()) <=
|
||||
VT.getVectorMinNumElements()) &&
|
||||
"Insert subvector overflow!");
|
||||
|
||||
// Trivial insertion.
|
||||
if (VT == N2.getValueType())
|
||||
if (VT == N2VT)
|
||||
return N2;
|
||||
|
||||
// If this is an insert of an extracted vector into an undef vector, we
|
||||
|
|
Loading…
Reference in New Issue