mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
Have PostDomTree use the newly templated DFSPass.
llvm-svn: 42427
This commit is contained in:
parent
d3ff9d3ff7
commit
a533c458f5
@ -21,7 +21,8 @@
|
||||
namespace llvm {
|
||||
|
||||
template<class GraphT>
|
||||
unsigned DFSPass(DominatorTree& DT, typename GraphT::NodeType* V, unsigned N) {
|
||||
unsigned DFSPass(DominatorTreeBase& DT, typename GraphT::NodeType* V,
|
||||
unsigned N) {
|
||||
// This is more understandable as a recursive algorithm, but we can't use the
|
||||
// recursive algorithm due to stack depth issues. Keep it here for
|
||||
// documentation purposes.
|
||||
|
@ -280,6 +280,10 @@ protected:
|
||||
friend void Link(DominatorTreeBase& DT, BasicBlock *V,
|
||||
BasicBlock *W, InfoRec &WInfo);
|
||||
|
||||
template<class GraphT> friend unsigned DFSPass(DominatorTreeBase& DT,
|
||||
typename GraphT::NodeType* V,
|
||||
unsigned N);
|
||||
|
||||
/// updateDFSNumbers - Assign In and Out numbers to the nodes while walking
|
||||
/// dominator tree in dfs order.
|
||||
void updateDFSNumbers();
|
||||
@ -319,9 +323,6 @@ public:
|
||||
|
||||
private:
|
||||
friend void DTcalculate(DominatorTree& DT, Function& F);
|
||||
|
||||
template<class GraphT> friend
|
||||
unsigned DFSPass(DominatorTree& DT, typename GraphT::NodeType* V, unsigned N);
|
||||
};
|
||||
|
||||
//===-------------------------------------
|
||||
|
@ -37,10 +37,7 @@ struct PostDominatorTree : public DominatorTreeBase {
|
||||
AU.setPreservesAll();
|
||||
}
|
||||
private:
|
||||
unsigned DFSPass(BasicBlock *V, unsigned N);
|
||||
friend void PDTcalculate(PostDominatorTree& PDT, Function &F);
|
||||
friend void PDTLink(PostDominatorTree& PDT,BasicBlock *V,
|
||||
BasicBlock *W, InfoRec &WInfo);
|
||||
};
|
||||
|
||||
|
||||
|
@ -13,7 +13,9 @@
|
||||
#ifndef LLVM_ANALYSIS_POST_DOMINATOR_CALCULATION_H
|
||||
#define LLVM_ANALYSIS_POST_DOMINATOR_CALCULATION_H
|
||||
|
||||
#include "llvm/Analysis/Dominators.h"
|
||||
#include "llvm/Analysis/PostDominators.h"
|
||||
#include "llvm/Analysis/DominatorInternals.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -40,7 +42,7 @@ void PDTcalculate(PostDominatorTree& PDT, Function &F) {
|
||||
// in later stages of the algorithm.
|
||||
unsigned N = 0;
|
||||
for (unsigned i = 0, e = PDT.Roots.size(); i != e; ++i)
|
||||
N = PDT.DFSPass(PDT.Roots[i], N);
|
||||
N = DFSPass<GraphTraits<Inverse<BasicBlock*> > >(PDT, PDT.Roots[i], N);
|
||||
|
||||
for (unsigned i = N; i >= 2; --i) {
|
||||
BasicBlock *W = PDT.Vertex[i];
|
||||
|
@ -28,51 +28,6 @@ char PostDominanceFrontier::ID = 0;
|
||||
static RegisterPass<PostDominatorTree>
|
||||
F("postdomtree", "Post-Dominator Tree Construction", true);
|
||||
|
||||
unsigned PostDominatorTree::DFSPass(BasicBlock *V, unsigned N) {
|
||||
std::vector<BasicBlock *> workStack;
|
||||
SmallPtrSet<BasicBlock *, 32> Visited;
|
||||
workStack.push_back(V);
|
||||
|
||||
do {
|
||||
BasicBlock *currentBB = workStack.back();
|
||||
InfoRec &CurVInfo = Info[currentBB];
|
||||
|
||||
// Visit each block only once.
|
||||
if (Visited.insert(currentBB)) {
|
||||
CurVInfo.Semi = ++N;
|
||||
CurVInfo.Label = currentBB;
|
||||
|
||||
Vertex.push_back(currentBB); // Vertex[n] = current;
|
||||
// Info[currentBB].Ancestor = 0;
|
||||
// Ancestor[n] = 0
|
||||
// Child[currentBB] = 0;
|
||||
CurVInfo.Size = 1; // Size[currentBB] = 1
|
||||
}
|
||||
|
||||
// Visit children
|
||||
bool visitChild = false;
|
||||
for (pred_iterator PI = pred_begin(currentBB), PE = pred_end(currentBB);
|
||||
PI != PE && !visitChild; ++PI) {
|
||||
InfoRec &SuccVInfo = Info[*PI];
|
||||
if (SuccVInfo.Semi == 0) {
|
||||
SuccVInfo.Parent = currentBB;
|
||||
if (!Visited.count(*PI)) {
|
||||
workStack.push_back(*PI);
|
||||
visitChild = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If all children are visited or if this block has no child then pop this
|
||||
// block out of workStack.
|
||||
if (!visitChild)
|
||||
workStack.pop_back();
|
||||
|
||||
} while (!workStack.empty());
|
||||
|
||||
return N;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// PostDominanceFrontier Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -7,9 +7,6 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LIB_LLVM_ANALYSIS_DOMINATOR_INTERNALS_H
|
||||
#define LIB_LLVM_ANALYSIS_DOMINATOR_INTERNALS_H
|
||||
|
||||
#include "llvm/Analysis/Dominators.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
@ -141,5 +138,3 @@ void Link(DominatorTreeBase& DT, BasicBlock *V, BasicBlock *W,
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user