diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -701,12 +701,14 @@ ScalarEvolution *SE, Loop *TheLoop, const ValueToValueMap &StridesMap, bool ShouldCheckWrap) { + if (!IsRTCheckAnalysisNeeded) + return true; + // Find pointers with computable bounds. We are going to use this information // to place a runtime bound check. bool CanDoRT = true; - bool NeedRTCheck = false; - if (!IsRTCheckAnalysisNeeded) return true; + RtCheck.Need = false; bool IsDepCheckNeeded = isDependencyCheckNeeded(); @@ -747,10 +749,10 @@ // check them. But there is no need to checks if there is only one // dependence set for this alias set. // - // Note that this function computes CanDoRT and NeedRTCheck independently. - // For example CanDoRT=false, NeedRTCheck=false means that we have a pointer - // for which we couldn't find the bounds but we don't actually need to emit - // any checks so it does not matter. + // Note that this function computes CanDoRT and RtCheck.Need independently. + // For example CanDoRT=false, RtCheck.Need=false means that we have a + // pointer for which we couldn't find the bounds but we don't actually need + // to emit any checks so it does not matter. bool NeedsAliasSetRTCheck = false; if (!(IsDepCheckNeeded && CanDoAliasSetRT && RunningDepId == 2)) NeedsAliasSetRTCheck = (NumWritePtrChecks >= 2 || @@ -773,7 +775,7 @@ } CanDoRT &= CanDoAliasSetRT; - NeedRTCheck |= NeedsAliasSetRTCheck; + RtCheck.Need |= NeedsAliasSetRTCheck; ++ASId; } @@ -807,15 +809,19 @@ } } - if (NeedRTCheck && CanDoRT) + if (RtCheck.Need && CanDoRT) RtCheck.generateChecks(DepCands, IsDepCheckNeeded); LLVM_DEBUG(dbgs() << "LAA: We need to do " << RtCheck.getNumberOfChecks() << " pointer comparisons.\n"); - RtCheck.Need = NeedRTCheck; + // If we can do run-time checks, but there are no checks, no runtime checks + // are needed. This can happen when all pointers point to the same underlying + // object for example. + if (CanDoRT) + RtCheck.Need = RtCheck.getNumberOfChecks() != 0; - bool CanDoRTIfNeeded = !NeedRTCheck || CanDoRT; + bool CanDoRTIfNeeded = !RtCheck.Need || CanDoRT; if (!CanDoRTIfNeeded) RtCheck.reset(); return CanDoRTIfNeeded; diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2795,8 +2795,8 @@ std::tie(FirstCheckInst, MemRuntimeCheck) = addRuntimeChecks(MemCheckBlock->getTerminator(), OrigLoop, RtPtrChecking.getChecks(), RtPtrChecking.getSE()); - if (!MemRuntimeCheck) - return; + assert(MemRuntimeCheck && "no RT checks generated although RtPtrChecking " + "claimed checks are required"); if (MemCheckBlock->getParent()->hasOptSize()) { assert(Cost->Hints->getForce() == LoopVectorizeHints::FK_Enabled &&