From: Simon Pilgrim Date: Sun, 10 Feb 2019 22:45:48 +0000 (+0000) Subject: [X86] EltsFromConsecutiveLoads - replace SmallBitVector with APInt (NFC). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9021cc9551ebe019fb72604972b01bcfc50c32b8;p=llvm [X86] EltsFromConsecutiveLoads - replace SmallBitVector with APInt (NFC). Minor refactor to simplify some incoming patches to improve broadcast loads. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353655 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 1cc84be63be..e28341c6208 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -7273,9 +7273,9 @@ static SDValue EltsFromConsecutiveLoads(EVT VT, ArrayRef Elts, unsigned NumElems = Elts.size(); int LastLoadedElt = -1; - SmallBitVector LoadMask(NumElems, false); - SmallBitVector ZeroMask(NumElems, false); - SmallBitVector UndefMask(NumElems, false); + APInt LoadMask = APInt::getNullValue(NumElems); + APInt ZeroMask = APInt::getNullValue(NumElems); + APInt UndefMask = APInt::getNullValue(NumElems); // For each element in the initializer, see if we've found a load, zero or an // undef. @@ -7285,11 +7285,11 @@ static SDValue EltsFromConsecutiveLoads(EVT VT, ArrayRef Elts, return SDValue(); if (Elt.isUndef()) - UndefMask[i] = true; + UndefMask.setBit(i); else if (X86::isZeroNode(Elt) || ISD::isBuildVectorAllZeros(Elt.getNode())) - ZeroMask[i] = true; + ZeroMask.setBit(i); else if (ISD::isNON_EXTLoad(Elt.getNode())) { - LoadMask[i] = true; + LoadMask.setBit(i); LastLoadedElt = i; // Each loaded element must be the correct fractional portion of the // requested vector load. @@ -7298,20 +7298,21 @@ static SDValue EltsFromConsecutiveLoads(EVT VT, ArrayRef Elts, } else return SDValue(); } - assert((ZeroMask | UndefMask | LoadMask).count() == NumElems && + assert((ZeroMask.countPopulation() + UndefMask.countPopulation() + + LoadMask.countPopulation()) == NumElems && "Incomplete element masks"); // Handle Special Cases - all undef or undef/zero. - if (UndefMask.count() == NumElems) + if (UndefMask.countPopulation() == NumElems) return DAG.getUNDEF(VT); // FIXME: Should we return this as a BUILD_VECTOR instead? - if ((ZeroMask | UndefMask).count() == NumElems) + if ((ZeroMask.countPopulation() + UndefMask.countPopulation()) == NumElems) return VT.isInteger() ? DAG.getConstant(0, DL, VT) : DAG.getConstantFP(0.0, DL, VT); const TargetLowering &TLI = DAG.getTargetLoweringInfo(); - int FirstLoadedElt = LoadMask.find_first(); + int FirstLoadedElt = LoadMask.countTrailingZeros(); SDValue EltBase = peekThroughBitcasts(Elts[FirstLoadedElt]); LoadSDNode *LDBase = cast(EltBase); EVT LDBaseVT = EltBase.getValueType();