mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[Dominators] Remove DominatorBase class
Summary: DominatorBase class was only used by DominatorTreeBase. It didn't provide any useful abstractions, nor simplified anything, so I see no point keeping it. This commit removes the DominatorBase class and moves its content into DominatorTreeBase. This is the first patch in a series that tries to make all DomTrees have a single virtual root, which will allow to further simplify code (especially when it comes to incremental updates). Reviewers: dberlin, sanjoy, chandlerc Reviewed By: dberlin Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D34493 llvm-svn: 306713
This commit is contained in:
parent
4a6e70fe6b
commit
bc10fa26cb
@ -58,40 +58,6 @@ template <typename GT>
|
|||||||
using DominatorTreeBaseByGraphTraits =
|
using DominatorTreeBaseByGraphTraits =
|
||||||
typename detail::DominatorTreeBaseTraits<GT>::type;
|
typename detail::DominatorTreeBaseTraits<GT>::type;
|
||||||
|
|
||||||
/// \brief Base class that other, more interesting dominator analyses
|
|
||||||
/// inherit from.
|
|
||||||
template <class NodeT> class DominatorBase {
|
|
||||||
protected:
|
|
||||||
std::vector<NodeT *> Roots;
|
|
||||||
bool IsPostDominators;
|
|
||||||
|
|
||||||
explicit DominatorBase(bool isPostDom)
|
|
||||||
: Roots(), IsPostDominators(isPostDom) {}
|
|
||||||
|
|
||||||
DominatorBase(DominatorBase &&Arg)
|
|
||||||
: Roots(std::move(Arg.Roots)), IsPostDominators(Arg.IsPostDominators) {
|
|
||||||
Arg.Roots.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
DominatorBase &operator=(DominatorBase &&RHS) {
|
|
||||||
Roots = std::move(RHS.Roots);
|
|
||||||
IsPostDominators = RHS.IsPostDominators;
|
|
||||||
RHS.Roots.clear();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
/// getRoots - Return the root blocks of the current CFG. This may include
|
|
||||||
/// multiple blocks if we are computing post dominators. For forward
|
|
||||||
/// dominators, this will always be a single block (the entry node).
|
|
||||||
///
|
|
||||||
const std::vector<NodeT *> &getRoots() const { return Roots; }
|
|
||||||
|
|
||||||
/// isPostDominator - Returns true if analysis based of postdoms
|
|
||||||
///
|
|
||||||
bool isPostDominator() const { return IsPostDominators; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/// \brief Base class for the actual dominator tree node.
|
/// \brief Base class for the actual dominator tree node.
|
||||||
template <class NodeT> class DomTreeNodeBase {
|
template <class NodeT> class DomTreeNodeBase {
|
||||||
friend struct PostDominatorTree;
|
friend struct PostDominatorTree;
|
||||||
@ -218,7 +184,7 @@ bool Verify(const DominatorTreeBaseByGraphTraits<GraphTraits<N>> &DT);
|
|||||||
///
|
///
|
||||||
/// This class is a generic template over graph nodes. It is instantiated for
|
/// This class is a generic template over graph nodes. It is instantiated for
|
||||||
/// various graphs in the LLVM IR or in the code generator.
|
/// various graphs in the LLVM IR or in the code generator.
|
||||||
template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
|
template <class NodeT> class DominatorTreeBase {
|
||||||
bool dominatedBySlowTreeWalk(const DomTreeNodeBase<NodeT> *A,
|
bool dominatedBySlowTreeWalk(const DomTreeNodeBase<NodeT> *A,
|
||||||
const DomTreeNodeBase<NodeT> *B) const {
|
const DomTreeNodeBase<NodeT> *B) const {
|
||||||
assert(A != B);
|
assert(A != B);
|
||||||
@ -241,6 +207,9 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
std::vector<NodeT *> Roots;
|
||||||
|
bool IsPostDominators;
|
||||||
|
|
||||||
using DomTreeNodeMapType =
|
using DomTreeNodeMapType =
|
||||||
DenseMap<NodeT *, std::unique_ptr<DomTreeNodeBase<NodeT>>>;
|
DenseMap<NodeT *, std::unique_ptr<DomTreeNodeBase<NodeT>>>;
|
||||||
DomTreeNodeMapType DomTreeNodes;
|
DomTreeNodeMapType DomTreeNodes;
|
||||||
@ -316,12 +285,11 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DominatorTreeBase(bool isPostDom)
|
explicit DominatorTreeBase(bool isPostDom) : IsPostDominators(isPostDom) {}
|
||||||
: DominatorBase<NodeT>(isPostDom) {}
|
|
||||||
|
|
||||||
DominatorTreeBase(DominatorTreeBase &&Arg)
|
DominatorTreeBase(DominatorTreeBase &&Arg)
|
||||||
: DominatorBase<NodeT>(
|
: Roots(std::move(Arg.Roots)),
|
||||||
std::move(static_cast<DominatorBase<NodeT> &>(Arg))),
|
IsPostDominators(Arg.IsPostDominators),
|
||||||
DomTreeNodes(std::move(Arg.DomTreeNodes)),
|
DomTreeNodes(std::move(Arg.DomTreeNodes)),
|
||||||
RootNode(std::move(Arg.RootNode)),
|
RootNode(std::move(Arg.RootNode)),
|
||||||
DFSInfoValid(std::move(Arg.DFSInfoValid)),
|
DFSInfoValid(std::move(Arg.DFSInfoValid)),
|
||||||
@ -330,8 +298,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
DominatorTreeBase &operator=(DominatorTreeBase &&RHS) {
|
DominatorTreeBase &operator=(DominatorTreeBase &&RHS) {
|
||||||
DominatorBase<NodeT>::operator=(
|
Roots = std::move(RHS.Roots);
|
||||||
std::move(static_cast<DominatorBase<NodeT> &>(RHS)));
|
IsPostDominators = RHS.IsPostDominators;
|
||||||
DomTreeNodes = std::move(RHS.DomTreeNodes);
|
DomTreeNodes = std::move(RHS.DomTreeNodes);
|
||||||
RootNode = std::move(RHS.RootNode);
|
RootNode = std::move(RHS.RootNode);
|
||||||
DFSInfoValid = std::move(RHS.DFSInfoValid);
|
DFSInfoValid = std::move(RHS.DFSInfoValid);
|
||||||
@ -343,6 +311,16 @@ public:
|
|||||||
DominatorTreeBase(const DominatorTreeBase &) = delete;
|
DominatorTreeBase(const DominatorTreeBase &) = delete;
|
||||||
DominatorTreeBase &operator=(const DominatorTreeBase &) = delete;
|
DominatorTreeBase &operator=(const DominatorTreeBase &) = delete;
|
||||||
|
|
||||||
|
/// getRoots - Return the root blocks of the current CFG. This may include
|
||||||
|
/// multiple blocks if we are computing post dominators. For forward
|
||||||
|
/// dominators, this will always be a single block (the entry node).
|
||||||
|
///
|
||||||
|
const std::vector<NodeT *> &getRoots() const { return Roots; }
|
||||||
|
|
||||||
|
/// isPostDominator - Returns true if analysis based of postdoms
|
||||||
|
///
|
||||||
|
bool isPostDominator() const { return IsPostDominators; }
|
||||||
|
|
||||||
/// compare - Return false if the other dominator tree base matches this
|
/// compare - Return false if the other dominator tree base matches this
|
||||||
/// dominator tree base. Otherwise return true.
|
/// dominator tree base. Otherwise return true.
|
||||||
bool compare(const DominatorTreeBase &Other) const {
|
bool compare(const DominatorTreeBase &Other) const {
|
||||||
@ -580,7 +558,6 @@ public:
|
|||||||
assert(!this->isPostDominator() &&
|
assert(!this->isPostDominator() &&
|
||||||
"Cannot change root of post-dominator tree");
|
"Cannot change root of post-dominator tree");
|
||||||
DFSInfoValid = false;
|
DFSInfoValid = false;
|
||||||
auto &Roots = DominatorBase<NodeT>::Roots;
|
|
||||||
DomTreeNodeBase<NodeT> *NewNode = (DomTreeNodes[BB] =
|
DomTreeNodeBase<NodeT> *NewNode = (DomTreeNodes[BB] =
|
||||||
llvm::make_unique<DomTreeNodeBase<NodeT>>(BB, nullptr)).get();
|
llvm::make_unique<DomTreeNodeBase<NodeT>>(BB, nullptr)).get();
|
||||||
if (Roots.empty()) {
|
if (Roots.empty()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user