aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-03-19 00:20:20 +0000
committerChris Lattner <sabre@nondot.org>2006-03-19 00:20:20 +0000
commit23d564c11fbe628dbebd6d8f09d7d07fa862b719 (patch)
tree7dac3533f985a35cd6f51a2d9766fd50a3cf60d4
parent1e4af78b9534c0234b2988517e5d5cd7d9325e32 (diff)
implement vector.ll:test_undef
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26845 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeDAG.cpp8
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp25
2 files changed, 24 insertions, 9 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index b4b607db3e..d6f23dc924 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -730,12 +730,16 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
std::vector<Constant*> CV;
if (MVT::isFloatingPoint(VT)) {
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));
}
} else {
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));
}
}
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index de4d2ec686..8254f6ed92 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -516,13 +516,26 @@ SDOperand SelectionDAGLowering::getValue(const Value *V) {
} else if (isa<ConstantPointerNull>(C)) {
return N = DAG.getConstant(0, TLI.getPointerTy());
} 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)) {
return N = DAG.getConstantFP(CFP->getValue(), VT);
} else if (const PackedType *PTy = dyn_cast<PackedType>(VTy)) {
unsigned NumElements = PTy->getNumElements();
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
// 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);
}
- // Create a ConstantVec node with generic Vector type.
- SDOperand Num = DAG.getConstant(NumElements, MVT::i32);
- SDOperand Typ = DAG.getValueType(PVT);
- Ops.push_back(Num);
- Ops.push_back(Typ);
+ // 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 {
// Canonicalize all constant ints to be unsigned.