mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[CodeGen] Prepare for introduction of v3 and v5 MVTs
AMDGPU would like to have MVTs for v3i32, v3f32, v5i32, v5f32. This commit does not add them, but makes preparatory changes: * Exclude non-legal non-power-of-2 vector types from ComputeRegisterProp mechanism in TargetLoweringBase::getTypeConversion. * Cope with SETCC and VSELECT for odd-width i1 vector when the other vectors are legal type. Some of this patch is from Matt Arsenault, also of AMD. Differential Revision: https://reviews.llvm.org/D58899 Change-Id: Ib5f23377dbef511be3a936211a0b9f94e46331f8 llvm-svn: 356350
This commit is contained in:
parent
63cb9dc231
commit
f2dc36e33c
@ -1588,6 +1588,9 @@ public:
|
||||
return SplitVector(N->getOperand(OpNo), SDLoc(N));
|
||||
}
|
||||
|
||||
/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
|
||||
SDValue WidenVector(const SDValue &N, const SDLoc &DL);
|
||||
|
||||
/// Append the extracted elements from Start to Count out of the vector Op
|
||||
/// in Args. If Count is 0, all of the elements will be extracted.
|
||||
void ExtractVectorElements(SDValue Op, SmallVectorImpl<SDValue> &Args,
|
||||
|
@ -294,6 +294,9 @@ public:
|
||||
// The default action for one element vectors is to scalarize
|
||||
if (VT.getVectorNumElements() == 1)
|
||||
return TypeScalarizeVector;
|
||||
// The default action for an odd-width vector is to widen.
|
||||
if (!VT.isPow2VectorType())
|
||||
return TypeWidenVector;
|
||||
// The default action for other vectors is to promote
|
||||
return TypePromoteInteger;
|
||||
}
|
||||
|
@ -836,6 +836,7 @@ private:
|
||||
SDValue WidenVecOp_MGATHER(SDNode* N, unsigned OpNo);
|
||||
SDValue WidenVecOp_MSCATTER(SDNode* N, unsigned OpNo);
|
||||
SDValue WidenVecOp_SETCC(SDNode* N);
|
||||
SDValue WidenVecOp_VSELECT(SDNode *N);
|
||||
|
||||
SDValue WidenVecOp_Convert(SDNode *N);
|
||||
SDValue WidenVecOp_FCOPYSIGN(SDNode *N);
|
||||
|
@ -3831,8 +3831,15 @@ SDValue DAGTypeLegalizer::WidenVecRes_SETCC(SDNode *N) {
|
||||
return Res;
|
||||
}
|
||||
|
||||
// If the inputs also widen, handle them directly. Otherwise widen by hand.
|
||||
SDValue InOp2 = N->getOperand(1);
|
||||
if (getTypeAction(InVT) == TargetLowering::TypeWidenVector) {
|
||||
InOp1 = GetWidenedVector(InOp1);
|
||||
SDValue InOp2 = GetWidenedVector(N->getOperand(1));
|
||||
InOp2 = GetWidenedVector(InOp2);
|
||||
} else {
|
||||
InOp1 = DAG.WidenVector(InOp1, SDLoc(N));
|
||||
InOp2 = DAG.WidenVector(InOp2, SDLoc(N));
|
||||
}
|
||||
|
||||
// Assume that the input and output will be widen appropriately. If not,
|
||||
// we will have to unroll it at some point.
|
||||
@ -3875,6 +3882,7 @@ bool DAGTypeLegalizer::WidenVectorOperand(SDNode *N, unsigned OpNo) {
|
||||
case ISD::MGATHER: Res = WidenVecOp_MGATHER(N, OpNo); break;
|
||||
case ISD::MSCATTER: Res = WidenVecOp_MSCATTER(N, OpNo); break;
|
||||
case ISD::SETCC: Res = WidenVecOp_SETCC(N); break;
|
||||
case ISD::VSELECT: Res = WidenVecOp_VSELECT(N); break;
|
||||
case ISD::FCOPYSIGN: Res = WidenVecOp_FCOPYSIGN(N); break;
|
||||
|
||||
case ISD::ANY_EXTEND:
|
||||
@ -4311,6 +4319,24 @@ SDValue DAGTypeLegalizer::WidenVecOp_VECREDUCE(SDNode *N) {
|
||||
return DAG.getNode(N->getOpcode(), dl, N->getValueType(0), Op, N->getFlags());
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::WidenVecOp_VSELECT(SDNode *N) {
|
||||
// This only gets called in the case that the left and right inputs and
|
||||
// result are of a legal odd vector type, and the condition is illegal i1 of
|
||||
// the same odd width that needs widening.
|
||||
EVT VT = N->getValueType(0);
|
||||
assert(VT.isVector() && !VT.isPow2VectorType() && isTypeLegal(VT));
|
||||
|
||||
SDValue Cond = GetWidenedVector(N->getOperand(0));
|
||||
SDValue LeftIn = DAG.WidenVector(N->getOperand(1), SDLoc(N));
|
||||
SDValue RightIn = DAG.WidenVector(N->getOperand(2), SDLoc(N));
|
||||
SDLoc DL(N);
|
||||
|
||||
SDValue Select = DAG.getNode(N->getOpcode(), DL, LeftIn.getValueType(), Cond,
|
||||
LeftIn, RightIn);
|
||||
return DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, DL, VT, Select,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Vector Widening Utilities
|
||||
|
@ -9127,6 +9127,15 @@ SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
|
||||
return std::make_pair(Lo, Hi);
|
||||
}
|
||||
|
||||
/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
|
||||
SDValue SelectionDAG::WidenVector(const SDValue &N, const SDLoc &DL) {
|
||||
EVT VT = N.getValueType();
|
||||
EVT WideVT = EVT::getVectorVT(*getContext(), VT.getVectorElementType(),
|
||||
NextPowerOf2(VT.getVectorNumElements()));
|
||||
return getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, getUNDEF(WideVT), N,
|
||||
getConstant(0, DL, TLI->getVectorIdxTy(getDataLayout())));
|
||||
}
|
||||
|
||||
void SelectionDAG::ExtractVectorElements(SDValue Op,
|
||||
SmallVectorImpl<SDValue> &Args,
|
||||
unsigned Start, unsigned Count) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user