blob: 000fe5ddad540f665c8c17b219fb700292f6954d [file] [log] [blame]
Daniel Berlin29dbbd72015-04-21 19:13:02 +00001//===- IteratedDominanceFrontier.cpp - Compute IDF ------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
George Burgess IVd0a4a042016-07-21 20:52:35 +000010// Compute iterated dominance frontiers using a linear time algorithm.
Daniel Berlin29dbbd72015-04-21 19:13:02 +000011//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Analysis/IteratedDominanceFrontier.h"
15#include "llvm/IR/CFG.h"
16#include "llvm/IR/Dominators.h"
17#include <queue>
18
Daniel Berlin4c8f9b32016-04-19 06:13:28 +000019namespace llvm {
Alina Sbirlea5ec0e9d2018-08-17 17:39:15 +000020
Jakub Kuderskicb105522017-07-14 18:26:09 +000021template <class NodeTy, bool IsPostDom>
22void IDFCalculator<NodeTy, IsPostDom>::calculate(
Daniel Berlin4c8f9b32016-04-19 06:13:28 +000023 SmallVectorImpl<BasicBlock *> &PHIBlocks) {
Daniel Berlin29dbbd72015-04-21 19:13:02 +000024 // Use a priority queue keyed on dominator tree level so that inserted nodes
Michael Zolotukhin105e7622018-05-12 01:44:32 +000025 // 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
27 // deterministic way.
28 typedef std::pair<DomTreeNode *, std::pair<unsigned, unsigned>>
29 DomTreeNodePair;
Daniel Berlin29dbbd72015-04-21 19:13:02 +000030 typedef std::priority_queue<DomTreeNodePair, SmallVector<DomTreeNodePair, 32>,
31 less_second> IDFPriorityQueue;
32 IDFPriorityQueue PQ;
33
Michael Zolotukhin105e7622018-05-12 01:44:32 +000034 DT.updateDFSNumbers();
35
Daniel Berlin29dbbd72015-04-21 19:13:02 +000036 for (BasicBlock *BB : *DefBlocks) {
37 if (DomTreeNode *Node = DT.getNode(BB))
Michael Zolotukhin105e7622018-05-12 01:44:32 +000038 PQ.push({Node, std::make_pair(Node->getLevel(), Node->getDFSNumIn())});
Daniel Berlin29dbbd72015-04-21 19:13:02 +000039 }
40
41 SmallVector<DomTreeNode *, 32> Worklist;
42 SmallPtrSet<DomTreeNode *, 32> VisitedPQ;
43 SmallPtrSet<DomTreeNode *, 32> VisitedWorklist;
44
45 while (!PQ.empty()) {
46 DomTreeNodePair RootPair = PQ.top();
47 PQ.pop();
48 DomTreeNode *Root = RootPair.first;
Michael Zolotukhin105e7622018-05-12 01:44:32 +000049 unsigned RootLevel = RootPair.second.first;
Daniel Berlin29dbbd72015-04-21 19:13:02 +000050
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
54 // definition set.
55
56 Worklist.clear();
57 Worklist.push_back(Root);
58 VisitedWorklist.insert(Root);
59
60 while (!Worklist.empty()) {
61 DomTreeNode *Node = Worklist.pop_back_val();
62 BasicBlock *BB = Node->getBlock();
Daniel Berlin4c8f9b32016-04-19 06:13:28 +000063 // Succ is the successor in the direction we are calculating IDF, so it is
64 // successor for IDF, and predecessor for Reverse IDF.
Alina Sbirlea5ec0e9d2018-08-17 17:39:15 +000065 auto DoWork = [&](BasicBlock *Succ) {
Daniel Berlin29dbbd72015-04-21 19:13:02 +000066 DomTreeNode *SuccNode = DT.getNode(Succ);
67
68 // Quickly skip all CFG edges that are also dominator tree edges instead
69 // of catching them below.
70 if (SuccNode->getIDom() == Node)
Alina Sbirlea5ec0e9d2018-08-17 17:39:15 +000071 return;
Daniel Berlin29dbbd72015-04-21 19:13:02 +000072
Jakub Kuderski8915ae92017-07-01 00:23:01 +000073 const unsigned SuccLevel = SuccNode->getLevel();
Daniel Berlin29dbbd72015-04-21 19:13:02 +000074 if (SuccLevel > RootLevel)
Alina Sbirlea5ec0e9d2018-08-17 17:39:15 +000075 return;
Daniel Berlin29dbbd72015-04-21 19:13:02 +000076
77 if (!VisitedPQ.insert(SuccNode).second)
Alina Sbirlea5ec0e9d2018-08-17 17:39:15 +000078 return;
Daniel Berlin29dbbd72015-04-21 19:13:02 +000079
80 BasicBlock *SuccBB = SuccNode->getBlock();
81 if (useLiveIn && !LiveInBlocks->count(SuccBB))
Alina Sbirlea5ec0e9d2018-08-17 17:39:15 +000082 return;
Daniel Berlin29dbbd72015-04-21 19:13:02 +000083
84 PHIBlocks.emplace_back(SuccBB);
85 if (!DefBlocks->count(SuccBB))
Michael Zolotukhin105e7622018-05-12 01:44:32 +000086 PQ.push(std::make_pair(
87 SuccNode, std::make_pair(SuccLevel, SuccNode->getDFSNumIn())));
Alina Sbirlea5ec0e9d2018-08-17 17:39:15 +000088 };
89
90 if (GD) {
91 for (auto Pair : children<
92 std::pair<const GraphDiff<BasicBlock *, IsPostDom> *, NodeTy>>(
93 {GD, BB}))
94 DoWork(Pair.second);
95 } else {
96 for (auto *Succ : children<NodeTy>(BB))
97 DoWork(Succ);
Daniel Berlin29dbbd72015-04-21 19:13:02 +000098 }
99
100 for (auto DomChild : *Node) {
101 if (VisitedWorklist.insert(DomChild).second)
102 Worklist.push_back(DomChild);
103 }
104 }
105 }
106}
Daniel Berlin4c8f9b32016-04-19 06:13:28 +0000107
Jakub Kuderskicb105522017-07-14 18:26:09 +0000108template class IDFCalculator<BasicBlock *, false>;
109template class IDFCalculator<Inverse<BasicBlock *>, true>;
Daniel Berlin4c8f9b32016-04-19 06:13:28 +0000110}