1 //===- IteratedDominanceFrontier.cpp - Compute IDF ------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Compute iterated dominance frontiers using a linear time algorithm.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Analysis/IteratedDominanceFrontier.h"
15 #include "llvm/IR/CFG.h"
16 #include "llvm/IR/Dominators.h"
21 template <class NodeTy, bool IsPostDom>
22 void IDFCalculator<NodeTy, IsPostDom>::calculate(
23 SmallVectorImpl<BasicBlock *> &PHIBlocks) {
24 // Use a priority queue keyed on dominator tree level so that inserted nodes
25 // are handled from the bottom of the dominator tree upwards. We also augment
26 // the level with a DFS number to ensure that the blocks are ordered in a
28 typedef std::pair<DomTreeNode *, std::pair<unsigned, unsigned>>
30 typedef std::priority_queue<DomTreeNodePair, SmallVector<DomTreeNodePair, 32>,
31 less_second> IDFPriorityQueue;
34 DT.updateDFSNumbers();
36 for (BasicBlock *BB : *DefBlocks) {
37 if (DomTreeNode *Node = DT.getNode(BB))
38 PQ.push({Node, std::make_pair(Node->getLevel(), Node->getDFSNumIn())});
41 SmallVector<DomTreeNode *, 32> Worklist;
42 SmallPtrSet<DomTreeNode *, 32> VisitedPQ;
43 SmallPtrSet<DomTreeNode *, 32> VisitedWorklist;
46 DomTreeNodePair RootPair = PQ.top();
48 DomTreeNode *Root = RootPair.first;
49 unsigned RootLevel = RootPair.second.first;
51 // Walk all dominator tree children of Root, inspecting their CFG edges with
52 // targets elsewhere on the dominator tree. Only targets whose level is at
53 // most Root's level are added to the iterated dominance frontier of the
57 Worklist.push_back(Root);
58 VisitedWorklist.insert(Root);
60 while (!Worklist.empty()) {
61 DomTreeNode *Node = Worklist.pop_back_val();
62 BasicBlock *BB = Node->getBlock();
63 // Succ is the successor in the direction we are calculating IDF, so it is
64 // successor for IDF, and predecessor for Reverse IDF.
65 auto DoWork = [&](BasicBlock *Succ) {
66 DomTreeNode *SuccNode = DT.getNode(Succ);
68 // Quickly skip all CFG edges that are also dominator tree edges instead
69 // of catching them below.
70 if (SuccNode->getIDom() == Node)
73 const unsigned SuccLevel = SuccNode->getLevel();
74 if (SuccLevel > RootLevel)
77 if (!VisitedPQ.insert(SuccNode).second)
80 BasicBlock *SuccBB = SuccNode->getBlock();
81 if (useLiveIn && !LiveInBlocks->count(SuccBB))
84 PHIBlocks.emplace_back(SuccBB);
85 if (!DefBlocks->count(SuccBB))
86 PQ.push(std::make_pair(
87 SuccNode, std::make_pair(SuccLevel, SuccNode->getDFSNumIn())));
91 for (auto Pair : children<
92 std::pair<const GraphDiff<BasicBlock *, IsPostDom> *, NodeTy>>(
96 for (auto *Succ : children<NodeTy>(BB))
100 for (auto DomChild : *Node) {
101 if (VisitedWorklist.insert(DomChild).second)
102 Worklist.push_back(DomChild);
108 template class IDFCalculator<BasicBlock *, false>;
109 template class IDFCalculator<Inverse<BasicBlock *>, true>;