diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 4551a365a6967..750c93a439c16 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -21198,7 +21198,11 @@ bool SLPVectorizerPass::vectorizeStores( } } + // MaxRegVF represents the number of instructions (scalar, or vector in + // case of revec) that can be vectorized to naturally fit in a vector + // register. unsigned MaxRegVF = MaxVF; + MaxVF = std::min(MaxVF, bit_floor(Operands.size())); if (MaxVF < MinVF) { LLVM_DEBUG(dbgs() << "SLP: Vectorization infeasible as MaxVF (" << MaxVF @@ -21207,13 +21211,11 @@ bool SLPVectorizerPass::vectorizeStores( continue; } - unsigned Sz = 1 + Log2_32(MaxVF) - Log2_32(MinVF); - SmallVector CandidateVFs(Sz + (NonPowerOf2VF > 0 ? 1 : 0)); - unsigned Size = MinVF; - for (unsigned &VF : reverse(CandidateVFs)) { - VF = Size > MaxVF ? NonPowerOf2VF : Size; - Size *= 2; - } + SmallVector CandidateVFs; + for (unsigned VF = std::max(MaxVF, NonPowerOf2VF); VF >= MinVF; + VF = divideCeil(VF, 2)) + CandidateVFs.push_back(VF); + unsigned End = Operands.size(); unsigned Repeat = 0; constexpr unsigned MaxAttempts = 4;