diff options
author | Vedant Kumar <vsk@apple.com> | 2018-05-16 23:20:42 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2018-05-16 23:20:42 +0000 |
commit | 5a0872c2b751fd339e10c1b9d29ed4a9e62a323d (patch) | |
tree | 60578e1838b47b5da4279a36a8c17be782946192 | |
parent | ae83159530f2657d35bc2543065e23256489d7ea (diff) | |
download | bcm5719-llvm-5a0872c2b751fd339e10c1b9d29ed4a9e62a323d.tar.gz bcm5719-llvm-5a0872c2b751fd339e10c1b9d29ed4a9e62a323d.zip |
[STLExtras] Add size() for ranges, and remove distance()
r332057 introduced distance() for ranges. Based on post-commit feedback,
this renames distance() to size(). The new size() is also only enabled
when the operation is O(1).
Differential Revision: https://reviews.llvm.org/D46976
llvm-svn: 332551
-rw-r--r-- | llvm/include/llvm/ADT/STLExtras.h | 9 | ||||
-rw-r--r-- | llvm/lib/Analysis/LazyCallGraph.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/CodeGen/ImplicitNullChecks.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/IR/Value.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/GVNHoist.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp | 3 | ||||
-rw-r--r-- | llvm/unittests/ADT/IteratorTest.cpp | 4 | ||||
-rw-r--r-- | llvm/unittests/IR/BasicBlockTest.cpp | 7 |
8 files changed, 23 insertions, 14 deletions
diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index e62d3691903..bc47ff08373 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -1026,9 +1026,14 @@ void erase_if(Container &C, UnaryPredicate P) { C.erase(remove_if(C, P), C.end()); } -/// Wrapper function around std::distance which works with ranges. +/// Get the size of a range. This is a wrapper function around std::distance +/// which is only enabled when the operation is O(1). template <typename R> -auto distance(R &&Range) +auto size(R &&Range, typename std::enable_if< + std::is_same<typename std::iterator_traits<decltype( + Range.begin())>::iterator_category, + std::random_access_iterator_tag>::value, + void>::type * = nullptr) -> decltype(std::distance(Range.begin(), Range.end())) { return std::distance(Range.begin(), Range.end()); } diff --git a/llvm/lib/Analysis/LazyCallGraph.cpp b/llvm/lib/Analysis/LazyCallGraph.cpp index c001f55bb62..b1d585bfc68 100644 --- a/llvm/lib/Analysis/LazyCallGraph.cpp +++ b/llvm/lib/Analysis/LazyCallGraph.cpp @@ -1273,7 +1273,7 @@ LazyCallGraph::RefSCC::removeInternalRefEdge(Node &SourceN, // the removal hasn't changed the structure at all. This is an important // special case and we can directly exit the entire routine more // efficiently as soon as we discover it. - if (distance(RefSCCNodes) == NumRefSCCNodes) { + if (llvm::size(RefSCCNodes) == NumRefSCCNodes) { // Clear out the low link field as we won't need it. for (Node *N : RefSCCNodes) N->LowLink = -1; @@ -1739,7 +1739,7 @@ static void printNode(raw_ostream &OS, LazyCallGraph::Node &N) { } static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &C) { - ptrdiff_t Size = distance(C); + ptrdiff_t Size = size(C); OS << " SCC with " << Size << " functions:\n"; for (LazyCallGraph::Node &N : C) @@ -1747,7 +1747,7 @@ static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &C) { } static void printRefSCC(raw_ostream &OS, LazyCallGraph::RefSCC &C) { - ptrdiff_t Size = distance(C); + ptrdiff_t Size = size(C); OS << " RefSCC with " << Size << " call SCCs:\n"; for (LazyCallGraph::SCC &InnerC : C) diff --git a/llvm/lib/CodeGen/ImplicitNullChecks.cpp b/llvm/lib/CodeGen/ImplicitNullChecks.cpp index 285f746875e..98c3039863e 100644 --- a/llvm/lib/CodeGen/ImplicitNullChecks.cpp +++ b/llvm/lib/CodeGen/ImplicitNullChecks.cpp @@ -597,7 +597,7 @@ MachineInstr *ImplicitNullChecks::insertFaultingInstr( unsigned DefReg = NoRegister; if (NumDefs != 0) { DefReg = MI->defs().begin()->getReg(); - assert(distance(MI->defs()) == 1 && "expected exactly one def!"); + assert(NumDefs == 1 && "expected exactly one def!"); } FaultMaps::FaultKind FK; diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index bdcc657abe6..2f95e9348b4 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -167,7 +167,9 @@ bool Value::isUsedInBasicBlock(const BasicBlock *BB) const { return false; } -unsigned Value::getNumUses() const { return (unsigned)distance(uses()); } +unsigned Value::getNumUses() const { + return (unsigned)std::distance(use_begin(), use_end()); +} static bool getSymTab(Value *V, ValueSymbolTable *&ST) { ST = nullptr; diff --git a/llvm/lib/Transforms/Scalar/GVNHoist.cpp b/llvm/lib/Transforms/Scalar/GVNHoist.cpp index 6994d964a9e..c35f0fdf683 100644 --- a/llvm/lib/Transforms/Scalar/GVNHoist.cpp +++ b/llvm/lib/Transforms/Scalar/GVNHoist.cpp @@ -578,7 +578,7 @@ private: // Returns true when the values are flowing out to each edge. bool valueAnticipable(CHIArgs C, TerminatorInst *TI) const { - if (TI->getNumSuccessors() > (unsigned)distance(C)) + if (TI->getNumSuccessors() > (unsigned)size(C)) return false; // Not enough args in this CHI. for (auto CHI : C) { diff --git a/llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp b/llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp index 72ab175deca..3464b759280 100644 --- a/llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp +++ b/llvm/lib/Transforms/Scalar/MergedLoadStoreMotion.cpp @@ -285,7 +285,8 @@ bool MergedLoadStoreMotion::mergeStores(BasicBlock *T) { return false; // No. More than 2 predecessors. // #Instructions in Succ1 for Compile Time Control - int Size1 = distance(Pred1->instructionsWithoutDebug()); + auto InstsNoDbg = Pred1->instructionsWithoutDebug(); + int Size1 = std::distance(InstsNoDbg.begin(), InstsNoDbg.end()); int NStores = 0; for (BasicBlock::reverse_iterator RBI = Pred0->rbegin(), RBE = Pred0->rend(); diff --git a/llvm/unittests/ADT/IteratorTest.cpp b/llvm/unittests/ADT/IteratorTest.cpp index 69033bbf593..341049a6847 100644 --- a/llvm/unittests/ADT/IteratorTest.cpp +++ b/llvm/unittests/ADT/IteratorTest.cpp @@ -369,8 +369,8 @@ TEST(RangeTest, Distance) { std::vector<int> v1; std::vector<int> v2{1, 2, 3}; - EXPECT_EQ(std::distance(v1.begin(), v1.end()), distance(v1)); - EXPECT_EQ(std::distance(v2.begin(), v2.end()), distance(v2)); + EXPECT_EQ(std::distance(v1.begin(), v1.end()), size(v1)); + EXPECT_EQ(std::distance(v2.begin(), v2.end()), size(v2)); } } // anonymous namespace diff --git a/llvm/unittests/IR/BasicBlockTest.cpp b/llvm/unittests/IR/BasicBlockTest.cpp index bdb2b8751ee..07ed997f638 100644 --- a/llvm/unittests/IR/BasicBlockTest.cpp +++ b/llvm/unittests/IR/BasicBlockTest.cpp @@ -73,9 +73,9 @@ TEST(BasicBlockTest, PhiRange) { auto isPhi = [](Instruction &I) { return isa<PHINode>(&I); }; auto Phis = make_filter_range(*BB, isPhi); auto ReversedPhis = reverse(make_filter_range(*BB, isPhi)); - EXPECT_EQ(distance(Phis), 3); + EXPECT_EQ(std::distance(Phis.begin(), Phis.end()), 3); EXPECT_EQ(&*Phis.begin(), P1); - EXPECT_EQ(distance(ReversedPhis), 3); + EXPECT_EQ(std::distance(ReversedPhis.begin(), ReversedPhis.end()), 3); EXPECT_EQ(&*ReversedPhis.begin(), P3); // And iterate a const range. @@ -87,7 +87,8 @@ TEST(BasicBlockTest, PhiRange) { } #define CHECK_ITERATORS(Range1, Range2) \ - EXPECT_EQ(distance(Range1), distance(Range2)); \ + EXPECT_EQ(std::distance(Range1.begin(), Range1.end()), \ + std::distance(Range2.begin(), Range2.end())); \ for (auto Pair : zip(Range1, Range2)) \ EXPECT_EQ(&std::get<0>(Pair), std::get<1>(Pair)); |