forked from OSchip/llvm-project
[SelectionDAG] ComputeKnownBits - merge EXTRACT_VECTOR_ELT known/unknown index paths
Match the approach in SimplifyDemandedBits/ComputeNumSignBits where we calculate the demanded elts and then have a common path for the ComputeKnownBits call.
This commit is contained in:
parent
98da49d979
commit
03cae086f4
|
@ -3241,20 +3241,21 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
|||
EVT VecVT = InVec.getValueType();
|
||||
const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
|
||||
const unsigned NumSrcElts = VecVT.getVectorNumElements();
|
||||
|
||||
// If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
|
||||
// anything about the extended bits.
|
||||
if (BitWidth > EltBitWidth)
|
||||
Known = Known.trunc(EltBitWidth);
|
||||
ConstantSDNode *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
|
||||
if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)) {
|
||||
// If we know the element index, just demand that vector element.
|
||||
unsigned Idx = ConstEltNo->getZExtValue();
|
||||
APInt DemandedElt = APInt::getOneBitSet(NumSrcElts, Idx);
|
||||
Known = computeKnownBits(InVec, DemandedElt, Depth + 1);
|
||||
} else {
|
||||
// Unknown element index, so ignore DemandedElts and demand them all.
|
||||
Known = computeKnownBits(InVec, Depth + 1);
|
||||
}
|
||||
|
||||
// If we know the element index, just demand that vector element, else for
|
||||
// an unknown element index, ignore DemandedElts and demand them all.
|
||||
APInt DemandedSrcElts = APInt::getAllOnesValue(NumSrcElts);
|
||||
auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
|
||||
if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
|
||||
DemandedSrcElts =
|
||||
APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
|
||||
|
||||
Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
|
||||
if (BitWidth > EltBitWidth)
|
||||
Known = Known.zext(BitWidth, false /* => any extend */);
|
||||
break;
|
||||
|
@ -3902,7 +3903,7 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
|
|||
// If we know the element index, just demand that vector element, else for
|
||||
// an unknown element index, ignore DemandedElts and demand them all.
|
||||
APInt DemandedSrcElts = APInt::getAllOnesValue(NumSrcElts);
|
||||
ConstantSDNode *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
|
||||
auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
|
||||
if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
|
||||
DemandedSrcElts =
|
||||
APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
|
||||
|
|
Loading…
Reference in New Issue