diff --git a/include/llvm/Analysis/LoopAccessAnalysis.h b/include/llvm/Analysis/LoopAccessAnalysis.h index 5656dca7954..731cb5dabc9 100644 --- a/include/llvm/Analysis/LoopAccessAnalysis.h +++ b/include/llvm/Analysis/LoopAccessAnalysis.h @@ -384,6 +384,15 @@ public: void groupChecks(MemoryDepChecker::DepCandidates &DepCands, bool UseDependencies); + /// Generate the checks and return them. + /// + /// \p PtrToPartition contains the partition number for pointers. If passed, + /// omit checks between pointers belonging to the same partition. Partition + /// number -1 means that the pointer is used in multiple partitions. In this + /// case we can't safely omit the check. + SmallVector + generateChecks(const SmallVectorImpl *PtrPartition = nullptr) const; + /// \brief Decide if we need to add a check between two groups of pointers, /// according to needsChecking. bool needsChecking(const CheckingPtrGroup &M, const CheckingPtrGroup &N, diff --git a/lib/Analysis/LoopAccessAnalysis.cpp b/lib/Analysis/LoopAccessAnalysis.cpp index 7fe2c999ddc..48f2379ebec 100644 --- a/lib/Analysis/LoopAccessAnalysis.cpp +++ b/lib/Analysis/LoopAccessAnalysis.cpp @@ -148,6 +148,23 @@ void RuntimePointerChecking::insert(Loop *Lp, Value *Ptr, bool WritePtr, Pointers.emplace_back(Ptr, ScStart, ScEnd, WritePtr, DepSetId, ASId, Sc); } +SmallVector +RuntimePointerChecking::generateChecks( + const SmallVectorImpl *PtrPartition) const { + SmallVector Checks; + + for (unsigned i = 0; i < CheckingGroups.size(); ++i) { + for (unsigned j = i + 1; j < CheckingGroups.size(); ++j) { + const RuntimePointerChecking::CheckingPtrGroup &CGI = CheckingGroups[i]; + const RuntimePointerChecking::CheckingPtrGroup &CGJ = CheckingGroups[j]; + + if (needsChecking(CGI, CGJ, PtrPartition)) + Checks.push_back(std::make_pair(&CGI, &CGJ)); + } + } + return Checks; +} + bool RuntimePointerChecking::needsChecking( const CheckingPtrGroup &M, const CheckingPtrGroup &N, const SmallVectorImpl *PtrPartition) const { @@ -1708,20 +1725,7 @@ std::pair LoopAccessInfo::addRuntimeCheck( if (!PtrRtChecking.Need) return std::make_pair(nullptr, nullptr); - SmallVector Checks; - for (unsigned i = 0; i < PtrRtChecking.CheckingGroups.size(); ++i) { - for (unsigned j = i + 1; j < PtrRtChecking.CheckingGroups.size(); ++j) { - const RuntimePointerChecking::CheckingPtrGroup &CGI = - PtrRtChecking.CheckingGroups[i]; - const RuntimePointerChecking::CheckingPtrGroup &CGJ = - PtrRtChecking.CheckingGroups[j]; - - if (PtrRtChecking.needsChecking(CGI, CGJ, PtrPartition)) - Checks.push_back(std::make_pair(&CGI, &CGJ)); - } - } - - return addRuntimeCheck(Loc, Checks); + return addRuntimeCheck(Loc, PtrRtChecking.generateChecks(PtrPartition)); } LoopAccessInfo::LoopAccessInfo(Loop *L, ScalarEvolution *SE,