From 0cbfb71d7b937da14f365efc371b5c23dfce06bc Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Wed, 18 Feb 2015 03:43:58 +0000 Subject: [PATCH] [LoopAccesses] Factor out RuntimePointerCheck::needsChecking Will be used by the new RuntimePointerCheck::print. This is part of the patchset that converts LoopAccessAnalysis into an actual analysis pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229629 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/LoopAccessAnalysis.h | 4 ++++ lib/Analysis/LoopAccessAnalysis.cpp | 27 ++++++++++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/include/llvm/Analysis/LoopAccessAnalysis.h b/include/llvm/Analysis/LoopAccessAnalysis.h index 3f85fdf765b..e05f99726f2 100644 --- a/include/llvm/Analysis/LoopAccessAnalysis.h +++ b/include/llvm/Analysis/LoopAccessAnalysis.h @@ -116,6 +116,10 @@ public: void insert(ScalarEvolution *SE, Loop *Lp, Value *Ptr, bool WritePtr, unsigned DepSetId, unsigned ASId, ValueToValueMap &Strides); + /// \brief Decide whether we need to issue a run-time check for pointer at + /// index \p I and \p J to prove their independence. + bool needsChecking(unsigned I, unsigned J) const; + /// This flag indicates if we need to add the runtime check. bool Need; /// Holds the pointers that we need to check. diff --git a/lib/Analysis/LoopAccessAnalysis.cpp b/lib/Analysis/LoopAccessAnalysis.cpp index 4ccd135f894..e9e9be31ff7 100644 --- a/lib/Analysis/LoopAccessAnalysis.cpp +++ b/lib/Analysis/LoopAccessAnalysis.cpp @@ -93,6 +93,23 @@ void LoopAccessInfo::RuntimePointerCheck::insert(ScalarEvolution *SE, Loop *Lp, AliasSetId.push_back(ASId); } +bool LoopAccessInfo::RuntimePointerCheck::needsChecking(unsigned I, + unsigned J) const { + // No need to check if two readonly pointers intersect. + if (!IsWritePtr[I] && !IsWritePtr[J]) + return false; + + // Only need to check pointers between two different dependency sets. + if (DependencySetId[I] == DependencySetId[J]) + return false; + + // Only need to check pointers in the same alias set. + if (AliasSetId[I] != AliasSetId[J]) + return false; + + return true; +} + namespace { /// \brief Analyses memory accesses in a loop. /// @@ -1147,15 +1164,7 @@ LoopAccessInfo::addRuntimeCheck(Instruction *Loc) { Value *MemoryRuntimeCheck = nullptr; for (unsigned i = 0; i < NumPointers; ++i) { for (unsigned j = i+1; j < NumPointers; ++j) { - // No need to check if two readonly pointers intersect. - if (!PtrRtCheck.IsWritePtr[i] && !PtrRtCheck.IsWritePtr[j]) - continue; - - // Only need to check pointers between two different dependency sets. - if (PtrRtCheck.DependencySetId[i] == PtrRtCheck.DependencySetId[j]) - continue; - // Only need to check pointers in the same alias set. - if (PtrRtCheck.AliasSetId[i] != PtrRtCheck.AliasSetId[j]) + if (!PtrRtCheck.needsChecking(i, j)) continue; unsigned AS0 = Starts[i]->getType()->getPointerAddressSpace();