diff --git a/llvm/include/llvm/ADT/EquivalenceClasses.h b/llvm/include/llvm/ADT/EquivalenceClasses.h index 4f98b84cf97d2..345107c7777b0 100644 --- a/llvm/include/llvm/ADT/EquivalenceClasses.h +++ b/llvm/include/llvm/ADT/EquivalenceClasses.h @@ -15,6 +15,7 @@ #ifndef LLVM_ADT_EQUIVALENCECLASSES_H #define LLVM_ADT_EQUIVALENCECLASSES_H +#include "llvm/ADT/iterator_range.h" #include #include #include @@ -178,6 +179,9 @@ class EquivalenceClasses { member_iterator member_end() const { return member_iterator(nullptr); } + iterator_range members(iterator I) const { + return make_range(member_begin(I), member_end()); + } /// findValue - Return an iterator to the specified value. If it does not /// exist, end() is returned. diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp index 38ee82b77a946..207f5417934e5 100644 --- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp +++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp @@ -527,9 +527,8 @@ void RuntimePointerChecking::groupChecks( // iteration order within an equivalence class member is only dependent on // the order in which unions and insertions are performed on the // equivalence class, the iteration order is deterministic. - for (auto MI = DepCands.member_begin(LeaderI), ME = DepCands.member_end(); - MI != ME; ++MI) { - auto PointerI = PositionMap.find(MI->getPointer()); + for (const auto &MI : DepCands.members(LeaderI)) { + auto PointerI = PositionMap.find(MI.getPointer()); assert(PointerI != PositionMap.end() && "pointer in equivalence class not found in PositionMap"); for (unsigned Pointer : PointerI->second) { diff --git a/llvm/lib/Analysis/VectorUtils.cpp b/llvm/lib/Analysis/VectorUtils.cpp index 91ba68fe03324..c0bc451973c6e 100644 --- a/llvm/lib/Analysis/VectorUtils.cpp +++ b/llvm/lib/Analysis/VectorUtils.cpp @@ -845,7 +845,7 @@ llvm::computeMinimumValueSizes(ArrayRef Blocks, DemandedBits &DB, for (auto I = ECs.begin(), E = ECs.end(); I != E; ++I) { uint64_t LeaderDemandedBits = 0; - for (Value *M : llvm::make_range(ECs.member_begin(I), ECs.member_end())) + for (Value *M : ECs.members(I)) LeaderDemandedBits |= DBits[M]; uint64_t MinBW = llvm::bit_width(LeaderDemandedBits); @@ -857,7 +857,7 @@ llvm::computeMinimumValueSizes(ArrayRef Blocks, DemandedBits &DB, // indvars. // If we are required to shrink a PHI, abandon this entire equivalence class. bool Abort = false; - for (Value *M : llvm::make_range(ECs.member_begin(I), ECs.member_end())) + for (Value *M : ECs.members(I)) if (isa(M) && MinBW < M->getType()->getScalarSizeInBits()) { Abort = true; break; @@ -865,7 +865,7 @@ llvm::computeMinimumValueSizes(ArrayRef Blocks, DemandedBits &DB, if (Abort) continue; - for (Value *M : llvm::make_range(ECs.member_begin(I), ECs.member_end())) { + for (Value *M : ECs.members(I)) { auto *MI = dyn_cast(M); if (!MI) continue; diff --git a/llvm/unittests/ADT/EquivalenceClassesTest.cpp b/llvm/unittests/ADT/EquivalenceClassesTest.cpp index 70e161a03d988..c24c09d8a2815 100644 --- a/llvm/unittests/ADT/EquivalenceClassesTest.cpp +++ b/llvm/unittests/ADT/EquivalenceClassesTest.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/EquivalenceClasses.h" +#include "gmock/gmock.h" #include "gtest/gtest.h" using namespace llvm; @@ -66,6 +67,19 @@ TEST(EquivalenceClassesTest, TwoSets) { EXPECT_FALSE(EqClasses.isEquivalent(i, j)); } +TEST(EquivalenceClassesTest, MembersIterator) { + EquivalenceClasses EC; + EC.unionSets(1, 2); + EC.insert(4); + EC.insert(5); + EC.unionSets(5, 1); + EXPECT_EQ(EC.getNumClasses(), 2u); + + EquivalenceClasses::iterator I = EC.findValue(EC.getLeaderValue(1)); + EXPECT_THAT(EC.members(I), testing::ElementsAre(5, 1, 2)); + EXPECT_EQ(EC.members(EC.end()).begin(), EC.member_end()); +} + // Type-parameterized tests: Run the same test cases with different element // types. template class ParameterizedTest : public testing::Test {};