@@ -3740,22 +3740,27 @@ static Constant *ConstantFoldFixedVectorCall(
3740
3740
}
3741
3741
case Intrinsic::vector_extract: {
3742
3742
auto *Vec = dyn_cast<Constant>(Operands[0 ]);
3743
- auto *Idx = dyn_cast <ConstantInt>(Operands[1 ]);
3744
- if (!Vec || !Idx)
3743
+ auto *Idx = cast <ConstantInt>(Operands[1 ]);
3744
+ if (!Vec || !Idx || !isa<FixedVectorType>(Vec-> getType ()) )
3745
3745
return nullptr ;
3746
3746
3747
3747
unsigned NumElements = FVTy->getNumElements ();
3748
3748
unsigned VecNumElements =
3749
3749
cast<FixedVectorType>(Vec->getType ())->getNumElements ();
3750
3750
unsigned StartingIndex = Idx->getZExtValue ();
3751
+
3751
3752
// Extracting entire vector is nop
3752
3753
if (NumElements == VecNumElements && StartingIndex == 0 )
3753
3754
return Vec;
3754
3755
3755
3756
const unsigned NonPoisonNumElements =
3756
3757
std::min (StartingIndex + NumElements, VecNumElements);
3757
- for (unsigned I = StartingIndex; I < NonPoisonNumElements; ++I)
3758
- Result[I - StartingIndex] = Vec->getAggregateElement (I);
3758
+ for (unsigned I = StartingIndex; I < NonPoisonNumElements; ++I) {
3759
+ Constant *Elt = Vec->getAggregateElement (I);
3760
+ if (!Elt)
3761
+ return nullptr ;
3762
+ Result[I - StartingIndex] = Elt;
3763
+ }
3759
3764
3760
3765
// Remaining elements are poison since they are out of bounds.
3761
3766
for (unsigned I = NonPoisonNumElements, E = StartingIndex + NumElements;
@@ -3768,7 +3773,7 @@ static Constant *ConstantFoldFixedVectorCall(
3768
3773
auto *Vec = dyn_cast<Constant>(Operands[0 ]);
3769
3774
auto *SubVec = dyn_cast<Constant>(Operands[1 ]);
3770
3775
auto *Idx = dyn_cast<ConstantInt>(Operands[2 ]);
3771
- if (!Vec || !SubVec || !Idx)
3776
+ if (!Vec || !SubVec || !Idx || !isa<FixedVectorType>(Vec-> getType ()) )
3772
3777
return nullptr ;
3773
3778
3774
3779
unsigned SubVecNumElements =
@@ -3787,12 +3792,24 @@ static Constant *ConstantFoldFixedVectorCall(
3787
3792
return PoisonValue::get (FVTy);
3788
3793
3789
3794
unsigned I = 0 ;
3790
- for (; I < IdxN; ++I)
3791
- Result[I] = Vec->getAggregateElement (I);
3792
- for (; I < IdxN + SubVecNumElements; ++I)
3793
- Result[I] = SubVec->getAggregateElement (I - IdxN);
3794
- for (; I < VecNumElements; ++I)
3795
- Result[I] = Vec->getAggregateElement (I);
3795
+ for (; I < IdxN; ++I) {
3796
+ Constant *Elt = Vec->getAggregateElement (I);
3797
+ if (!Elt)
3798
+ return nullptr ;
3799
+ Result[I] = Elt;
3800
+ }
3801
+ for (; I < IdxN + SubVecNumElements; ++I) {
3802
+ Constant *Elt = SubVec->getAggregateElement (I - IdxN);
3803
+ if (!Elt)
3804
+ return nullptr ;
3805
+ Result[I] = Elt;
3806
+ }
3807
+ for (; I < VecNumElements; ++I) {
3808
+ Constant *Elt = Vec->getAggregateElement (I);
3809
+ if (!Elt)
3810
+ return nullptr ;
3811
+ Result[I] = Elt;
3812
+ }
3796
3813
return ConstantVector::get (Result);
3797
3814
}
3798
3815
case Intrinsic::vector_interleave2: {
@@ -3804,8 +3821,12 @@ static Constant *ConstantFoldFixedVectorCall(
3804
3821
unsigned NumElements =
3805
3822
cast<FixedVectorType>(Vec0->getType ())->getNumElements ();
3806
3823
for (unsigned I = 0 ; I < NumElements; ++I) {
3807
- Result[2 * I] = Vec0->getAggregateElement (I);
3808
- Result[2 * I + 1 ] = Vec1->getAggregateElement (I);
3824
+ Constant *Elt0 = Vec0->getAggregateElement (I);
3825
+ Constant *Elt1 = Vec1->getAggregateElement (I);
3826
+ if (!Elt0 || !Elt1)
3827
+ return nullptr ;
3828
+ Result[2 * I] = Elt0;
3829
+ Result[2 * I + 1 ] = Elt1;
3809
3830
}
3810
3831
return ConstantVector::get (Result);
3811
3832
}
@@ -3957,8 +3978,12 @@ ConstantFoldStructCall(StringRef Name, Intrinsic::ID IntrinsicID,
3957
3978
2 ;
3958
3979
SmallVector<Constant *, 4 > Res0 (NumElements), Res1 (NumElements);
3959
3980
for (unsigned I = 0 ; I < NumElements; ++I) {
3960
- Res0[I] = Vec->getAggregateElement (2 * I);
3961
- Res1[I] = Vec->getAggregateElement (2 * I + 1 );
3981
+ Constant *Elt0 = Vec->getAggregateElement (2 * I);
3982
+ Constant *Elt1 = Vec->getAggregateElement (2 * I + 1 );
3983
+ if (!Elt0 || !Elt1)
3984
+ return nullptr ;
3985
+ Res0[I] = Elt0;
3986
+ Res1[I] = Elt1;
3962
3987
}
3963
3988
return ConstantStruct::get (StTy, ConstantVector::get (Res0),
3964
3989
ConstantVector::get (Res1));
0 commit comments