Index: include/llvm/Analysis/LoopAccessAnalysis.h =================================================================== --- include/llvm/Analysis/LoopAccessAnalysis.h +++ include/llvm/Analysis/LoopAccessAnalysis.h @@ -94,6 +94,7 @@ public: typedef PointerIntPair MemAccessInfo; typedef SmallPtrSet MemAccessInfoSet; + typedef SmallVector MemAccessInfoList; /// \brief Set of potential dependent memory accesses. typedef EquivalenceClasses DepCandidates; @@ -189,6 +190,7 @@ /// /// Only checks sets with elements in \p CheckDeps. bool areDepsSafe(DepCandidates &AccessSets, MemAccessInfoSet &CheckDeps, + MemAccessInfoList &CheckDepsList, const ValueToValueMap &Strides); /// \brief No memory dependence was encountered that would inhibit Index: lib/Analysis/LoopAccessAnalysis.cpp =================================================================== --- lib/Analysis/LoopAccessAnalysis.cpp +++ lib/Analysis/LoopAccessAnalysis.cpp @@ -499,6 +499,7 @@ /// \brief Read or write access location. typedef PointerIntPair MemAccessInfo; typedef SmallPtrSet MemAccessInfoSet; + typedef SmallVector MemAccessInfoList; AccessAnalysis(const DataLayout &Dl, AliasAnalysis *AA, LoopInfo *LI, MemoryDepChecker::DepCandidates &DA, @@ -547,10 +548,12 @@ /// We decided that no dependence analysis would be used. Reset the state. void resetDepChecks(MemoryDepChecker &DepChecker) { CheckDeps.clear(); + CheckDepsList.clear(); DepChecker.clearDependences(); } MemAccessInfoSet &getDependenciesToCheck() { return CheckDeps; } + MemAccessInfoList &getDependenciesListToCheck() { return CheckDepsList; } private: typedef SetVector PtrAccessSet; @@ -566,6 +569,7 @@ /// Set of accesses that need a further dependence check. MemAccessInfoSet CheckDeps; + MemAccessInfoList CheckDepsList; /// Set of pointers that are read only. SmallPtrSet ReadOnlyPtr; @@ -823,6 +827,7 @@ // catch "a[i] = a[i] + " without having to do a dependence check). if ((IsWrite || IsReadOnlyPtr) && SetHasWrite) { CheckDeps.insert(Access); + CheckDepsList.push_back(Access); IsRTCheckAnalysisNeeded = true; } @@ -1547,11 +1552,13 @@ bool MemoryDepChecker::areDepsSafe(DepCandidates &AccessSets, MemAccessInfoSet &CheckDeps, + MemAccessInfoList &CheckDepsList, const ValueToValueMap &Strides) { MaxSafeDepDistBytes = -1; - while (!CheckDeps.empty()) { - MemAccessInfo CurAccess = *CheckDeps.begin(); + for (MemAccessInfo CurAccess : CheckDepsList) { + if (!CheckDeps.count(CurAccess)) + continue; // Get the relevant memory access set. EquivalenceClasses::iterator I = @@ -1873,7 +1880,8 @@ if (Accesses.isDependencyCheckNeeded()) { DEBUG(dbgs() << "LAA: Checking memory dependencies\n"); CanVecMem = DepChecker->areDepsSafe( - DependentAccesses, Accesses.getDependenciesToCheck(), SymbolicStrides); + DependentAccesses, Accesses.getDependenciesToCheck(), + Accesses.getDependenciesListToCheck(), SymbolicStrides); MaxSafeDepDistBytes = DepChecker->getMaxSafeDepDistBytes(); if (!CanVecMem && DepChecker->shouldRetryWithRuntimeCheck()) {