mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-21 03:05:26 -04:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@340052 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user