@@ -3756,22 +3756,27 @@ static Constant *ConstantFoldFixedVectorCall(
37563756 }
37573757 case Intrinsic::vector_extract: {
37583758 auto *Vec = dyn_cast<Constant>(Operands[0 ]);
3759- auto *Idx = dyn_cast <ConstantInt>(Operands[1 ]);
3760- if (!Vec || !Idx)
3759+ auto *Idx = cast <ConstantInt>(Operands[1 ]);
3760+ if (!Vec || !Idx || !isa<FixedVectorType>(Vec-> getType ()) )
37613761 return nullptr ;
37623762
37633763 unsigned NumElements = FVTy->getNumElements ();
37643764 unsigned VecNumElements =
37653765 cast<FixedVectorType>(Vec->getType ())->getNumElements ();
37663766 unsigned StartingIndex = Idx->getZExtValue ();
3767+
37673768 // Extracting entire vector is nop
37683769 if (NumElements == VecNumElements && StartingIndex == 0 )
37693770 return Vec;
37703771
37713772 const unsigned NonPoisonNumElements =
37723773 std::min (StartingIndex + NumElements, VecNumElements);
3773- for (unsigned I = StartingIndex; I < NonPoisonNumElements; ++I)
3774- Result[I - StartingIndex] = Vec->getAggregateElement (I);
3774+ for (unsigned I = StartingIndex; I < NonPoisonNumElements; ++I) {
3775+ Constant *Elt = Vec->getAggregateElement (I);
3776+ if (!Elt)
3777+ return nullptr ;
3778+ Result[I - StartingIndex] = Elt;
3779+ }
37753780
37763781 // Remaining elements are poison since they are out of bounds.
37773782 for (unsigned I = NonPoisonNumElements, E = StartingIndex + NumElements;
@@ -3784,7 +3789,7 @@ static Constant *ConstantFoldFixedVectorCall(
37843789 auto *Vec = dyn_cast<Constant>(Operands[0 ]);
37853790 auto *SubVec = dyn_cast<Constant>(Operands[1 ]);
37863791 auto *Idx = dyn_cast<ConstantInt>(Operands[2 ]);
3787- if (!Vec || !SubVec || !Idx)
3792+ if (!Vec || !SubVec || !Idx || !isa<FixedVectorType>(Vec-> getType ()) )
37883793 return nullptr ;
37893794
37903795 unsigned SubVecNumElements =
@@ -3803,12 +3808,24 @@ static Constant *ConstantFoldFixedVectorCall(
38033808 return PoisonValue::get (FVTy);
38043809
38053810 unsigned I = 0 ;
3806- for (; I < IdxN; ++I)
3807- Result[I] = Vec->getAggregateElement (I);
3808- for (; I < IdxN + SubVecNumElements; ++I)
3809- Result[I] = SubVec->getAggregateElement (I - IdxN);
3810- for (; I < VecNumElements; ++I)
3811- Result[I] = Vec->getAggregateElement (I);
3811+ for (; I < IdxN; ++I) {
3812+ Constant *Elt = Vec->getAggregateElement (I);
3813+ if (!Elt)
3814+ return nullptr ;
3815+ Result[I] = Elt;
3816+ }
3817+ for (; I < IdxN + SubVecNumElements; ++I) {
3818+ Constant *Elt = SubVec->getAggregateElement (I - IdxN);
3819+ if (!Elt)
3820+ return nullptr ;
3821+ Result[I] = Elt;
3822+ }
3823+ for (; I < VecNumElements; ++I) {
3824+ Constant *Elt = Vec->getAggregateElement (I);
3825+ if (!Elt)
3826+ return nullptr ;
3827+ Result[I] = Elt;
3828+ }
38123829 return ConstantVector::get (Result);
38133830 }
38143831 case Intrinsic::vector_interleave2: {
@@ -3820,8 +3837,12 @@ static Constant *ConstantFoldFixedVectorCall(
38203837 unsigned NumElements =
38213838 cast<FixedVectorType>(Vec0->getType ())->getNumElements ();
38223839 for (unsigned I = 0 ; I < NumElements; ++I) {
3823- Result[2 * I] = Vec0->getAggregateElement (I);
3824- Result[2 * I + 1 ] = Vec1->getAggregateElement (I);
3840+ Constant *Elt0 = Vec0->getAggregateElement (I);
3841+ Constant *Elt1 = Vec1->getAggregateElement (I);
3842+ if (!Elt0 || !Elt1)
3843+ return nullptr ;
3844+ Result[2 * I] = Elt0;
3845+ Result[2 * I + 1 ] = Elt1;
38253846 }
38263847 return ConstantVector::get (Result);
38273848 }
@@ -3996,8 +4017,12 @@ ConstantFoldStructCall(StringRef Name, Intrinsic::ID IntrinsicID,
39964017 2 ;
39974018 SmallVector<Constant *, 4 > Res0 (NumElements), Res1 (NumElements);
39984019 for (unsigned I = 0 ; I < NumElements; ++I) {
3999- Res0[I] = Vec->getAggregateElement (2 * I);
4000- Res1[I] = Vec->getAggregateElement (2 * I + 1 );
4020+ Constant *Elt0 = Vec->getAggregateElement (2 * I);
4021+ Constant *Elt1 = Vec->getAggregateElement (2 * I + 1 );
4022+ if (!Elt0 || !Elt1)
4023+ return nullptr ;
4024+ Res0[I] = Elt0;
4025+ Res1[I] = Elt1;
40014026 }
40024027 return ConstantStruct::get (StTy, ConstantVector::get (Res0),
40034028 ConstantVector::get (Res1));
0 commit comments