Split the usage of 'EVT PartVT' into 'MVT PartVT' and 'EVT PartEVT'.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170540 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Patrik Hagglund
2012-12-19 12:33:30 +00:00
parent 828df0fda8
commit b9e12e519e

View File

@@ -89,7 +89,7 @@ static const unsigned MaxParallelChains = 64;
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL, static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
const SDValue *Parts, unsigned NumParts, const SDValue *Parts, unsigned NumParts,
EVT PartVT, EVT ValueVT, const Value *V); MVT PartVT, EVT ValueVT, const Value *V);
/// getCopyFromParts - Create a value that contains the specified legal parts /// getCopyFromParts - Create a value that contains the specified legal parts
/// combined into the value they represent. If the parts combine to a type /// combined into the value they represent. If the parts combine to a type
@@ -98,7 +98,7 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
/// (ISD::AssertSext). /// (ISD::AssertSext).
static SDValue getCopyFromParts(SelectionDAG &DAG, DebugLoc DL, static SDValue getCopyFromParts(SelectionDAG &DAG, DebugLoc DL,
const SDValue *Parts, const SDValue *Parts,
unsigned NumParts, EVT PartVT, EVT ValueVT, unsigned NumParts, MVT PartVT, EVT ValueVT,
const Value *V, const Value *V,
ISD::NodeType AssertOp = ISD::DELETED_NODE) { ISD::NodeType AssertOp = ISD::DELETED_NODE) {
if (ValueVT.isVector()) if (ValueVT.isVector())
@@ -161,7 +161,7 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, DebugLoc DL,
} }
} else if (PartVT.isFloatingPoint()) { } else if (PartVT.isFloatingPoint()) {
// FP split into multiple FP parts (for ppcf128) // FP split into multiple FP parts (for ppcf128)
assert(ValueVT == EVT(MVT::ppcf128) && PartVT == EVT(MVT::f64) && assert(ValueVT == EVT(MVT::ppcf128) && PartVT == MVT::f64 &&
"Unexpected split"); "Unexpected split");
SDValue Lo, Hi; SDValue Lo, Hi;
Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]); Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);
@@ -179,25 +179,25 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, DebugLoc DL,
} }
// There is now one part, held in Val. Correct it to match ValueVT. // There is now one part, held in Val. Correct it to match ValueVT.
PartVT = Val.getValueType(); EVT PartEVT = Val.getValueType();
if (PartVT == ValueVT) if (PartEVT == ValueVT)
return Val; return Val;
if (PartVT.isInteger() && ValueVT.isInteger()) { if (PartEVT.isInteger() && ValueVT.isInteger()) {
if (ValueVT.bitsLT(PartVT)) { if (ValueVT.bitsLT(PartEVT)) {
// For a truncate, see if we have any information to // For a truncate, see if we have any information to
// indicate whether the truncated bits will always be // indicate whether the truncated bits will always be
// zero or sign-extension. // zero or sign-extension.
if (AssertOp != ISD::DELETED_NODE) if (AssertOp != ISD::DELETED_NODE)
Val = DAG.getNode(AssertOp, DL, PartVT, Val, Val = DAG.getNode(AssertOp, DL, PartEVT, Val,
DAG.getValueType(ValueVT)); DAG.getValueType(ValueVT));
return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val); return DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
} }
return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val); return DAG.getNode(ISD::ANY_EXTEND, DL, ValueVT, Val);
} }
if (PartVT.isFloatingPoint() && ValueVT.isFloatingPoint()) { if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {
// FP_ROUND's are always exact here. // FP_ROUND's are always exact here.
if (ValueVT.bitsLT(Val.getValueType())) if (ValueVT.bitsLT(Val.getValueType()))
return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val,
@@ -206,7 +206,7 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, DebugLoc DL,
return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val); return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);
} }
if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits())
return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val); return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
llvm_unreachable("Unknown mismatch!"); llvm_unreachable("Unknown mismatch!");
@@ -219,7 +219,7 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, DebugLoc DL,
/// ValueVT (ISD::AssertSext). /// ValueVT (ISD::AssertSext).
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL, static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
const SDValue *Parts, unsigned NumParts, const SDValue *Parts, unsigned NumParts,
EVT PartVT, EVT ValueVT, const Value *V) { MVT PartVT, EVT ValueVT, const Value *V) {
assert(ValueVT.isVector() && "Not a vector value"); assert(ValueVT.isVector() && "Not a vector value");
assert(NumParts > 0 && "No parts to assemble!"); assert(NumParts > 0 && "No parts to assemble!");
const TargetLowering &TLI = DAG.getTargetLoweringInfo(); const TargetLowering &TLI = DAG.getTargetLoweringInfo();
@@ -235,8 +235,7 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
NumIntermediates, RegisterVT); NumIntermediates, RegisterVT);
assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!"); assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
NumParts = NumRegs; // Silence a compiler warning. NumParts = NumRegs; // Silence a compiler warning.
assert(RegisterVT == PartVT.getSimpleVT() && assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
"Part type doesn't match vector breakdown!");
assert(RegisterVT == Parts[0].getSimpleValueType() && assert(RegisterVT == Parts[0].getSimpleValueType() &&
"Part type doesn't match part!"); "Part type doesn't match part!");
@@ -267,31 +266,31 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
} }
// There is now one part, held in Val. Correct it to match ValueVT. // There is now one part, held in Val. Correct it to match ValueVT.
PartVT = Val.getValueType(); EVT PartEVT = Val.getValueType();
if (PartVT == ValueVT) if (PartEVT == ValueVT)
return Val; return Val;
if (PartVT.isVector()) { if (PartEVT.isVector()) {
// If the element type of the source/dest vectors are the same, but the // If the element type of the source/dest vectors are the same, but the
// parts vector has more elements than the value vector, then we have a // parts vector has more elements than the value vector, then we have a
// vector widening case (e.g. <2 x float> -> <4 x float>). Extract the // vector widening case (e.g. <2 x float> -> <4 x float>). Extract the
// elements we want. // elements we want.
if (PartVT.getVectorElementType() == ValueVT.getVectorElementType()) { if (PartEVT.getVectorElementType() == ValueVT.getVectorElementType()) {
assert(PartVT.getVectorNumElements() > ValueVT.getVectorNumElements() && assert(PartEVT.getVectorNumElements() > ValueVT.getVectorNumElements() &&
"Cannot narrow, it would be a lossy transformation"); "Cannot narrow, it would be a lossy transformation");
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ValueVT, Val, return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ValueVT, Val,
DAG.getIntPtrConstant(0)); DAG.getIntPtrConstant(0));
} }
// Vector/Vector bitcast. // Vector/Vector bitcast.
if (ValueVT.getSizeInBits() == PartVT.getSizeInBits()) if (ValueVT.getSizeInBits() == PartEVT.getSizeInBits())
return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val); return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
assert(PartVT.getVectorNumElements() == ValueVT.getVectorNumElements() && assert(PartEVT.getVectorNumElements() == ValueVT.getVectorNumElements() &&
"Cannot handle this kind of promotion"); "Cannot handle this kind of promotion");
// Promoted vector extract // Promoted vector extract
bool Smaller = ValueVT.bitsLE(PartVT); bool Smaller = ValueVT.bitsLE(PartEVT);
return DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND), return DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
DL, ValueVT, Val); DL, ValueVT, Val);
@@ -299,7 +298,7 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
// Trivial bitcast if the types are the same size and the destination // Trivial bitcast if the types are the same size and the destination
// vector type is legal. // vector type is legal.
if (PartVT.getSizeInBits() == ValueVT.getSizeInBits() && if (PartEVT.getSizeInBits() == ValueVT.getSizeInBits() &&
TLI.isTypeLegal(ValueVT)) TLI.isTypeLegal(ValueVT))
return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val); return DAG.getNode(ISD::BITCAST, DL, ValueVT, Val);
@@ -319,8 +318,8 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
} }
if (ValueVT.getVectorNumElements() == 1 && if (ValueVT.getVectorNumElements() == 1 &&
ValueVT.getVectorElementType() != PartVT) { ValueVT.getVectorElementType() != PartEVT) {
bool Smaller = ValueVT.bitsLE(PartVT); bool Smaller = ValueVT.bitsLE(PartEVT);
Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND), Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
DL, ValueVT.getScalarType(), Val); DL, ValueVT.getScalarType(), Val);
} }
@@ -330,14 +329,14 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc dl, static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc dl,
SDValue Val, SDValue *Parts, unsigned NumParts, SDValue Val, SDValue *Parts, unsigned NumParts,
EVT PartVT, const Value *V); MVT PartVT, const Value *V);
/// getCopyToParts - Create a series of nodes that contain the specified value /// getCopyToParts - Create a series of nodes that contain the specified value
/// split into legal parts. If the parts contain more bits than Val, then, for /// split into legal parts. If the parts contain more bits than Val, then, for
/// integers, ExtendKind can be used to specify how to generate the extra bits. /// integers, ExtendKind can be used to specify how to generate the extra bits.
static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL, static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
SDValue Val, SDValue *Parts, unsigned NumParts, SDValue Val, SDValue *Parts, unsigned NumParts,
EVT PartVT, const Value *V, MVT PartVT, const Value *V,
ISD::NodeType ExtendKind = ISD::ANY_EXTEND) { ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
EVT ValueVT = Val.getValueType(); EVT ValueVT = Val.getValueType();
@@ -354,7 +353,8 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
return; return;
assert(!ValueVT.isVector() && "Vector case handled elsewhere"); assert(!ValueVT.isVector() && "Vector case handled elsewhere");
if (PartVT == ValueVT) { EVT PartEVT = PartVT;
if (PartEVT == ValueVT) {
assert(NumParts == 1 && "No-op copy with multiple parts!"); assert(NumParts == 1 && "No-op copy with multiple parts!");
Parts[0] = Val; Parts[0] = Val;
return; return;
@@ -376,7 +376,7 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
} }
} else if (PartBits == ValueVT.getSizeInBits()) { } else if (PartBits == ValueVT.getSizeInBits()) {
// Different types of the same size. // Different types of the same size.
assert(NumParts == 1 && PartVT != ValueVT); assert(NumParts == 1 && PartEVT != ValueVT);
Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val); Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
} else if (NumParts * PartBits < ValueVT.getSizeInBits()) { } else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
// If the parts cover less bits than value has, truncate the value. // If the parts cover less bits than value has, truncate the value.
@@ -395,7 +395,7 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
"Failed to tile the value with PartVT!"); "Failed to tile the value with PartVT!");
if (NumParts == 1) { if (NumParts == 1) {
if (PartVT != ValueVT) { if (PartEVT != ValueVT) {
LLVMContext &Ctx = *DAG.getContext(); LLVMContext &Ctx = *DAG.getContext();
Twine ErrMsg("scalar-to-vector conversion failed"); Twine ErrMsg("scalar-to-vector conversion failed");
if (const Instruction *I = dyn_cast_or_null<Instruction>(V)) { if (const Instruction *I = dyn_cast_or_null<Instruction>(V)) {
@@ -468,20 +468,21 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
/// value split into legal parts. /// value split into legal parts.
static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL, static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
SDValue Val, SDValue *Parts, unsigned NumParts, SDValue Val, SDValue *Parts, unsigned NumParts,
EVT PartVT, const Value *V) { MVT PartVT, const Value *V) {
EVT ValueVT = Val.getValueType(); EVT ValueVT = Val.getValueType();
assert(ValueVT.isVector() && "Not a vector"); assert(ValueVT.isVector() && "Not a vector");
const TargetLowering &TLI = DAG.getTargetLoweringInfo(); const TargetLowering &TLI = DAG.getTargetLoweringInfo();
if (NumParts == 1) { if (NumParts == 1) {
if (PartVT == ValueVT) { EVT PartEVT = PartVT;
if (PartEVT == ValueVT) {
// Nothing to do. // Nothing to do.
} else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) { } else if (PartVT.getSizeInBits() == ValueVT.getSizeInBits()) {
// Bitconvert vector->vector case. // Bitconvert vector->vector case.
Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val); Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
} else if (PartVT.isVector() && } else if (PartVT.isVector() &&
PartVT.getVectorElementType() == ValueVT.getVectorElementType() && PartEVT.getVectorElementType() == ValueVT.getVectorElementType() &&
PartVT.getVectorNumElements() > ValueVT.getVectorNumElements()) { PartEVT.getVectorNumElements() > ValueVT.getVectorNumElements()) {
EVT ElementVT = PartVT.getVectorElementType(); EVT ElementVT = PartVT.getVectorElementType();
// Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in // Vector widening case, e.g. <2 x float> -> <4 x float>. Shuffle in
// undef elements. // undef elements.
@@ -501,12 +502,12 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
//SDValue UndefElts = DAG.getUNDEF(VectorTy); //SDValue UndefElts = DAG.getUNDEF(VectorTy);
//Val = DAG.getNode(ISD::CONCAT_VECTORS, DL, PartVT, Val, UndefElts); //Val = DAG.getNode(ISD::CONCAT_VECTORS, DL, PartVT, Val, UndefElts);
} else if (PartVT.isVector() && } else if (PartVT.isVector() &&
PartVT.getVectorElementType().bitsGE( PartEVT.getVectorElementType().bitsGE(
ValueVT.getVectorElementType()) && ValueVT.getVectorElementType()) &&
PartVT.getVectorNumElements() == ValueVT.getVectorNumElements()) { PartEVT.getVectorNumElements() == ValueVT.getVectorNumElements()) {
// Promoted vector extract // Promoted vector extract
bool Smaller = PartVT.bitsLE(ValueVT); bool Smaller = PartEVT.bitsLE(ValueVT);
Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND), Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND),
DL, PartVT, Val); DL, PartVT, Val);
} else{ } else{
@@ -536,8 +537,7 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!"); assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
NumParts = NumRegs; // Silence a compiler warning. NumParts = NumRegs; // Silence a compiler warning.
assert(RegisterVT == PartVT.getSimpleVT() && assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
"Part type doesn't match vector breakdown!");
// Split the vector into intermediate operands. // Split the vector into intermediate operands.
SmallVector<SDValue, 8> Ops(NumIntermediates); SmallVector<SDValue, 8> Ops(NumIntermediates);