PostDominators.cpp revision d20cc14dbf6d54d896e67b9920cd9bccdc14c41a
1//===- PostDominators.cpp - Post-Dominator Calculation --------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the post-dominator construction algorithms. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/Analysis/PostDominators.h" 15#include "llvm/Instructions.h" 16#include "llvm/Support/CFG.h" 17#include "llvm/ADT/DepthFirstIterator.h" 18#include "llvm/ADT/SetOperations.h" 19#include "llvm/Analysis/DominatorInternals.h" 20using namespace llvm; 21 22//===----------------------------------------------------------------------===// 23// PostDominatorTree Implementation 24//===----------------------------------------------------------------------===// 25 26char PostDominatorTree::ID = 0; 27char PostDominanceFrontier::ID = 0; 28static RegisterPass<PostDominatorTree> 29F("postdomtree", "Post-Dominator Tree Construction", true); 30 31bool PostDominatorTree::runOnFunction(Function &F) { 32 DT->recalculate(F); 33 return false; 34} 35 36//===----------------------------------------------------------------------===// 37// PostDominanceFrontier Implementation 38//===----------------------------------------------------------------------===// 39 40static RegisterPass<PostDominanceFrontier> 41H("postdomfrontier", "Post-Dominance Frontier Construction", true); 42 43const DominanceFrontier::DomSetType & 44PostDominanceFrontier::calculate(const PostDominatorTree &DT, 45 const DomTreeNode *Node) { 46 // Loop over CFG successors to calculate DFlocal[Node] 47 BasicBlock *BB = Node->getBlock(); 48 DomSetType &S = Frontiers[BB]; // The new set to fill in... 49 if (getRoots().empty()) return S; 50 51 if (BB) 52 for (pred_iterator SI = pred_begin(BB), SE = pred_end(BB); 53 SI != SE; ++SI) { 54 // Does Node immediately dominate this predecessor? 55 DomTreeNode *SINode = DT[*SI]; 56 if (SINode && SINode->getIDom() != Node) 57 S.insert(*SI); 58 } 59 60 // At this point, S is DFlocal. Now we union in DFup's of our children... 61 // Loop through and visit the nodes that Node immediately dominates (Node's 62 // children in the IDomTree) 63 // 64 for (DomTreeNode::const_iterator 65 NI = Node->begin(), NE = Node->end(); NI != NE; ++NI) { 66 DomTreeNode *IDominee = *NI; 67 const DomSetType &ChildDF = calculate(DT, IDominee); 68 69 DomSetType::const_iterator CDFI = ChildDF.begin(), CDFE = ChildDF.end(); 70 for (; CDFI != CDFE; ++CDFI) { 71 if (!DT.properlyDominates(Node, DT[*CDFI])) 72 S.insert(*CDFI); 73 } 74 } 75 76 return S; 77} 78 79// Ensure that this .cpp file gets linked when PostDominators.h is used. 80DEFINING_FILE_FOR(PostDominanceFrontier) 81