void ControlDependenceGraphBase::computeDependencies(Function &F, PostDominatorTree &pdt) { root = new ControlDependenceNode(); nodes.insert(root); for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { ControlDependenceNode *bn = new ControlDependenceNode(BB); nodes.insert(bn); bbMap[BB] = bn; } for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { BasicBlock *A = BB; ControlDependenceNode *AN = bbMap[A]; for (succ_iterator succ = succ_begin(A), end = succ_end(A); succ != end; ++succ) { BasicBlock *B = *succ; assert(A && B); if (A == B || !pdt.dominates(B,A)) { BasicBlock *L = pdt.findNearestCommonDominator(A,B); ControlDependenceNode::EdgeType type = ControlDependenceGraphBase::getEdgeType(A,B); if (A == L) { switch (type) { case ControlDependenceNode::TRUE: AN->addTrue(AN); break; case ControlDependenceNode::FALSE: AN->addFalse(AN); break; case ControlDependenceNode::OTHER: AN->addOther(AN); break; } AN->addParent(AN); } for (DomTreeNode *cur = pdt[B]; cur && cur != pdt[L]; cur = cur->getIDom()) { ControlDependenceNode *CN = bbMap[cur->getBlock()]; switch (type) { case ControlDependenceNode::TRUE: AN->addTrue(CN); break; case ControlDependenceNode::FALSE: AN->addFalse(CN); break; case ControlDependenceNode::OTHER: AN->addOther(CN); break; } assert(CN); CN->addParent(AN); } } } } // ENTRY -> START for (DomTreeNode *cur = pdt[&F.getEntryBlock()]; cur; cur = cur->getIDom()) { if (cur->getBlock()) { ControlDependenceNode *CN = bbMap[cur->getBlock()]; assert(CN); root->addOther(CN); CN->addParent(root); } } }
void DSWP::checkControlDependence(BasicBlock *a, BasicBlock *b, PostDominatorTree &pdt) { BasicBlock *lca = pdt.findNearestCommonDominator(a, b); cout << a->getNameStr() << " " << b->getNameStr() << " " << lca->getNameStr() << endl; if (lca == pre[a]) { //case 1 BasicBlock *BB = b; while (BB != lca) { addControlDependence(a, BB); BB = pre[BB]; } } else if (lca == a) { //case 2: capture loop dependence BasicBlock *BB = b; while (BB != pre[a]) { cout << "\t" << a->getNameStr() << " " << BB->getNameStr() << endl; addControlDependence(a, BB); BB = pre[BB]; } } else { error("unknow case in checkControlDependence!"); } }