summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlina Sbirlea <asbirlea@google.com>2018-08-17 17:39:15 +0000
committerAlina Sbirlea <asbirlea@google.com>2018-08-17 17:39:15 +0000
commit0dfe830318c8e59aeedd1b790b1ea25e7f1cfca3 (patch)
treed8413ae7d0141f80182659b6ffd86fa9892e756e
parenta75fad4fa432ce8d7eae419129306cd9d202677e (diff)
downloadbcm5719-llvm-0dfe830318c8e59aeedd1b790b1ea25e7f1cfca3.tar.gz
bcm5719-llvm-0dfe830318c8e59aeedd1b790b1ea25e7f1cfca3.zip
[IDF] Teach Iterated Dominance Frontier to use a snapshot CFG based on a GraphDiff.
Summary: Create the ability to compute IDF using a CFG View. For this, we'll need a new DT created using a list of Updates (to be refactored later to a GraphDiff), and the GraphTraits based on the same GraphDiff. Reviewers: kuhar, george.burgess.iv, mzolotukhin Subscribers: sanjoy, jlebar, llvm-commits Differential Revision: https://reviews.llvm.org/D50675 llvm-svn: 340052
-rw-r--r--llvm/include/llvm/Analysis/IteratedDominanceFrontier.h26
-rw-r--r--llvm/lib/Analysis/IteratedDominanceFrontier.cpp21
2 files changed, 32 insertions, 15 deletions
diff --git a/llvm/include/llvm/Analysis/IteratedDominanceFrontier.h b/llvm/include/llvm/Analysis/IteratedDominanceFrontier.h
index 6b195073324..6ae8d7e0da2 100644
--- a/llvm/include/llvm/Analysis/IteratedDominanceFrontier.h
+++ b/llvm/include/llvm/Analysis/IteratedDominanceFrontier.h
@@ -28,6 +28,7 @@
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/CFGDiff.h"
#include "llvm/IR/Dominators.h"
namespace llvm {
@@ -45,17 +46,21 @@ namespace llvm {
template <class NodeTy, bool IsPostDom>
class IDFCalculator {
public:
- IDFCalculator(DominatorTreeBase<BasicBlock, IsPostDom> &DT)
- : DT(DT), useLiveIn(false) {}
+ IDFCalculator(DominatorTreeBase<BasicBlock, IsPostDom> &DT)
+ : DT(DT), GD(nullptr), useLiveIn(false) {}
- /// Give the IDF calculator the set of blocks in which the value is
- /// defined. This is equivalent to the set of starting blocks it should be
- /// calculating the IDF for (though later gets pruned based on liveness).
- ///
- /// Note: This set *must* live for the entire lifetime of the IDF calculator.
- void setDefiningBlocks(const SmallPtrSetImpl<BasicBlock *> &Blocks) {
- DefBlocks = &Blocks;
- }
+ IDFCalculator(DominatorTreeBase<BasicBlock, IsPostDom> &DT,
+ GraphDiff<BasicBlock *, IsPostDom> *GD)
+ : DT(DT), GD(GD), useLiveIn(false) {}
+
+ /// Give the IDF calculator the set of blocks in which the value is
+ /// defined. This is equivalent to the set of starting blocks it should be
+ /// calculating the IDF for (though later gets pruned based on liveness).
+ ///
+ /// Note: This set *must* live for the entire lifetime of the IDF calculator.
+ void setDefiningBlocks(const SmallPtrSetImpl<BasicBlock *> &Blocks) {
+ DefBlocks = &Blocks;
+ }
/// Give the IDF calculator the set of blocks in which the value is
/// live on entry to the block. This is used to prune the IDF calculation to
@@ -85,6 +90,7 @@ class IDFCalculator {
private:
DominatorTreeBase<BasicBlock, IsPostDom> &DT;
+ GraphDiff<BasicBlock *, IsPostDom> *GD;
bool useLiveIn;
const SmallPtrSetImpl<BasicBlock *> *LiveInBlocks;
const SmallPtrSetImpl<BasicBlock *> *DefBlocks;
diff --git a/llvm/lib/Analysis/IteratedDominanceFrontier.cpp b/llvm/lib/Analysis/IteratedDominanceFrontier.cpp
index e7751d32aab..000fe5ddad5 100644
--- a/llvm/lib/Analysis/IteratedDominanceFrontier.cpp
+++ b/llvm/lib/Analysis/IteratedDominanceFrontier.cpp
@@ -17,6 +17,7 @@
#include <queue>
namespace llvm {
+
template <class NodeTy, bool IsPostDom>
void IDFCalculator<NodeTy, IsPostDom>::calculate(
SmallVectorImpl<BasicBlock *> &PHIBlocks) {
@@ -61,29 +62,39 @@ void IDFCalculator<NodeTy, IsPostDom>::calculate(
BasicBlock *BB = Node->getBlock();
// Succ is the successor in the direction we are calculating IDF, so it is
// successor for IDF, and predecessor for Reverse IDF.
- for (auto *Succ : children<NodeTy>(BB)) {
+ auto DoWork = [&](BasicBlock *Succ) {
DomTreeNode *SuccNode = DT.getNode(Succ);
// Quickly skip all CFG edges that are also dominator tree edges instead
// of catching them below.
if (SuccNode->getIDom() == Node)
- continue;
+ return;
const unsigned SuccLevel = SuccNode->getLevel();
if (SuccLevel > RootLevel)
- continue;
+ return;
if (!VisitedPQ.insert(SuccNode).second)
- continue;
+ return;
BasicBlock *SuccBB = SuccNode->getBlock();
if (useLiveIn && !LiveInBlocks->count(SuccBB))
- continue;
+ return;
PHIBlocks.emplace_back(SuccBB);
if (!DefBlocks->count(SuccBB))
PQ.push(std::make_pair(
SuccNode, std::make_pair(SuccLevel, SuccNode->getDFSNumIn())));
+ };
+
+ if (GD) {
+ for (auto Pair : children<
+ std::pair<const GraphDiff<BasicBlock *, IsPostDom> *, NodeTy>>(
+ {GD, BB}))
+ DoWork(Pair.second);
+ } else {
+ for (auto *Succ : children<NodeTy>(BB))
+ DoWork(Succ);
}
for (auto DomChild : *Node) {
OpenPOWER on IntegriCloud