implement vector.ll:test_undef

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26845 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2006-03-19 00:20:20 +00:00
parent 1e4af78b95
commit 23d564c11f
2 changed files with 24 additions and 9 deletions

View File

@ -730,12 +730,16 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
std::vector<Constant*> CV; std::vector<Constant*> CV;
if (MVT::isFloatingPoint(VT)) { if (MVT::isFloatingPoint(VT)) {
for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
double V = cast<ConstantFPSDNode>(Node->getOperand(i))->getValue(); double V = 0;
if (Node->getOperand(i).getOpcode() != ISD::UNDEF)
V = cast<ConstantFPSDNode>(Node->getOperand(i))->getValue();
CV.push_back(ConstantFP::get(OpNTy, V)); CV.push_back(ConstantFP::get(OpNTy, V));
} }
} else { } else {
for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
uint64_t V = cast<ConstantSDNode>(Node->getOperand(i))->getValue(); uint64_t V = 0;
if (Node->getOperand(i).getOpcode() != ISD::UNDEF)
V = cast<ConstantSDNode>(Node->getOperand(i))->getValue();
CV.push_back(ConstantUInt::get(OpNTy, V)); CV.push_back(ConstantUInt::get(OpNTy, V));
} }
} }

View File

@ -516,13 +516,26 @@ SDOperand SelectionDAGLowering::getValue(const Value *V) {
} else if (isa<ConstantPointerNull>(C)) { } else if (isa<ConstantPointerNull>(C)) {
return N = DAG.getConstant(0, TLI.getPointerTy()); return N = DAG.getConstant(0, TLI.getPointerTy());
} else if (isa<UndefValue>(C)) { } else if (isa<UndefValue>(C)) {
return N = DAG.getNode(ISD::UNDEF, VT); if (!isa<PackedType>(VTy))
return N = DAG.getNode(ISD::UNDEF, VT);
// Create a VConstant of undef nodes.
const PackedType *PTy = cast<PackedType>(VTy);
unsigned NumElements = PTy->getNumElements();
MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
std::vector<SDOperand> Ops;
Ops.assign(NumElements, DAG.getNode(ISD::UNDEF, PVT));
// Create a VConstant node with generic Vector type.
Ops.push_back(DAG.getConstant(NumElements, MVT::i32));
Ops.push_back(DAG.getValueType(PVT));
return N = DAG.getNode(ISD::VConstant, MVT::Vector, Ops);
} else if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) { } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
return N = DAG.getConstantFP(CFP->getValue(), VT); return N = DAG.getConstantFP(CFP->getValue(), VT);
} else if (const PackedType *PTy = dyn_cast<PackedType>(VTy)) { } else if (const PackedType *PTy = dyn_cast<PackedType>(VTy)) {
unsigned NumElements = PTy->getNumElements(); unsigned NumElements = PTy->getNumElements();
MVT::ValueType PVT = TLI.getValueType(PTy->getElementType()); MVT::ValueType PVT = TLI.getValueType(PTy->getElementType());
MVT::ValueType TVT = MVT::getVectorType(PVT, NumElements);
// Now that we know the number and type of the elements, push a // Now that we know the number and type of the elements, push a
// Constant or ConstantFP node onto the ops list for each element of // Constant or ConstantFP node onto the ops list for each element of
@ -551,11 +564,9 @@ SDOperand SelectionDAGLowering::getValue(const Value *V) {
Ops.assign(NumElements, Op); Ops.assign(NumElements, Op);
} }
// Create a ConstantVec node with generic Vector type. // Create a VConstant node with generic Vector type.
SDOperand Num = DAG.getConstant(NumElements, MVT::i32); Ops.push_back(DAG.getConstant(NumElements, MVT::i32));
SDOperand Typ = DAG.getValueType(PVT); Ops.push_back(DAG.getValueType(PVT));
Ops.push_back(Num);
Ops.push_back(Typ);
return N = DAG.getNode(ISD::VConstant, MVT::Vector, Ops); return N = DAG.getNode(ISD::VConstant, MVT::Vector, Ops);
} else { } else {
// Canonicalize all constant ints to be unsigned. // Canonicalize all constant ints to be unsigned.