Index: include/llvm/ADT/GraphTraits.h =================================================================== --- include/llvm/ADT/GraphTraits.h +++ include/llvm/ADT/GraphTraits.h @@ -34,7 +34,8 @@ // // typedef NodeType - Type of Node in the graph // typedef NodeRef - NodeType * - // typedef ChildIteratorType - Type used to iterate over children in graph + // typedef ChildIteratorType - Type used to iterate over children in graph, + // dereference to a NodeRef // static NodeRef getEntryNode(const GraphType &) // Return the entry node of the graph @@ -45,7 +46,7 @@ // node list for the specified node. // - // typedef ...iterator nodes_iterator; + // typedef ...iterator nodes_iterator; - dereference to a NodeRef // static nodes_iterator nodes_begin(GraphType *G) // static nodes_iterator nodes_end (GraphType *G) // nodes_iterator/begin/end - Allow iteration over all nodes in the graph Index: include/llvm/Analysis/BlockFrequencyInfoImpl.h =================================================================== --- include/llvm/Analysis/BlockFrequencyInfoImpl.h +++ include/llvm/Analysis/BlockFrequencyInfoImpl.h @@ -1271,7 +1271,7 @@ for (NodeIter I = GTraits::nodes_begin(Graph), E = GTraits::nodes_end(Graph); I != E; ++I) { - NodeRef N = &*I; + NodeRef N = *I; MaxFrequency = std::max(MaxFrequency, Graph->getBlockFreq(N).getFrequency()); } Index: include/llvm/Analysis/CallGraph.h =================================================================== --- include/llvm/Analysis/CallGraph.h +++ include/llvm/Analysis/CallGraph.h @@ -460,7 +460,7 @@ } typedef std::pair> PairTy; - typedef std::pointer_to_unary_function + typedef std::pointer_to_unary_function DerefFun; // nodes_iterator/begin/end - Allow iteration over all nodes in the graph @@ -472,7 +472,7 @@ return map_iterator(CG->end(), DerefFun(CGdereference)); } - static CallGraphNode &CGdereference(const PairTy &P) { return *P.second; } + static CallGraphNode *CGdereference(const PairTy &P) { return P.second.get(); } }; template <> @@ -483,7 +483,7 @@ } typedef std::pair> PairTy; - typedef std::pointer_to_unary_function + typedef std::pointer_to_unary_function DerefFun; // nodes_iterator/begin/end - Allow iteration over all nodes in the graph @@ -495,8 +495,8 @@ return map_iterator(CG->end(), DerefFun(CGdereference)); } - static const CallGraphNode &CGdereference(const PairTy &P) { - return *P.second; + static const CallGraphNode *CGdereference(const PairTy &P) { + return P.second.get(); } }; Index: include/llvm/CodeGen/MachineFunction.h =================================================================== --- include/llvm/CodeGen/MachineFunction.h +++ include/llvm/CodeGen/MachineFunction.h @@ -625,9 +625,13 @@ } // nodes_iterator/begin/end - Allow iteration over all nodes in the graph - typedef MachineFunction::iterator nodes_iterator; - static nodes_iterator nodes_begin(MachineFunction *F) { return F->begin(); } - static nodes_iterator nodes_end (MachineFunction *F) { return F->end(); } + typedef pointer_iterator nodes_iterator; + static nodes_iterator nodes_begin(MachineFunction *F) { + return nodes_iterator(F->begin()); + } + static nodes_iterator nodes_end(MachineFunction *F) { + return nodes_iterator(F->end()); + } static unsigned size (MachineFunction *F) { return F->size(); } }; template <> struct GraphTraits : @@ -637,12 +641,12 @@ } // nodes_iterator/begin/end - Allow iteration over all nodes in the graph - typedef MachineFunction::const_iterator nodes_iterator; + typedef pointer_iterator nodes_iterator; static nodes_iterator nodes_begin(const MachineFunction *F) { - return F->begin(); + return nodes_iterator(F->begin()); } static nodes_iterator nodes_end (const MachineFunction *F) { - return F->end(); + return nodes_iterator(F->end()); } static unsigned size (const MachineFunction *F) { return F->size(); Index: include/llvm/CodeGen/ScheduleDAG.h =================================================================== --- include/llvm/CodeGen/ScheduleDAG.h +++ include/llvm/CodeGen/ScheduleDAG.h @@ -692,12 +692,12 @@ }; template <> struct GraphTraits : public GraphTraits { - typedef std::vector::iterator nodes_iterator; + typedef pointer_iterator::iterator> nodes_iterator; static nodes_iterator nodes_begin(ScheduleDAG *G) { - return G->SUnits.begin(); + return nodes_iterator(G->SUnits.begin()); } static nodes_iterator nodes_end(ScheduleDAG *G) { - return G->SUnits.end(); + return nodes_iterator(G->SUnits.end()); } }; Index: include/llvm/CodeGen/SelectionDAG.h =================================================================== --- include/llvm/CodeGen/SelectionDAG.h +++ include/llvm/CodeGen/SelectionDAG.h @@ -1416,12 +1416,12 @@ }; template <> struct GraphTraits : public GraphTraits { - typedef SelectionDAG::allnodes_iterator nodes_iterator; + typedef pointer_iterator nodes_iterator; static nodes_iterator nodes_begin(SelectionDAG *G) { - return G->allnodes_begin(); + return nodes_iterator(G->allnodes_begin()); } static nodes_iterator nodes_end(SelectionDAG *G) { - return G->allnodes_end(); + return nodes_iterator(G->allnodes_end()); } }; Index: include/llvm/IR/CFG.h =================================================================== --- include/llvm/IR/CFG.h +++ include/llvm/IR/CFG.h @@ -229,9 +229,13 @@ static NodeType *getEntryNode(Function *F) { return &F->getEntryBlock(); } // nodes_iterator/begin/end - Allow iteration over all nodes in the graph - typedef Function::iterator nodes_iterator; - static nodes_iterator nodes_begin(Function *F) { return F->begin(); } - static nodes_iterator nodes_end (Function *F) { return F->end(); } + typedef pointer_iterator nodes_iterator; + static nodes_iterator nodes_begin(Function *F) { + return nodes_iterator(F->begin()); + } + static nodes_iterator nodes_end(Function *F) { + return nodes_iterator(F->end()); + } static size_t size (Function *F) { return F->size(); } }; template <> struct GraphTraits : @@ -239,9 +243,13 @@ static NodeType *getEntryNode(const Function *F) {return &F->getEntryBlock();} // nodes_iterator/begin/end - Allow iteration over all nodes in the graph - typedef Function::const_iterator nodes_iterator; - static nodes_iterator nodes_begin(const Function *F) { return F->begin(); } - static nodes_iterator nodes_end (const Function *F) { return F->end(); } + typedef pointer_iterator nodes_iterator; + static nodes_iterator nodes_begin(const Function *F) { + return nodes_iterator(F->begin()); + } + static nodes_iterator nodes_end(const Function *F) { + return nodes_iterator(F->end()); + } static size_t size (const Function *F) { return F->size(); } }; Index: include/llvm/Support/GenericDomTree.h =================================================================== --- include/llvm/Support/GenericDomTree.h +++ include/llvm/Support/GenericDomTree.h @@ -750,8 +750,8 @@ for (typename TraitsTy::nodes_iterator I = TraitsTy::nodes_begin(&F), E = TraitsTy::nodes_end(&F); I != E; ++I) - if (TraitsTy::child_begin(&*I) == TraitsTy::child_end(&*I)) - addRoot(&*I); + if (TraitsTy::child_begin(*I) == TraitsTy::child_end(*I)) + addRoot(*I); Calculate>(*this, F); } Index: include/llvm/Support/GraphWriter.h =================================================================== --- include/llvm/Support/GraphWriter.h +++ include/llvm/Support/GraphWriter.h @@ -145,22 +145,14 @@ // Loop over the graph, printing it out... for (node_iterator I = GTraits::nodes_begin(G), E = GTraits::nodes_end(G); I != E; ++I) - if (!isNodeHidden(&*I)) - writeNode(&*I); - } - - bool isNodeHidden(NodeRef const *Node) { - return isNodeHidden(*Node); + if (!isNodeHidden(*I)) + writeNode(*I); } bool isNodeHidden(NodeRef Node) { return DTraits.isNodeHidden(Node); } - void writeNode(NodeRef const *Node) { - writeNode(*Node); - } - void writeNode(NodeRef Node) { std::string NodeAttributes = DTraits.getNodeAttributes(Node, G); Index: lib/Analysis/BlockFrequencyInfo.cpp =================================================================== --- lib/Analysis/BlockFrequencyInfo.cpp +++ lib/Analysis/BlockFrequencyInfo.cpp @@ -63,7 +63,7 @@ typedef const BasicBlock NodeType; typedef const BasicBlock *NodeRef; typedef succ_const_iterator ChildIteratorType; - typedef Function::const_iterator nodes_iterator; + typedef pointer_iterator nodes_iterator; static inline const NodeType *getEntryNode(const BlockFrequencyInfo *G) { return &G->getFunction()->front(); @@ -75,10 +75,10 @@ return succ_end(N); } static nodes_iterator nodes_begin(const BlockFrequencyInfo *G) { - return G->getFunction()->begin(); + return nodes_iterator(G->getFunction()->begin()); } static nodes_iterator nodes_end(const BlockFrequencyInfo *G) { - return G->getFunction()->end(); + return nodes_iterator(G->getFunction()->end()); } }; Index: lib/CodeGen/MachineBlockFrequencyInfo.cpp =================================================================== --- lib/CodeGen/MachineBlockFrequencyInfo.cpp +++ lib/CodeGen/MachineBlockFrequencyInfo.cpp @@ -55,7 +55,7 @@ typedef const MachineBasicBlock NodeType; typedef const MachineBasicBlock *NodeRef; typedef MachineBasicBlock::const_succ_iterator ChildIteratorType; - typedef MachineFunction::const_iterator nodes_iterator; + typedef pointer_iterator nodes_iterator; static inline const NodeType * getEntryNode(const MachineBlockFrequencyInfo *G) { @@ -71,11 +71,11 @@ } static nodes_iterator nodes_begin(const MachineBlockFrequencyInfo *G) { - return G->getFunction()->begin(); + return nodes_iterator(G->getFunction()->begin()); } static nodes_iterator nodes_end(const MachineBlockFrequencyInfo *G) { - return G->getFunction()->end(); + return nodes_iterator(G->getFunction()->end()); } }; Index: lib/Target/AMDGPU/AMDILCFGStructurizer.cpp =================================================================== --- lib/Target/AMDGPU/AMDILCFGStructurizer.cpp +++ lib/Target/AMDGPU/AMDILCFGStructurizer.cpp @@ -840,7 +840,7 @@ } //while, "one iteration" over the function. MachineBasicBlock *EntryMBB = - &*GraphTraits::nodes_begin(FuncRep); + *GraphTraits::nodes_begin(FuncRep); if (EntryMBB->succ_size() == 0) { Finish = true; DEBUG( @@ -863,7 +863,7 @@ } while (!Finish && MakeProgress); // Misc wrap up to maintain the consistency of the Function representation. - wrapup(&*GraphTraits::nodes_begin(FuncRep)); + wrapup(*GraphTraits::nodes_begin(FuncRep)); // Detach retired Block, release memory. for (MBBInfoMap::iterator It = BlockInfoMap.begin(), E = BlockInfoMap.end(); @@ -907,9 +907,9 @@ //walk through all the block in func to check for unreachable typedef GraphTraits GTM; - MachineFunction::iterator It = GTM::nodes_begin(MF), E = GTM::nodes_end(MF); + auto It = GTM::nodes_begin(MF), E = GTM::nodes_end(MF); for (; It != E; ++It) { - MachineBasicBlock *MBB = &(*It); + MachineBasicBlock *MBB = *It; SccNum = getSCCNum(MBB); if (SccNum == INVALIDSCCNUM) dbgs() << "unreachable block BB" << MBB->getNumber() << "\n"; Index: lib/Transforms/Scalar/NaryReassociate.cpp =================================================================== --- lib/Transforms/Scalar/NaryReassociate.cpp +++ lib/Transforms/Scalar/NaryReassociate.cpp @@ -211,7 +211,7 @@ // ensures that all bases of a candidate are in Candidates when we process it. for (auto Node = GraphTraits::nodes_begin(DT); Node != GraphTraits::nodes_end(DT); ++Node) { - BasicBlock *BB = Node->getBlock(); + BasicBlock *BB = (*Node)->getBlock(); for (auto I = BB->begin(); I != BB->end(); ++I) { if (SE->isSCEVable(I->getType()) && isPotentiallyNaryReassociable(&*I)) { const SCEV *OldSCEV = SE->getSCEV(&*I); Index: lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp =================================================================== --- lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp +++ lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp @@ -1152,7 +1152,7 @@ DominatingExprs.clear(); for (auto Node = GraphTraits::nodes_begin(DT); Node != GraphTraits::nodes_end(DT); ++Node) { - BasicBlock *BB = Node->getBlock(); + BasicBlock *BB = (*Node)->getBlock(); for (auto I = BB->begin(); I != BB->end(); ) { Instruction *Cur = &*I++; Changed |= reuniteExts(Cur); Index: lib/Transforms/Scalar/StraightLineStrengthReduce.cpp =================================================================== --- lib/Transforms/Scalar/StraightLineStrengthReduce.cpp +++ lib/Transforms/Scalar/StraightLineStrengthReduce.cpp @@ -676,7 +676,7 @@ // all bases of a candidate are in Candidates when we process it. for (auto node = GraphTraits::nodes_begin(DT); node != GraphTraits::nodes_end(DT); ++node) { - for (auto &I : *node->getBlock()) + for (auto &I : *(*node)->getBlock()) allocateCandidatesAndFindBasis(&I); } Index: unittests/Analysis/CallGraphTest.cpp =================================================================== --- unittests/Analysis/CallGraphTest.cpp +++ unittests/Analysis/CallGraphTest.cpp @@ -24,11 +24,11 @@ auto X = ++I; // Should be able to iterate over all nodes of the graph. - static_assert(std::is_same::value, + static_assert(std::is_same::value, "Node type does not match"); - static_assert(std::is_same::value, + static_assert(std::is_same::value, "Node type does not match"); - static_assert(std::is_same::value, + static_assert(std::is_same::value, "Node type does not match"); NodeTy *N = GraphTraits::getEntryNode(G);