forked from OSchip/llvm-project
[CodeGen] Split MVT::changeTypeToInteger() functionality from EVT::changeTypeToInteger().
Add the MVT equivalent handling for EVT changeTypeToInteger/changeVectorElementType/changeVectorElementTypeToInteger. All the SimpleVT code already exists inside the EVT equivalents, but by splitting this out we can use these directly inside MVT types without converting to/from EVT.
This commit is contained in:
parent
088f3c83cc
commit
794dc7ad26
|
@ -92,26 +92,17 @@ namespace llvm {
|
|||
/// with the element type converted to an integer type with the same
|
||||
/// bitwidth.
|
||||
EVT changeVectorElementTypeToInteger() const {
|
||||
if (!isSimple())
|
||||
return changeExtendedVectorElementTypeToInteger();
|
||||
MVT EltTy = getSimpleVT().getVectorElementType();
|
||||
unsigned BitWidth = EltTy.getSizeInBits();
|
||||
MVT IntTy = MVT::getIntegerVT(BitWidth);
|
||||
MVT VecTy = MVT::getVectorVT(IntTy, getVectorElementCount());
|
||||
assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
|
||||
"Simple vector VT not representable by simple integer vector VT!");
|
||||
return VecTy;
|
||||
if (isSimple())
|
||||
return getSimpleVT().changeVectorElementTypeToInteger();
|
||||
return changeExtendedVectorElementTypeToInteger();
|
||||
}
|
||||
|
||||
/// Return a VT for a vector type whose attributes match ourselves
|
||||
/// with the exception of the element type that is chosen by the caller.
|
||||
EVT changeVectorElementType(EVT EltVT) const {
|
||||
if (!isSimple())
|
||||
return changeExtendedVectorElementType(EltVT);
|
||||
MVT VecTy = MVT::getVectorVT(EltVT.V, getVectorElementCount());
|
||||
assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
|
||||
"Simple vector VT not representable by simple integer vector VT!");
|
||||
return VecTy;
|
||||
if (isSimple() && EltVT.isSimple())
|
||||
return getSimpleVT().changeVectorElementType(EltVT.getSimpleVT());
|
||||
return changeExtendedVectorElementType(EltVT);
|
||||
}
|
||||
|
||||
/// Return the type converted to an equivalently sized integer or vector
|
||||
|
@ -122,8 +113,7 @@ namespace llvm {
|
|||
return changeVectorElementTypeToInteger();
|
||||
|
||||
if (isSimple())
|
||||
return MVT::getIntegerVT(getSizeInBits());
|
||||
|
||||
return getSimpleVT().changeTypeToInteger();
|
||||
return changeExtendedTypeToInteger();
|
||||
}
|
||||
|
||||
|
|
|
@ -425,6 +425,36 @@ namespace llvm {
|
|||
SimpleTy == MVT::iPTRAny);
|
||||
}
|
||||
|
||||
/// Return a vector with the same number of elements as this vector, but
|
||||
/// with the element type converted to an integer type with the same
|
||||
/// bitwidth.
|
||||
MVT changeVectorElementTypeToInteger() const {
|
||||
MVT EltTy = getVectorElementType();
|
||||
MVT IntTy = MVT::getIntegerVT(EltTy.getSizeInBits());
|
||||
MVT VecTy = MVT::getVectorVT(IntTy, getVectorElementCount());
|
||||
assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
|
||||
"Simple vector VT not representable by simple integer vector VT!");
|
||||
return VecTy;
|
||||
}
|
||||
|
||||
/// Return a VT for a vector type whose attributes match ourselves
|
||||
/// with the exception of the element type that is chosen by the caller.
|
||||
MVT changeVectorElementType(MVT EltVT) const {
|
||||
MVT VecTy = MVT::getVectorVT(EltVT, getVectorElementCount());
|
||||
assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
|
||||
"Simple vector VT not representable by simple integer vector VT!");
|
||||
return VecTy;
|
||||
}
|
||||
|
||||
/// Return the type converted to an equivalently sized integer or vector
|
||||
/// with integer element type. Similar to changeVectorElementTypeToInteger,
|
||||
/// but also handles scalars.
|
||||
MVT changeTypeToInteger() {
|
||||
if (isVector())
|
||||
return changeVectorElementTypeToInteger();
|
||||
return MVT::getIntegerVT(getSizeInBits());
|
||||
}
|
||||
|
||||
/// Return a VT for a vector type with the same element type but
|
||||
/// half the number of elements.
|
||||
MVT getHalfNumVectorElementsVT() const {
|
||||
|
|
|
@ -34862,7 +34862,7 @@ static bool matchBinaryShuffle(MVT MaskVT, ArrayRef<int> Mask,
|
|||
DAG.computeKnownBits(V1, DemandedZeroV1).isZero() &&
|
||||
DAG.computeKnownBits(V2, DemandedZeroV2).isZero()) {
|
||||
Shuffle = ISD::OR;
|
||||
SrcVT = DstVT = EVT(MaskVT).changeTypeToInteger().getSimpleVT();
|
||||
SrcVT = DstVT = MaskVT.changeTypeToInteger();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue