@@ -5758,23 +5758,25 @@ bool SelectionDAG::isKnownNeverNaN(SDValue Op, const APInt &DemandedElts,
57585758 EVT BaseVectorVT = BaseVector.getValueType();
57595759 if (BaseVectorVT.isFixedLengthVector()) {
57605760 unsigned Idx = Op.getConstantOperandVal(2);
5761- unsigned NumBaseVectorElts = BaseVectorVT.getVectorNumElements();
5762- unsigned NumSubVectorElts =
5763- SubVector.getValueType().getVectorNumElements();
5764-
5765- // Clear the bits at the position where the subvector will be inserted.
5766- APInt DemandedMask = APInt::getAllOnes(NumSubVectorElts)
5767- .zext(NumBaseVectorElts)
5768- .shl(Idx)
5769- .reverseBits();
5770- APInt DemandedSrcElts = DemandedElts & DemandedMask;
5771-
5772- // If DemandedSrcElts is zero, we only need to check that the subvector is
5773- // never NaN.
5774- if (DemandedSrcElts.isZero())
5775- return isKnownNeverNaN(SubVector, SNaN, Depth + 1);
5776- return isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1) &&
5777- isKnownNeverNaN(SubVector, SNaN, Depth + 1);
5761+ unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
5762+ unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
5763+
5764+ // Clear/Extract the bits at the position where the subvector will be
5765+ // inserted.
5766+ APInt DemandedMask =
5767+ APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
5768+ APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
5769+ APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5770+
5771+ if (!DemandedSrcElts.isZero() && !DemandedSubElts.isZero())
5772+ return isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1) &&
5773+ isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
5774+ else if (!DemandedSrcElts.isZero())
5775+ return isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
5776+ else if (!DemandedSubElts.isZero())
5777+ return isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
5778+ else
5779+ return true;
57785780 }
57795781 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
57805782 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
0 commit comments