diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -7955,8 +7955,11 @@ // bundle. The end of the bundle is marked by null ScheduleData. if (BlocksSchedules.count(BB)) { Value *V = E->isOneOf(E->Scalars.back()); - if (doesNotNeedToBeScheduled(V)) - V = *find_if_not(E->Scalars, doesNotNeedToBeScheduled); + if (doesNotNeedToBeScheduled(V)) { + auto AltValIter = find_if_not(E->Scalars, doesNotNeedToBeScheduled); + if (AltValIter != std::end(E->Scalars)) + V = *AltValIter; + } auto *Bundle = BlocksSchedules[BB]->getScheduleData(V); if (Bundle && Bundle->isPartOfBundle()) for (; Bundle; Bundle = Bundle->NextInBundle) @@ -9785,8 +9788,11 @@ doesNotNeedToSchedule(VL)) return; - if (doesNotNeedToBeScheduled(OpValue)) - OpValue = *find_if_not(VL, doesNotNeedToBeScheduled); + if (doesNotNeedToBeScheduled(OpValue)) { + auto AltValIter = find_if_not(VL, doesNotNeedToBeScheduled); + if (AltValIter != std::end(VL)) + OpValue = *AltValIter; + } ScheduleData *Bundle = getScheduleData(OpValue); LLVM_DEBUG(dbgs() << "SLP: cancel scheduling of " << *Bundle << "\n"); assert(!Bundle->IsScheduled &&