Rather than attempting to legalize 1 x float, make sure the SD ISel never

generates it.  Make MVT::Vector expand-only, and remove the code in
Legalize that attempts to legalize it.

The plan for supporting N x Type is to continually epxand it in ExpandOp
until it gets down to 2 x Type, where it will be scalarized into a pair of
scalars.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24482 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nate Begeman 2005-11-22 01:29:36 +00:00
parent ac2902bcb5
commit 4ef3b817fe
3 changed files with 29 additions and 49 deletions

View File

@ -925,26 +925,6 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1)); AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
return Result.getValue(Op.ResNo); return Result.getValue(Op.ResNo);
case ISD::VLOAD:
Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer.
// If we just have one element, scalarize the result. Otherwise, check to
// see if we support this operation on this type at this width. If not,
// split the vector in half and try again.
if (1 == cast<ConstantSDNode>(Node->getOperand(2))->getValue()) {
MVT::ValueType SVT = cast<VTSDNode>(Node->getOperand(3))->getVT();
Result = LegalizeOp(DAG.getLoad(SVT, Tmp1, Tmp2, Node->getOperand(4)));
} else {
assert(0 && "Expand case for vectors unimplemented");
}
// Since loads produce two values, make sure to remember that we legalized
// both of them.
AddLegalizedOperand(SDOperand(Node, 0), Result);
AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
return Result.getValue(Op.ResNo);
case ISD::EXTLOAD: case ISD::EXTLOAD:
case ISD::SEXTLOAD: case ISD::SEXTLOAD:
case ISD::ZEXTLOAD: { case ISD::ZEXTLOAD: {
@ -1685,28 +1665,6 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,Tmp2); Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,Tmp2);
break; break;
// Vector binary operators
case ISD::VADD:
case ISD::VSUB:
case ISD::VMUL: {
Tmp1 = Node->getOperand(0); // Element Count
Tmp2 = Node->getOperand(1); // Element Type
// If we just have one element, scalarize the result. Otherwise, check to
// see if we support this operation on this type at this width. If not,
// split the vector in half and try again.
if (1 == cast<ConstantSDNode>(Tmp1)->getValue()) {
MVT::ValueType SVT = cast<VTSDNode>(Tmp2)->getVT();
Result = DAG.getNode(getScalarizedOpcode(Node->getOpcode(), SVT), SVT,
LegalizeOp(Node->getOperand(2)),
LegalizeOp(Node->getOperand(3)));
} else {
assert(0 && "Expand case for vectors unimplemented");
}
break;
}
case ISD::BUILD_PAIR: { case ISD::BUILD_PAIR: {
MVT::ValueType PairTy = Node->getValueType(0); MVT::ValueType PairTy = Node->getValueType(0);
// TODO: handle the case where the Lo and Hi operands are not of legal type // TODO: handle the case where the Lo and Hi operands are not of legal type

View File

@ -517,9 +517,19 @@ void SelectionDAGLowering::visitBinary(User &I, unsigned IntOp, unsigned FPOp,
setValue(&I, DAG.getNode(FPOp, Op1.getValueType(), Op1, Op2)); setValue(&I, DAG.getNode(FPOp, Op1.getValueType(), Op1, Op2));
} else { } else {
const PackedType *PTy = cast<PackedType>(Ty); const PackedType *PTy = cast<PackedType>(Ty);
SDOperand Num = DAG.getConstant(PTy->getNumElements(), MVT::i32); unsigned NumElements = PTy->getNumElements();
SDOperand Typ = DAG.getValueType(TLI.getValueType(PTy->getElementType())); MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
setValue(&I, DAG.getNode(VecOp, Op1.getValueType(), Num, Typ, Op1, Op2));
// Immediately scalarize packed types containing only one element, so that
// the Legalize pass does not have to deal with them.
if (NumElements == 1) {
unsigned Opc = MVT::isFloatingPoint(PVT) ? FPOp : IntOp;
setValue(&I, DAG.getNode(Opc, PVT, Op1, Op2));
} else {
SDOperand Num = DAG.getConstant(NumElements, MVT::i32);
SDOperand Typ = DAG.getValueType(PVT);
setValue(&I, DAG.getNode(VecOp, Op1.getValueType(), Num, Typ, Op1, Op2));
}
} }
} }
@ -726,9 +736,17 @@ void SelectionDAGLowering::visitLoad(LoadInst &I) {
if (Type::PackedTyID == Ty->getTypeID()) { if (Type::PackedTyID == Ty->getTypeID()) {
const PackedType *PTy = cast<PackedType>(Ty); const PackedType *PTy = cast<PackedType>(Ty);
L = DAG.getVecLoad(PTy->getNumElements(), unsigned NumElements = PTy->getNumElements();
TLI.getValueType(PTy->getElementType()), Root, Ptr, MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
DAG.getSrcValue(I.getOperand(0)));
// Immediately scalarize packed types containing only one element, so that
// the Legalize pass does not have to deal with them.
if (NumElements == 1) {
L = DAG.getLoad(PVT, Root, Ptr, DAG.getSrcValue(I.getOperand(0)));
} else {
L = DAG.getVecLoad(NumElements, PVT, Root, Ptr,
DAG.getSrcValue(I.getOperand(0)));
}
} else { } else {
L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr, L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr,
DAG.getSrcValue(I.getOperand(0))); DAG.getSrcValue(I.getOperand(0)));

View File

@ -64,7 +64,7 @@ static void SetValueTypeAction(MVT::ValueType VT,
assert(VT < PromoteTo && "Must promote to a larger type!"); assert(VT < PromoteTo && "Must promote to a larger type!");
TransformToType[VT] = PromoteTo; TransformToType[VT] = PromoteTo;
} else if (Action == TargetLowering::Expand) { } else if (Action == TargetLowering::Expand) {
assert(MVT::isInteger(VT) && VT > MVT::i8 && assert((VT == MVT::Vector || MVT::isInteger(VT)) && VT > MVT::i8 &&
"Cannot expand this type: target must support SOME integer reg!"); "Cannot expand this type: target must support SOME integer reg!");
// Expand to the next smaller integer type! // Expand to the next smaller integer type!
TransformToType[VT] = (MVT::ValueType)(VT-1); TransformToType[VT] = (MVT::ValueType)(VT-1);
@ -114,6 +114,10 @@ void TargetLowering::computeRegisterProperties() {
else else
TransformToType[MVT::f32] = MVT::f32; TransformToType[MVT::f32] = MVT::f32;
// Set MVT::Vector to always be Expanded
SetValueTypeAction(MVT::Vector, Expand, *this, TransformToType,
ValueTypeActions);
assert(isTypeLegal(MVT::f64) && "Target does not support FP?"); assert(isTypeLegal(MVT::f64) && "Target does not support FP?");
TransformToType[MVT::f64] = MVT::f64; TransformToType[MVT::f64] = MVT::f64;
} }