[llvm] r278752 - [ADT] Change PostOrderIterator to use NodeRef. NFC.
Tim Shen via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 15 14:52:55 PDT 2016
Author: timshen
Date: Mon Aug 15 16:52:54 2016
New Revision: 278752
URL: http://llvm.org/viewvc/llvm-project?rev=278752&view=rev
Log:
[ADT] Change PostOrderIterator to use NodeRef. NFC.
Reviewers: dblaikie
Subscribers: mzolotukhin, llvm-commits
Differential Revision: https://reviews.llvm.org/D23522
Modified:
llvm/trunk/include/llvm/ADT/PostOrderIterator.h
llvm/trunk/include/llvm/Analysis/LoopIterator.h
llvm/trunk/include/llvm/IR/Type.h
llvm/trunk/lib/CodeGen/MachineTraceMetrics.cpp
llvm/trunk/unittests/ADT/PostOrderIteratorTest.cpp
Modified: llvm/trunk/include/llvm/ADT/PostOrderIterator.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/PostOrderIterator.h?rev=278752&r1=278751&r2=278752&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/PostOrderIterator.h (original)
+++ llvm/trunk/include/llvm/ADT/PostOrderIterator.h Mon Aug 15 16:52:54 2016
@@ -19,6 +19,7 @@
#include "llvm/ADT/GraphTraits.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/iterator_range.h"
+#include "llvm/ADT/Optional.h"
#include <set>
#include <vector>
@@ -56,14 +57,13 @@ class po_iterator_storage {
SetType Visited;
public:
// Return true if edge destination should be visited.
- template<typename NodeType>
- bool insertEdge(NodeType *From, NodeType *To) {
+ template <typename NodeRef>
+ bool insertEdge(Optional<NodeRef> From, NodeRef To) {
return Visited.insert(To).second;
}
// Called after all children of BB have been visited.
- template<typename NodeType>
- void finishPostorder(NodeType *BB) {}
+ template <typename NodeRef> void finishPostorder(NodeRef BB) {}
};
/// Specialization of po_iterator_storage that references an external set.
@@ -77,51 +77,49 @@ public:
// Return true if edge destination should be visited, called with From = 0 for
// the root node.
// Graph edges can be pruned by specializing this function.
- template <class NodeType> bool insertEdge(NodeType *From, NodeType *To) {
+ template <class NodeRef> bool insertEdge(Optional<NodeRef> From, NodeRef To) {
return Visited.insert(To).second;
}
// Called after all children of BB have been visited.
- template<class NodeType>
- void finishPostorder(NodeType *BB) {}
+ template <class NodeRef> void finishPostorder(NodeRef BB) {}
};
-template<class GraphT,
- class SetType = llvm::SmallPtrSet<typename GraphTraits<GraphT>::NodeType*, 8>,
- bool ExtStorage = false,
- class GT = GraphTraits<GraphT> >
-class po_iterator : public std::iterator<std::forward_iterator_tag,
- typename GT::NodeType, ptrdiff_t>,
- public po_iterator_storage<SetType, ExtStorage> {
- typedef std::iterator<std::forward_iterator_tag,
- typename GT::NodeType, ptrdiff_t> super;
- typedef typename GT::NodeType NodeType;
+template <class GraphT,
+ class SetType =
+ llvm::SmallPtrSet<typename GraphTraits<GraphT>::NodeRef, 8>,
+ bool ExtStorage = false, class GT = GraphTraits<GraphT>>
+class po_iterator
+ : public std::iterator<std::forward_iterator_tag, typename GT::NodeRef>,
+ public po_iterator_storage<SetType, ExtStorage> {
+ typedef std::iterator<std::forward_iterator_tag, typename GT::NodeRef> super;
+ typedef typename GT::NodeRef NodeRef;
typedef typename GT::ChildIteratorType ChildItTy;
// VisitStack - Used to maintain the ordering. Top = current block
// First element is basic block pointer, second is the 'next child' to visit
- std::vector<std::pair<NodeType *, ChildItTy> > VisitStack;
+ std::vector<std::pair<NodeRef, ChildItTy>> VisitStack;
void traverseChild() {
while (VisitStack.back().second != GT::child_end(VisitStack.back().first)) {
- NodeType *BB = *VisitStack.back().second++;
- if (this->insertEdge(VisitStack.back().first, BB)) {
+ NodeRef BB = *VisitStack.back().second++;
+ if (this->insertEdge(Optional<NodeRef>(VisitStack.back().first), BB)) {
// If the block is not visited...
VisitStack.push_back(std::make_pair(BB, GT::child_begin(BB)));
}
}
}
- po_iterator(NodeType *BB) {
- this->insertEdge((NodeType*)nullptr, BB);
+ po_iterator(NodeRef BB) {
+ this->insertEdge(Optional<NodeRef>(), BB);
VisitStack.push_back(std::make_pair(BB, GT::child_begin(BB)));
traverseChild();
}
po_iterator() {} // End is when stack is empty.
- po_iterator(NodeType *BB, SetType &S)
+ po_iterator(NodeRef BB, SetType &S)
: po_iterator_storage<SetType, ExtStorage>(S) {
- if (this->insertEdge((NodeType*)nullptr, BB)) {
+ if (this->insertEdge(Optional<NodeRef>(), BB)) {
VisitStack.push_back(std::make_pair(BB, GT::child_begin(BB)));
traverseChild();
}
@@ -149,13 +147,13 @@ public:
}
bool operator!=(const po_iterator &x) const { return !(*this == x); }
- pointer operator*() const { return VisitStack.back().first; }
+ const NodeRef &operator*() const { return VisitStack.back().first; }
// This is a nonstandard operator-> that dereferences the pointer an extra
// time... so that you can actually call methods ON the BasicBlock, because
// the contained type is a pointer. This allows BBIt->getTerminator() f.e.
//
- NodeType *operator->() const { return **this; }
+ NodeRef operator->() const { return **this; }
po_iterator &operator++() { // Preincrement
this->finishPostorder(VisitStack.back().first);
@@ -184,7 +182,7 @@ template <class T> iterator_range<po_ite
}
// Provide global definitions of external postorder iterators...
-template<class T, class SetType=std::set<typename GraphTraits<T>::NodeType*> >
+template <class T, class SetType = std::set<typename GraphTraits<T>::NodeRef>>
struct po_ext_iterator : public po_iterator<T, SetType, true> {
po_ext_iterator(const po_iterator<T, SetType, true> &V) :
po_iterator<T, SetType, true>(V) {}
@@ -206,10 +204,9 @@ iterator_range<po_ext_iterator<T, SetTyp
}
// Provide global definitions of inverse post order iterators...
-template <class T,
- class SetType = std::set<typename GraphTraits<T>::NodeType*>,
+template <class T, class SetType = std::set<typename GraphTraits<T>::NodeRef>,
bool External = false>
-struct ipo_iterator : public po_iterator<Inverse<T>, SetType, External > {
+struct ipo_iterator : public po_iterator<Inverse<T>, SetType, External> {
ipo_iterator(const po_iterator<Inverse<T>, SetType, External> &V) :
po_iterator<Inverse<T>, SetType, External> (V) {}
};
@@ -230,8 +227,7 @@ iterator_range<ipo_iterator<T>> inverse_
}
// Provide global definitions of external inverse postorder iterators...
-template <class T,
- class SetType = std::set<typename GraphTraits<T>::NodeType*> >
+template <class T, class SetType = std::set<typename GraphTraits<T>::NodeRef>>
struct ipo_ext_iterator : public ipo_iterator<T, SetType, true> {
ipo_ext_iterator(const ipo_iterator<T, SetType, true> &V) :
ipo_iterator<T, SetType, true>(V) {}
@@ -280,13 +276,13 @@ inverse_post_order_ext(const T &G, SetTy
template<class GraphT, class GT = GraphTraits<GraphT> >
class ReversePostOrderTraversal {
- typedef typename GT::NodeType NodeType;
- std::vector<NodeType*> Blocks; // Block list in normal PO order
- void Initialize(NodeType *BB) {
+ typedef typename GT::NodeRef NodeRef;
+ std::vector<NodeRef> Blocks; // Block list in normal PO order
+ void Initialize(NodeRef BB) {
std::copy(po_begin(BB), po_end(BB), std::back_inserter(Blocks));
}
public:
- typedef typename std::vector<NodeType*>::reverse_iterator rpo_iterator;
+ typedef typename std::vector<NodeRef>::reverse_iterator rpo_iterator;
ReversePostOrderTraversal(GraphT G) { Initialize(GT::getEntryNode(G)); }
Modified: llvm/trunk/include/llvm/Analysis/LoopIterator.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopIterator.h?rev=278752&r1=278751&r2=278752&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/LoopIterator.h (original)
+++ llvm/trunk/include/llvm/Analysis/LoopIterator.h Mon Aug 15 16:52:54 2016
@@ -114,7 +114,7 @@ template<> class po_iterator_storage<Loo
public:
po_iterator_storage(LoopBlocksTraversal &lbs) : LBT(lbs) {}
// These functions are defined below.
- bool insertEdge(BasicBlock *From, BasicBlock *To);
+ bool insertEdge(Optional<BasicBlock *> From, BasicBlock *To);
void finishPostorder(BasicBlock *BB);
};
@@ -166,8 +166,8 @@ public:
}
};
-inline bool po_iterator_storage<LoopBlocksTraversal, true>::
-insertEdge(BasicBlock *From, BasicBlock *To) {
+inline bool po_iterator_storage<LoopBlocksTraversal, true>::insertEdge(
+ Optional<BasicBlock *> From, BasicBlock *To) {
return LBT.visitPreorder(To);
}
Modified: llvm/trunk/include/llvm/IR/Type.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Type.h?rev=278752&r1=278751&r2=278752&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Type.h (original)
+++ llvm/trunk/include/llvm/IR/Type.h Mon Aug 15 16:52:54 2016
@@ -430,6 +430,7 @@ template <> struct isa_impl<PointerType,
template <> struct GraphTraits<Type *> {
typedef Type NodeType;
+ typedef Type *NodeRef;
typedef Type::subtype_iterator ChildIteratorType;
static inline NodeType *getEntryNode(Type *T) { return T; }
@@ -443,6 +444,7 @@ template <> struct GraphTraits<Type *> {
template <> struct GraphTraits<const Type*> {
typedef const Type NodeType;
+ typedef const Type *NodeRef;
typedef Type::subtype_iterator ChildIteratorType;
static inline NodeType *getEntryNode(NodeType *T) { return T; }
Modified: llvm/trunk/lib/CodeGen/MachineTraceMetrics.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineTraceMetrics.cpp?rev=278752&r1=278751&r2=278752&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineTraceMetrics.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineTraceMetrics.cpp Mon Aug 15 16:52:54 2016
@@ -430,16 +430,17 @@ public:
po_iterator_storage(LoopBounds &lb) : LB(lb) {}
void finishPostorder(const MachineBasicBlock*) {}
- bool insertEdge(const MachineBasicBlock *From, const MachineBasicBlock *To) {
+ bool insertEdge(Optional<const MachineBasicBlock *> From,
+ const MachineBasicBlock *To) {
// Skip already visited To blocks.
MachineTraceMetrics::TraceBlockInfo &TBI = LB.Blocks[To->getNumber()];
if (LB.Downward ? TBI.hasValidHeight() : TBI.hasValidDepth())
return false;
// From is null once when To is the trace center block.
if (From) {
- if (const MachineLoop *FromLoop = LB.Loops->getLoopFor(From)) {
+ if (const MachineLoop *FromLoop = LB.Loops->getLoopFor(*From)) {
// Don't follow backedges, don't leave FromLoop when going upwards.
- if ((LB.Downward ? To : From) == FromLoop->getHeader())
+ if ((LB.Downward ? To : *From) == FromLoop->getHeader())
return false;
// Don't leave FromLoop.
if (isExitingLoop(FromLoop, LB.Loops->getLoopFor(To)))
Modified: llvm/trunk/unittests/ADT/PostOrderIteratorTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/PostOrderIteratorTest.cpp?rev=278752&r1=278751&r2=278752&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/PostOrderIteratorTest.cpp (original)
+++ llvm/trunk/unittests/ADT/PostOrderIteratorTest.cpp Mon Aug 15 16:52:54 2016
@@ -21,17 +21,17 @@ TEST(PostOrderIteratorTest, Compiles) {
// Tests that template specializations are kept up to date
void *Null = nullptr;
po_iterator_storage<std::set<void *>, false> PIS;
- PIS.insertEdge(Null, Null);
+ PIS.insertEdge(Optional<void *>(), Null);
ExtSetTy Ext;
po_iterator_storage<ExtSetTy, true> PISExt(Ext);
- PIS.insertEdge(Null, Null);
+ PIS.insertEdge(Optional<void *>(), Null);
// Test above, but going through po_iterator (which inherits from template
// base)
BasicBlock *NullBB = nullptr;
auto PI = po_end(NullBB);
- PI.insertEdge(NullBB, NullBB);
+ PI.insertEdge(Optional<BasicBlock *>(), NullBB);
auto PIExt = po_ext_end(NullBB, Ext);
- PIExt.insertEdge(NullBB, NullBB);
+ PIExt.insertEdge(Optional<BasicBlock *>(), NullBB);
}
}
More information about the llvm-commits
mailing list