Skip to content

Commit 21d973d

Browse files
authored
Reland [EquivClasses] Introduce members iterator-helper (#130319)
Changes: Fix the expectations in EquivalenceClassesTest.MemberIterator, also fixing a build failure.
1 parent dcda314 commit 21d973d

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

llvm/include/llvm/ADT/EquivalenceClasses.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef LLVM_ADT_EQUIVALENCECLASSES_H
1616
#define LLVM_ADT_EQUIVALENCECLASSES_H
1717

18+
#include "llvm/ADT/iterator_range.h"
1819
#include <cassert>
1920
#include <cstddef>
2021
#include <cstdint>
@@ -178,6 +179,9 @@ class EquivalenceClasses {
178179
member_iterator member_end() const {
179180
return member_iterator(nullptr);
180181
}
182+
iterator_range<member_iterator> members(iterator I) const {
183+
return make_range(member_begin(I), member_end());
184+
}
181185

182186
/// findValue - Return an iterator to the specified value. If it does not
183187
/// exist, end() is returned.

llvm/lib/Analysis/LoopAccessAnalysis.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -527,9 +527,8 @@ void RuntimePointerChecking::groupChecks(
527527
// iteration order within an equivalence class member is only dependent on
528528
// the order in which unions and insertions are performed on the
529529
// equivalence class, the iteration order is deterministic.
530-
for (auto MI = DepCands.member_begin(LeaderI), ME = DepCands.member_end();
531-
MI != ME; ++MI) {
532-
auto PointerI = PositionMap.find(MI->getPointer());
530+
for (const auto &MI : DepCands.members(LeaderI)) {
531+
auto PointerI = PositionMap.find(MI.getPointer());
533532
assert(PointerI != PositionMap.end() &&
534533
"pointer in equivalence class not found in PositionMap");
535534
for (unsigned Pointer : PointerI->second) {

llvm/lib/Analysis/VectorUtils.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,7 @@ llvm::computeMinimumValueSizes(ArrayRef<BasicBlock *> Blocks, DemandedBits &DB,
845845

846846
for (auto I = ECs.begin(), E = ECs.end(); I != E; ++I) {
847847
uint64_t LeaderDemandedBits = 0;
848-
for (Value *M : llvm::make_range(ECs.member_begin(I), ECs.member_end()))
848+
for (Value *M : ECs.members(I))
849849
LeaderDemandedBits |= DBits[M];
850850

851851
uint64_t MinBW = llvm::bit_width(LeaderDemandedBits);
@@ -857,15 +857,15 @@ llvm::computeMinimumValueSizes(ArrayRef<BasicBlock *> Blocks, DemandedBits &DB,
857857
// indvars.
858858
// If we are required to shrink a PHI, abandon this entire equivalence class.
859859
bool Abort = false;
860-
for (Value *M : llvm::make_range(ECs.member_begin(I), ECs.member_end()))
860+
for (Value *M : ECs.members(I))
861861
if (isa<PHINode>(M) && MinBW < M->getType()->getScalarSizeInBits()) {
862862
Abort = true;
863863
break;
864864
}
865865
if (Abort)
866866
continue;
867867

868-
for (Value *M : llvm::make_range(ECs.member_begin(I), ECs.member_end())) {
868+
for (Value *M : ECs.members(I)) {
869869
auto *MI = dyn_cast<Instruction>(M);
870870
if (!MI)
871871
continue;

llvm/unittests/ADT/EquivalenceClassesTest.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "llvm/ADT/EquivalenceClasses.h"
10+
#include "gmock/gmock.h"
1011
#include "gtest/gtest.h"
1112

1213
using namespace llvm;
@@ -66,6 +67,19 @@ TEST(EquivalenceClassesTest, TwoSets) {
6667
EXPECT_FALSE(EqClasses.isEquivalent(i, j));
6768
}
6869

70+
TEST(EquivalenceClassesTest, MembersIterator) {
71+
EquivalenceClasses<int> EC;
72+
EC.unionSets(1, 2);
73+
EC.insert(4);
74+
EC.insert(5);
75+
EC.unionSets(5, 1);
76+
EXPECT_EQ(EC.getNumClasses(), 2u);
77+
78+
EquivalenceClasses<int>::iterator I = EC.findValue(EC.getLeaderValue(1));
79+
EXPECT_THAT(EC.members(I), testing::ElementsAre(5, 1, 2));
80+
EXPECT_EQ(EC.members(EC.end()).begin(), EC.member_end());
81+
}
82+
6983
// Type-parameterized tests: Run the same test cases with different element
7084
// types.
7185
template <typename T> class ParameterizedTest : public testing::Test {};

0 commit comments

Comments
 (0)