@@ -5805,24 +5805,32 @@ class ScalarizationOverheadBuilder {
5805
5805
public:
5806
5806
/// Add an extraction from a specific source and element index.
5807
5807
void addExtract(Value *Src, unsigned Idx) {
5808
+ auto *Ty = cast<FixedVectorType>(Src->getType());
5809
+ unsigned NumElts = Ty->getNumElements();
5808
5810
if (m_ExtractsByClass.count(Src)) {
5809
- m_ExtractsByClass[Src].setBit(Idx);
5811
+ if (Idx < NumElts)
5812
+ m_ExtractsByClass[Src].setBit(Idx);
5813
+ else
5814
+ m_ExtractsByClass[Src].setAllBits();
5810
5815
return;
5811
5816
}
5812
- auto *Ty = cast<FixedVectorType>(Src->getType());
5813
- unsigned NumElts = Ty->getNumElements();
5814
- m_ExtractsByClass[Src] = APInt::getOneBitSet(NumElts, Idx);
5817
+ m_ExtractsByClass[Src] = Idx < NumElts ? APInt::getOneBitSet(NumElts, Idx)
5818
+ : APInt::getAllOnes(NumElts);
5815
5819
}
5816
5820
5817
5821
/// Add an extraction from a vector type and specific element index.
5818
5822
/// We assume that all extractions from a given type are from the same source.
5819
5823
void addExtract(FixedVectorType *VecTy, unsigned Idx) {
5824
+ unsigned NumElts = VecTy->getNumElements();
5820
5825
if (m_ExtractsByType.count(VecTy)) {
5821
- m_ExtractsByType[VecTy].setBit(Idx);
5826
+ if (Idx < NumElts)
5827
+ m_ExtractsByType[VecTy].setBit(Idx);
5828
+ else
5829
+ m_ExtractsByType[VecTy].setAllBits();
5822
5830
return;
5823
5831
}
5824
- unsigned NumElts = VecTy->getNumElements();
5825
- m_ExtractsByType[VecTy] = APInt::getOneBitSet (NumElts, Idx );
5832
+ m_ExtractsByType[VecTy] = Idx < NumElts ? APInt::getOneBitSet(NumElts, Idx)
5833
+ : APInt::getAllOnes (NumElts);
5826
5834
}
5827
5835
5828
5836
/// Add an extended extraction from a specific source and element index.
0 commit comments