Make a vector live across blocks have the correct Vec type. This fixes
authorChris Lattner <sabre@nondot.org>
Wed, 5 Apr 2006 06:54:42 +0000 (06:54 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 5 Apr 2006 06:54:42 +0000 (06:54 +0000)
CodeGen/X86/2006-04-04-CrossBlockCrash.ll

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27436 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index 2f79fe568065547dc95a15995e67054cd23909c8..4eb33c163da64d5d627ef95ce8ddfad5eb3702f9 100644 (file)
@@ -648,7 +648,8 @@ SDOperand SelectionDAGLowering::getValue(const Value *V) {
     // Otherwise, if this is a vector, make it available as a generic vector
     // here.
     MVT::ValueType PTyElementVT, PTyLegalElementVT;
-    unsigned NE = TLI.getPackedTypeBreakdown(cast<PackedType>(VTy),PTyElementVT,
+    const PackedType *PTy = cast<PackedType>(VTy);
+    unsigned NE = TLI.getPackedTypeBreakdown(PTy, PTyElementVT,
                                              PTyLegalElementVT);
 
     // Build a VBUILD_VECTOR with the input registers.
@@ -684,6 +685,13 @@ SDOperand SelectionDAGLowering::getValue(const Value *V) {
     Ops.push_back(DAG.getConstant(NE, MVT::i32));
     Ops.push_back(DAG.getValueType(PTyLegalElementVT));
     N = DAG.getNode(ISD::VBUILD_VECTOR, MVT::Vector, Ops);
+    
+    // Finally, use a VBIT_CONVERT to make this available as the appropriate
+    // vector type.
+    N = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, N, 
+                    DAG.getConstant(PTy->getNumElements(),
+                                    MVT::i32),
+                    DAG.getValueType(TLI.getValueType(PTy->getElementType())));
   }
   
   return N;