implement vector.ll:test_undef
authorChris Lattner <sabre@nondot.org>
Sun, 19 Mar 2006 00:20:20 +0000 (00:20 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 19 Mar 2006 00:20:20 +0000 (00:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26845 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index b4b607db3e7c75eca60cf2a91bdc70ca4374c070..d6f23dc924823f2c9b7219fdd5315bb25f21265e 100644 (file)
@@ -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));
         }
       }
index de4d2ec686edeafe17c1a9db0e9c554ebebbfd99..8254f6ed921c0f965d1e045f0290efdeca2673ae 100644 (file)
@@ -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.