void HexagonCommonGEP::getBlockTraversalOrder(BasicBlock *Root, ValueVect &Order) { // Compute block ordering for a typical DT-based traversal of the flow // graph: "before visiting a block, all of its dominators must have been // visited". Order.push_back(Root); for (auto *DTN : children<DomTreeNode*>(DT->getNode(Root))) getBlockTraversalOrder(DTN->getBlock(), Order); }
void HexagonCommonGEP::collect() { // Establish depth-first traversal order of the dominator tree. ValueVect BO; getBlockTraversalOrder(&Fn->front(), BO); // The creation of gep nodes requires DT-traversal. When processing a GEP // instruction that uses another GEP instruction as the base pointer, the // gep node for the base pointer should already exist. ValueToNodeMap NM; for (ValueVect::iterator I = BO.begin(), E = BO.end(); I != E; ++I) { BasicBlock *B = cast<BasicBlock>(*I); for (BasicBlock::iterator J = B->begin(), F = B->end(); J != F; ++J) { if (!isa<GetElementPtrInst>(J)) continue; GetElementPtrInst *GepI = cast<GetElementPtrInst>(J); if (isHandledGepForm(GepI)) processGepInst(GepI, NM); } } LLVM_DEBUG(dbgs() << "Gep nodes after initial collection:\n" << Nodes); }
void HexagonCommonGEP::getBlockTraversalOrder(BasicBlock *Root, ValueVect &Order) { // Compute block ordering for a typical DT-based traversal of the flow // graph: "before visiting a block, all of its dominators must have been // visited". Order.push_back(Root); DomTreeNode *DTN = DT->getNode(Root); typedef GraphTraits<DomTreeNode*> GTN; typedef GTN::ChildIteratorType Iter; for (Iter I = GTN::child_begin(DTN), E = GTN::child_end(DTN); I != E; ++I) getBlockTraversalOrder((*I)->getBlock(), Order); }