forked from OSchip/llvm-project
[PM] Split DominatorTree into a concrete analysis result object which
can be used by both the new pass manager and the old. This removes it from any of the virtual mess of the pass interfaces and lets it derive cleanly from the DominatorTreeBase<> template. In turn, tons of boilerplate interface can be nuked and it turns into a very straightforward extension of the base DominatorTree interface. The old analysis pass is now a simple wrapper. The names and style of this split should match the split between CallGraph and CallGraphWrapperPass. All of the users of DominatorTree have been updated to match using many of the same tricks as with CallGraph. The goal is that the common type remains the resulting DominatorTree rather than the pass. This will make subsequent work toward the new pass manager significantly easier. Also in numerous places things became cleaner because I switched from re-running the pass (!!! mid way through some other passes run!!!) to directly recomputing the domtree. llvm-svn: 199104
This commit is contained in:
parent
ca9af6cad9
commit
73523021d0
|
@ -169,7 +169,7 @@ public:
|
||||||
|
|
||||||
virtual bool runOnFunction(Function &) {
|
virtual bool runOnFunction(Function &) {
|
||||||
Frontiers.clear();
|
Frontiers.clear();
|
||||||
DominatorTree &DT = getAnalysis<DominatorTree>();
|
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
Roots = DT.getRoots();
|
Roots = DT.getRoots();
|
||||||
assert(Roots.size() == 1 && "Only one entry block for forward domfronts!");
|
assert(Roots.size() == 1 && "Only one entry block for forward domfronts!");
|
||||||
calculate(DT, DT[Roots[0]]);
|
calculate(DT, DT[Roots[0]]);
|
||||||
|
@ -178,7 +178,7 @@ public:
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
const DomSetType &calculate(const DominatorTree &DT,
|
const DomSetType &calculate(const DominatorTree &DT,
|
||||||
|
|
|
@ -115,7 +115,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
SSPLayoutKind getSSPLayout(const AllocaInst *AI) const;
|
SSPLayoutKind getSSPLayout(const AllocaInst *AI) const;
|
||||||
|
|
|
@ -53,162 +53,59 @@ public:
|
||||||
|
|
||||||
/// \brief Concrete subclass of DominatorTreeBase that is used to compute a
|
/// \brief Concrete subclass of DominatorTreeBase that is used to compute a
|
||||||
/// normal dominator tree.
|
/// normal dominator tree.
|
||||||
class DominatorTree : public FunctionPass {
|
class DominatorTree : public DominatorTreeBase<BasicBlock> {
|
||||||
public:
|
public:
|
||||||
static char ID; // Pass ID, replacement for typeid
|
typedef DominatorTreeBase<BasicBlock> Base;
|
||||||
DominatorTreeBase<BasicBlock>* DT;
|
|
||||||
|
|
||||||
DominatorTree() : FunctionPass(ID) {
|
DominatorTree() : DominatorTreeBase<BasicBlock>(false) {}
|
||||||
initializeDominatorTreePass(*PassRegistry::getPassRegistry());
|
|
||||||
DT = new DominatorTreeBase<BasicBlock>(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
~DominatorTree() {
|
// FIXME: This is no longer needed and should be removed when its uses are
|
||||||
delete DT;
|
// cleaned up.
|
||||||
}
|
Base& getBase() { return *this; }
|
||||||
|
|
||||||
DominatorTreeBase<BasicBlock>& getBase() { return *DT; }
|
|
||||||
|
|
||||||
/// \brief Returns 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).
|
|
||||||
inline const std::vector<BasicBlock*> &getRoots() const {
|
|
||||||
return DT->getRoots();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline BasicBlock *getRoot() const {
|
|
||||||
return DT->getRoot();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline DomTreeNode *getRootNode() const {
|
|
||||||
return DT->getRootNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get all nodes dominated by R, including R itself.
|
|
||||||
void getDescendants(BasicBlock *R,
|
|
||||||
SmallVectorImpl<BasicBlock *> &Result) const {
|
|
||||||
DT->getDescendants(R, Result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Returns *false* if the other dominator tree matches this dominator
|
/// \brief Returns *false* if the other dominator tree matches this dominator
|
||||||
/// tree.
|
/// tree.
|
||||||
inline bool compare(DominatorTree &Other) const {
|
inline bool compare(const DominatorTree &Other) const {
|
||||||
DomTreeNode *R = getRootNode();
|
const DomTreeNode *R = getRootNode();
|
||||||
DomTreeNode *OtherR = Other.getRootNode();
|
const DomTreeNode *OtherR = Other.getRootNode();
|
||||||
|
|
||||||
if (!R || !OtherR || R->getBlock() != OtherR->getBlock())
|
if (!R || !OtherR || R->getBlock() != OtherR->getBlock())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (DT->compare(Other.getBase()))
|
if (Base::compare(Other))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool runOnFunction(Function &F);
|
// Ensure base-class overloads are visible.
|
||||||
|
using Base::dominates;
|
||||||
|
|
||||||
virtual void verifyAnalysis() const;
|
/// \brief Return true if Def dominates a use in User.
|
||||||
|
///
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
/// This performs the special checks necessary if Def and User are in the same
|
||||||
AU.setPreservesAll();
|
/// basic block. Note that Def doesn't dominate a use in Def itself!
|
||||||
}
|
|
||||||
|
|
||||||
inline bool dominates(const DomTreeNode* A, const DomTreeNode* B) const {
|
|
||||||
return DT->dominates(A, B);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool dominates(const BasicBlock* A, const BasicBlock* B) const {
|
|
||||||
return DT->dominates(A, B);
|
|
||||||
}
|
|
||||||
|
|
||||||
// \brief Return true if Def dominates a use in User.
|
|
||||||
//
|
|
||||||
// This performs the special checks necessary if Def and User are in the same
|
|
||||||
// basic block. Note that Def doesn't dominate a use in Def itself!
|
|
||||||
bool dominates(const Instruction *Def, const Use &U) const;
|
bool dominates(const Instruction *Def, const Use &U) const;
|
||||||
bool dominates(const Instruction *Def, const Instruction *User) const;
|
bool dominates(const Instruction *Def, const Instruction *User) const;
|
||||||
bool dominates(const Instruction *Def, const BasicBlock *BB) const;
|
bool dominates(const Instruction *Def, const BasicBlock *BB) const;
|
||||||
bool dominates(const BasicBlockEdge &BBE, const Use &U) const;
|
bool dominates(const BasicBlockEdge &BBE, const Use &U) const;
|
||||||
bool dominates(const BasicBlockEdge &BBE, const BasicBlock *BB) const;
|
bool dominates(const BasicBlockEdge &BBE, const BasicBlock *BB) const;
|
||||||
|
|
||||||
bool properlyDominates(const DomTreeNode *A, const DomTreeNode *B) const {
|
|
||||||
return DT->properlyDominates(A, B);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool properlyDominates(const BasicBlock *A, const BasicBlock *B) const {
|
|
||||||
return DT->properlyDominates(A, B);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Find nearest common dominator basic block for basic block A and B.
|
|
||||||
///
|
|
||||||
/// If there is no such block then return NULL.
|
|
||||||
inline BasicBlock *findNearestCommonDominator(BasicBlock *A, BasicBlock *B) {
|
|
||||||
return DT->findNearestCommonDominator(A, B);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const BasicBlock *findNearestCommonDominator(const BasicBlock *A,
|
|
||||||
const BasicBlock *B) {
|
|
||||||
return DT->findNearestCommonDominator(A, B);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline DomTreeNode *operator[](BasicBlock *BB) const {
|
inline DomTreeNode *operator[](BasicBlock *BB) const {
|
||||||
return DT->getNode(BB);
|
return getNode(BB);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Returns the DominatorTree node for the specified basic block.
|
// Ensure base class overloads are visible.
|
||||||
///
|
using Base::isReachableFromEntry;
|
||||||
/// This is the same as using operator[] on this class.
|
|
||||||
inline DomTreeNode *getNode(BasicBlock *BB) const {
|
|
||||||
return DT->getNode(BB);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Add a new node to the dominator tree information.
|
|
||||||
///
|
|
||||||
/// This creates a new node as a child of DomBB dominator node, linking it
|
|
||||||
/// into the children list of the immediate dominator.
|
|
||||||
inline DomTreeNode *addNewBlock(BasicBlock *BB, BasicBlock *DomBB) {
|
|
||||||
return DT->addNewBlock(BB, DomBB);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Updates the dominator tree information when a node's immediate
|
|
||||||
/// dominator changes.
|
|
||||||
inline void changeImmediateDominator(BasicBlock *N, BasicBlock* NewIDom) {
|
|
||||||
DT->changeImmediateDominator(N, NewIDom);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void changeImmediateDominator(DomTreeNode *N, DomTreeNode* NewIDom) {
|
|
||||||
DT->changeImmediateDominator(N, NewIDom);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Removes a node from the dominator tree.
|
|
||||||
///
|
|
||||||
/// The block must not dominate any other blocks. Removes node from its
|
|
||||||
/// immediate dominator's children list. Deletes dominator node associated
|
|
||||||
/// with basic block BB.
|
|
||||||
inline void eraseNode(BasicBlock *BB) {
|
|
||||||
DT->eraseNode(BB);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief BB is split and now it has one successor; update dominator tree to
|
|
||||||
/// reflect this change.
|
|
||||||
inline void splitBlock(BasicBlock* NewBB) {
|
|
||||||
DT->splitBlock(NewBB);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isReachableFromEntry(const BasicBlock* A) const {
|
|
||||||
return DT->isReachableFromEntry(A);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/// \brief Provide an overload for a Use.
|
||||||
bool isReachableFromEntry(const Use &U) const;
|
bool isReachableFromEntry(const Use &U) const;
|
||||||
|
|
||||||
|
/// \brief Verify the correctness of the domtree by re-computing it.
|
||||||
virtual void releaseMemory() {
|
///
|
||||||
DT->releaseMemory();
|
/// This should only be used for debugging as it aborts the program if the
|
||||||
}
|
/// verification fails.
|
||||||
|
void verifyDomTree() const;
|
||||||
virtual void print(raw_ostream &OS, const Module* M= 0) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//===-------------------------------------
|
//===-------------------------------------
|
||||||
|
@ -255,6 +152,33 @@ template <> struct GraphTraits<DominatorTree*>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// \brief Analysis pass which computes a \c DominatorTree.
|
||||||
|
class DominatorTreeWrapperPass : public FunctionPass {
|
||||||
|
DominatorTree DT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static char ID;
|
||||||
|
|
||||||
|
DominatorTreeWrapperPass() : FunctionPass(ID) {
|
||||||
|
initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry());
|
||||||
|
}
|
||||||
|
|
||||||
|
DominatorTree &getDomTree() { return DT; }
|
||||||
|
const DominatorTree &getDomTree() const { return DT; }
|
||||||
|
|
||||||
|
virtual bool runOnFunction(Function &F);
|
||||||
|
|
||||||
|
virtual void verifyAnalysis() const;
|
||||||
|
|
||||||
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
|
AU.setPreservesAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void releaseMemory() { DT.releaseMemory(); }
|
||||||
|
|
||||||
|
virtual void print(raw_ostream &OS, const Module *M = 0) const;
|
||||||
|
};
|
||||||
|
|
||||||
} // End llvm namespace
|
} // End llvm namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -110,7 +110,7 @@ void initializeDomOnlyViewerPass(PassRegistry&);
|
||||||
void initializeDomPrinterPass(PassRegistry&);
|
void initializeDomPrinterPass(PassRegistry&);
|
||||||
void initializeDomViewerPass(PassRegistry&);
|
void initializeDomViewerPass(PassRegistry&);
|
||||||
void initializeDominanceFrontierPass(PassRegistry&);
|
void initializeDominanceFrontierPass(PassRegistry&);
|
||||||
void initializeDominatorTreePass(PassRegistry&);
|
void initializeDominatorTreeWrapperPassPass(PassRegistry&);
|
||||||
void initializeEarlyIfConverterPass(PassRegistry&);
|
void initializeEarlyIfConverterPass(PassRegistry&);
|
||||||
void initializeEdgeBundlesPass(PassRegistry&);
|
void initializeEdgeBundlesPass(PassRegistry&);
|
||||||
void initializeExpandPostRAPass(PassRegistry&);
|
void initializeExpandPostRAPass(PassRegistry&);
|
||||||
|
|
|
@ -298,7 +298,7 @@ public:
|
||||||
|
|
||||||
/// 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(DominatorTreeBase &Other) const {
|
bool compare(const DominatorTreeBase &Other) const {
|
||||||
|
|
||||||
const DomTreeNodeMapType &OtherDomTreeNodes = Other.DomTreeNodes;
|
const DomTreeNodeMapType &OtherDomTreeNodes = Other.DomTreeNodes;
|
||||||
if (DomTreeNodes.size() != OtherDomTreeNodes.size())
|
if (DomTreeNodes.size() != OtherDomTreeNodes.size())
|
||||||
|
|
|
@ -1335,7 +1335,9 @@ bool BasicAliasAnalysis::isValueEqualInPotentialCycles(const Value *V,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Use dominance or loop info if available.
|
// Use dominance or loop info if available.
|
||||||
DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
|
DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
DominatorTree *DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
LoopInfo *LI = getAnalysisIfAvailable<LoopInfo>();
|
LoopInfo *LI = getAnalysisIfAvailable<LoopInfo>();
|
||||||
|
|
||||||
// Make sure that the visited phis cannot reach the Value. This ensures that
|
// Make sure that the visited phis cannot reach the Value. This ensures that
|
||||||
|
|
|
@ -81,18 +81,32 @@ struct DOTGraphTraits<PostDominatorTree*>
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct DomViewer
|
struct DominatorTreeWrapperPassAnalysisGraphTraits {
|
||||||
: public DOTGraphTraitsViewer<DominatorTree, false> {
|
static DominatorTree *getGraph(DominatorTreeWrapperPass *DTWP) {
|
||||||
|
return &DTWP->getDomTree();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DomViewer : public DOTGraphTraitsViewer<
|
||||||
|
DominatorTreeWrapperPass, false, DominatorTree *,
|
||||||
|
DominatorTreeWrapperPassAnalysisGraphTraits> {
|
||||||
static char ID;
|
static char ID;
|
||||||
DomViewer() : DOTGraphTraitsViewer<DominatorTree, false>("dom", ID){
|
DomViewer()
|
||||||
|
: DOTGraphTraitsViewer<DominatorTreeWrapperPass, false, DominatorTree *,
|
||||||
|
DominatorTreeWrapperPassAnalysisGraphTraits>(
|
||||||
|
"dom", ID) {
|
||||||
initializeDomViewerPass(*PassRegistry::getPassRegistry());
|
initializeDomViewerPass(*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DomOnlyViewer
|
struct DomOnlyViewer : public DOTGraphTraitsViewer<
|
||||||
: public DOTGraphTraitsViewer<DominatorTree, true> {
|
DominatorTreeWrapperPass, true, DominatorTree *,
|
||||||
|
DominatorTreeWrapperPassAnalysisGraphTraits> {
|
||||||
static char ID;
|
static char ID;
|
||||||
DomOnlyViewer() : DOTGraphTraitsViewer<DominatorTree, true>("domonly", ID){
|
DomOnlyViewer()
|
||||||
|
: DOTGraphTraitsViewer<DominatorTreeWrapperPass, true, DominatorTree *,
|
||||||
|
DominatorTreeWrapperPassAnalysisGraphTraits>(
|
||||||
|
"domonly", ID) {
|
||||||
initializeDomOnlyViewerPass(*PassRegistry::getPassRegistry());
|
initializeDomOnlyViewerPass(*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -136,18 +150,26 @@ INITIALIZE_PASS(PostDomOnlyViewer, "view-postdom-only",
|
||||||
false, false)
|
false, false)
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct DomPrinter
|
struct DomPrinter : public DOTGraphTraitsPrinter<
|
||||||
: public DOTGraphTraitsPrinter<DominatorTree, false> {
|
DominatorTreeWrapperPass, false, DominatorTree *,
|
||||||
|
DominatorTreeWrapperPassAnalysisGraphTraits> {
|
||||||
static char ID;
|
static char ID;
|
||||||
DomPrinter() : DOTGraphTraitsPrinter<DominatorTree, false>("dom", ID) {
|
DomPrinter()
|
||||||
|
: DOTGraphTraitsPrinter<DominatorTreeWrapperPass, false, DominatorTree *,
|
||||||
|
DominatorTreeWrapperPassAnalysisGraphTraits>(
|
||||||
|
"dom", ID) {
|
||||||
initializeDomPrinterPass(*PassRegistry::getPassRegistry());
|
initializeDomPrinterPass(*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DomOnlyPrinter
|
struct DomOnlyPrinter : public DOTGraphTraitsPrinter<
|
||||||
: public DOTGraphTraitsPrinter<DominatorTree, true> {
|
DominatorTreeWrapperPass, true, DominatorTree *,
|
||||||
|
DominatorTreeWrapperPassAnalysisGraphTraits> {
|
||||||
static char ID;
|
static char ID;
|
||||||
DomOnlyPrinter() : DOTGraphTraitsPrinter<DominatorTree, true>("domonly", ID) {
|
DomOnlyPrinter()
|
||||||
|
: DOTGraphTraitsPrinter<DominatorTreeWrapperPass, true, DominatorTree *,
|
||||||
|
DominatorTreeWrapperPassAnalysisGraphTraits>(
|
||||||
|
"domonly", ID) {
|
||||||
initializeDomOnlyPrinterPass(*PassRegistry::getPassRegistry());
|
initializeDomOnlyPrinterPass(*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -16,7 +16,7 @@ using namespace llvm;
|
||||||
char DominanceFrontier::ID = 0;
|
char DominanceFrontier::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(DominanceFrontier, "domfrontier",
|
INITIALIZE_PASS_BEGIN(DominanceFrontier, "domfrontier",
|
||||||
"Dominance Frontier Construction", true, true)
|
"Dominance Frontier Construction", true, true)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_END(DominanceFrontier, "domfrontier",
|
INITIALIZE_PASS_END(DominanceFrontier, "domfrontier",
|
||||||
"Dominance Frontier Construction", true, true)
|
"Dominance Frontier Construction", true, true)
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ char IVUsers::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(IVUsers, "iv-users",
|
INITIALIZE_PASS_BEGIN(IVUsers, "iv-users",
|
||||||
"Induction Variable Users", false, true)
|
"Induction Variable Users", false, true)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
INITIALIZE_PASS_END(IVUsers, "iv-users",
|
INITIALIZE_PASS_END(IVUsers, "iv-users",
|
||||||
"Induction Variable Users", false, true)
|
"Induction Variable Users", false, true)
|
||||||
|
@ -223,7 +223,7 @@ IVUsers::IVUsers()
|
||||||
|
|
||||||
void IVUsers::getAnalysisUsage(AnalysisUsage &AU) const {
|
void IVUsers::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
}
|
}
|
||||||
|
@ -232,7 +232,7 @@ bool IVUsers::runOnLoop(Loop *l, LPPassManager &LPM) {
|
||||||
|
|
||||||
L = l;
|
L = l;
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
SE = &getAnalysis<ScalarEvolution>();
|
SE = &getAnalysis<ScalarEvolution>();
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ namespace {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
AU.addRequired<TargetLibraryInfo>();
|
AU.addRequired<TargetLibraryInfo>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
virtual void print(raw_ostream &O, const Module *M) const {}
|
virtual void print(raw_ostream &O, const Module *M) const {}
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ char Lint::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(Lint, "lint", "Statically lint-checks LLVM IR",
|
INITIALIZE_PASS_BEGIN(Lint, "lint", "Statically lint-checks LLVM IR",
|
||||||
false, true)
|
false, true)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||||
INITIALIZE_PASS_END(Lint, "lint", "Statically lint-checks LLVM IR",
|
INITIALIZE_PASS_END(Lint, "lint", "Statically lint-checks LLVM IR",
|
||||||
false, true)
|
false, true)
|
||||||
|
@ -175,7 +175,7 @@ INITIALIZE_PASS_END(Lint, "lint", "Statically lint-checks LLVM IR",
|
||||||
bool Lint::runOnFunction(Function &F) {
|
bool Lint::runOnFunction(Function &F) {
|
||||||
Mod = F.getParent();
|
Mod = F.getParent();
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
visit(F);
|
visit(F);
|
||||||
|
|
|
@ -46,7 +46,7 @@ VerifyLoopInfoX("verify-loop-info", cl::location(VerifyLoopInfo),
|
||||||
|
|
||||||
char LoopInfo::ID = 0;
|
char LoopInfo::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LoopInfo, "loops", "Natural Loop Information", true, true)
|
INITIALIZE_PASS_BEGIN(LoopInfo, "loops", "Natural Loop Information", true, true)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_END(LoopInfo, "loops", "Natural Loop Information", true, true)
|
INITIALIZE_PASS_END(LoopInfo, "loops", "Natural Loop Information", true, true)
|
||||||
|
|
||||||
// Loop identifier metadata name.
|
// Loop identifier metadata name.
|
||||||
|
@ -613,7 +613,7 @@ Loop *UnloopUpdater::getNearestLoop(BasicBlock *BB, Loop *BBLoop) {
|
||||||
//
|
//
|
||||||
bool LoopInfo::runOnFunction(Function &) {
|
bool LoopInfo::runOnFunction(Function &) {
|
||||||
releaseMemory();
|
releaseMemory();
|
||||||
LI.Analyze(getAnalysis<DominatorTree>().getBase());
|
LI.Analyze(getAnalysis<DominatorTreeWrapperPass>().getDomTree());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -704,7 +704,7 @@ void LoopInfo::verifyAnalysis() const {
|
||||||
|
|
||||||
void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const {
|
void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoopInfo::print(raw_ostream &OS, const Module*) const {
|
void LoopInfo::print(raw_ostream &OS, const Module*) const {
|
||||||
|
|
|
@ -88,7 +88,9 @@ void MemoryDependenceAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
bool MemoryDependenceAnalysis::runOnFunction(Function &) {
|
bool MemoryDependenceAnalysis::runOnFunction(Function &) {
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
DT = getAnalysisIfAvailable<DominatorTree>();
|
DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
if (!PredCache)
|
if (!PredCache)
|
||||||
PredCache.reset(new PredIteratorCache());
|
PredCache.reset(new PredIteratorCache());
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -706,7 +706,7 @@ void RegionInfo::Calculate(Function &F) {
|
||||||
bool RegionInfo::runOnFunction(Function &F) {
|
bool RegionInfo::runOnFunction(Function &F) {
|
||||||
releaseMemory();
|
releaseMemory();
|
||||||
|
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
PDT = &getAnalysis<PostDominatorTree>();
|
PDT = &getAnalysis<PostDominatorTree>();
|
||||||
DF = &getAnalysis<DominanceFrontier>();
|
DF = &getAnalysis<DominanceFrontier>();
|
||||||
|
|
||||||
|
@ -720,7 +720,7 @@ bool RegionInfo::runOnFunction(Function &F) {
|
||||||
|
|
||||||
void RegionInfo::getAnalysisUsage(AnalysisUsage &AU) const {
|
void RegionInfo::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
AU.addRequiredTransitive<DominatorTree>();
|
AU.addRequiredTransitive<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<PostDominatorTree>();
|
AU.addRequired<PostDominatorTree>();
|
||||||
AU.addRequired<DominanceFrontier>();
|
AU.addRequired<DominanceFrontier>();
|
||||||
}
|
}
|
||||||
|
@ -846,7 +846,7 @@ void RegionInfo::splitBlock(BasicBlock* NewBB, BasicBlock *OldBB)
|
||||||
char RegionInfo::ID = 0;
|
char RegionInfo::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(RegionInfo, "regions",
|
INITIALIZE_PASS_BEGIN(RegionInfo, "regions",
|
||||||
"Detect single entry single exit regions", true, true)
|
"Detect single entry single exit regions", true, true)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(PostDominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(PostDominatorTree)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominanceFrontier)
|
INITIALIZE_PASS_DEPENDENCY(DominanceFrontier)
|
||||||
INITIALIZE_PASS_END(RegionInfo, "regions",
|
INITIALIZE_PASS_END(RegionInfo, "regions",
|
||||||
|
|
|
@ -113,7 +113,7 @@ VerifySCEV("verify-scev",
|
||||||
INITIALIZE_PASS_BEGIN(ScalarEvolution, "scalar-evolution",
|
INITIALIZE_PASS_BEGIN(ScalarEvolution, "scalar-evolution",
|
||||||
"Scalar Evolution Analysis", false, true)
|
"Scalar Evolution Analysis", false, true)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||||
INITIALIZE_PASS_END(ScalarEvolution, "scalar-evolution",
|
INITIALIZE_PASS_END(ScalarEvolution, "scalar-evolution",
|
||||||
"Scalar Evolution Analysis", false, true)
|
"Scalar Evolution Analysis", false, true)
|
||||||
|
@ -7268,7 +7268,7 @@ bool ScalarEvolution::runOnFunction(Function &F) {
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7305,7 +7305,7 @@ void ScalarEvolution::releaseMemory() {
|
||||||
void ScalarEvolution::getAnalysisUsage(AnalysisUsage &AU) const {
|
void ScalarEvolution::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
AU.addRequiredTransitive<LoopInfo>();
|
AU.addRequiredTransitive<LoopInfo>();
|
||||||
AU.addRequiredTransitive<DominatorTree>();
|
AU.addRequiredTransitive<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<TargetLibraryInfo>();
|
AU.addRequired<TargetLibraryInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,10 +42,10 @@ namespace {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static char ID; // Pass identification, replacement for typeid.
|
static char ID; // Pass identification, replacement for typeid.
|
||||||
DwarfEHPrepare(const TargetMachine *TM) :
|
DwarfEHPrepare(const TargetMachine *TM)
|
||||||
FunctionPass(ID), TM(TM), RewindFunction(0) {
|
: FunctionPass(ID), TM(TM), RewindFunction(0) {
|
||||||
initializeDominatorTreePass(*PassRegistry::getPassRegistry());
|
initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool runOnFunction(Function &Fn);
|
virtual bool runOnFunction(Function &Fn);
|
||||||
|
|
||||||
|
|
|
@ -153,7 +153,7 @@ const char *LowerIntrinsics::getPassName() const {
|
||||||
void LowerIntrinsics::getAnalysisUsage(AnalysisUsage &AU) const {
|
void LowerIntrinsics::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
FunctionPass::getAnalysisUsage(AU);
|
FunctionPass::getAnalysisUsage(AU);
|
||||||
AU.addRequired<GCModuleInfo>();
|
AU.addRequired<GCModuleInfo>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// doInitialization - If this module uses the GC intrinsics, find them now.
|
/// doInitialization - If this module uses the GC intrinsics, find them now.
|
||||||
|
@ -270,8 +270,9 @@ bool LowerIntrinsics::runOnFunction(Function &F) {
|
||||||
|
|
||||||
// Custom lowering may modify the CFG, so dominators must be recomputed.
|
// Custom lowering may modify the CFG, so dominators must be recomputed.
|
||||||
if (UseCustomLoweringPass) {
|
if (UseCustomLoweringPass) {
|
||||||
if (DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>())
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
DT->DT->recalculate(F);
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>())
|
||||||
|
DTWP->getDomTree().recalculate(F);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MadeChange;
|
return MadeChange;
|
||||||
|
|
|
@ -60,7 +60,9 @@ StackProtector::getSSPLayout(const AllocaInst *AI) const {
|
||||||
bool StackProtector::runOnFunction(Function &Fn) {
|
bool StackProtector::runOnFunction(Function &Fn) {
|
||||||
F = &Fn;
|
F = &Fn;
|
||||||
M = F->getParent();
|
M = F->getParent();
|
||||||
DT = getAnalysisIfAvailable<DominatorTree>();
|
DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
TLI = TM->getTargetLowering();
|
TLI = TM->getTargetLowering();
|
||||||
|
|
||||||
if (!RequiresStackProtector())
|
if (!RequiresStackProtector())
|
||||||
|
|
|
@ -48,7 +48,7 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
void llvm::initializeCore(PassRegistry &Registry) {
|
void llvm::initializeCore(PassRegistry &Registry) {
|
||||||
initializeDominatorTreePass(Registry);
|
initializeDominatorTreeWrapperPassPass(Registry);
|
||||||
initializePrintModulePassWrapperPass(Registry);
|
initializePrintModulePassWrapperPass(Registry);
|
||||||
initializePrintFunctionPassWrapperPass(Registry);
|
initializePrintFunctionPassWrapperPass(Registry);
|
||||||
initializePrintBasicBlockPassPass(Registry);
|
initializePrintBasicBlockPassPass(Registry);
|
||||||
|
|
|
@ -64,35 +64,6 @@ bool BasicBlockEdge::isSingleEdge() const {
|
||||||
TEMPLATE_INSTANTIATION(class llvm::DomTreeNodeBase<BasicBlock>);
|
TEMPLATE_INSTANTIATION(class llvm::DomTreeNodeBase<BasicBlock>);
|
||||||
TEMPLATE_INSTANTIATION(class llvm::DominatorTreeBase<BasicBlock>);
|
TEMPLATE_INSTANTIATION(class llvm::DominatorTreeBase<BasicBlock>);
|
||||||
|
|
||||||
char DominatorTree::ID = 0;
|
|
||||||
INITIALIZE_PASS(DominatorTree, "domtree",
|
|
||||||
"Dominator Tree Construction", true, true)
|
|
||||||
|
|
||||||
bool DominatorTree::runOnFunction(Function &F) {
|
|
||||||
DT->recalculate(F);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DominatorTree::verifyAnalysis() const {
|
|
||||||
if (!VerifyDomInfo) return;
|
|
||||||
|
|
||||||
Function &F = *getRoot()->getParent();
|
|
||||||
|
|
||||||
DominatorTree OtherDT;
|
|
||||||
OtherDT.getBase().recalculate(F);
|
|
||||||
if (compare(OtherDT)) {
|
|
||||||
errs() << "DominatorTree is not up to date!\nComputed:\n";
|
|
||||||
print(errs());
|
|
||||||
errs() << "\nActual:\n";
|
|
||||||
OtherDT.print(errs());
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DominatorTree::print(raw_ostream &OS, const Module *) const {
|
|
||||||
DT->print(OS);
|
|
||||||
}
|
|
||||||
|
|
||||||
// dominates - Return true if Def dominates a use in User. This performs
|
// dominates - Return true if Def dominates a use in User. This performs
|
||||||
// the special checks necessary if Def and User are in the same basic block.
|
// the special checks necessary if Def and User are in the same basic block.
|
||||||
// Note that Def doesn't dominate a use in Def itself!
|
// Note that Def doesn't dominate a use in Def itself!
|
||||||
|
@ -210,8 +181,7 @@ bool DominatorTree::dominates(const BasicBlockEdge &BBE,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DominatorTree::dominates(const BasicBlockEdge &BBE,
|
bool DominatorTree::dominates(const BasicBlockEdge &BBE, const Use &U) const {
|
||||||
const Use &U) const {
|
|
||||||
// Assert that we have a single edge. We could handle them by simply
|
// Assert that we have a single edge. We could handle them by simply
|
||||||
// returning false, but since isSingleEdge is linear on the number of
|
// returning false, but since isSingleEdge is linear on the number of
|
||||||
// edges, the callers can normally handle them more efficiently.
|
// edges, the callers can normally handle them more efficiently.
|
||||||
|
@ -234,8 +204,7 @@ bool DominatorTree::dominates(const BasicBlockEdge &BBE,
|
||||||
return dominates(BBE, UseBB);
|
return dominates(BBE, UseBB);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DominatorTree::dominates(const Instruction *Def,
|
bool DominatorTree::dominates(const Instruction *Def, const Use &U) const {
|
||||||
const Use &U) const {
|
|
||||||
Instruction *UserInst = cast<Instruction>(U.getUser());
|
Instruction *UserInst = cast<Instruction>(U.getUser());
|
||||||
const BasicBlock *DefBB = Def->getParent();
|
const BasicBlock *DefBB = Def->getParent();
|
||||||
|
|
||||||
|
@ -300,3 +269,44 @@ bool DominatorTree::isReachableFromEntry(const Use &U) const {
|
||||||
// Everything else uses their operands in their own block.
|
// Everything else uses their operands in their own block.
|
||||||
return isReachableFromEntry(I->getParent());
|
return isReachableFromEntry(I->getParent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DominatorTree::verifyDomTree() const {
|
||||||
|
if (!VerifyDomInfo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Function &F = *getRoot()->getParent();
|
||||||
|
|
||||||
|
DominatorTree OtherDT;
|
||||||
|
OtherDT.recalculate(F);
|
||||||
|
if (compare(OtherDT)) {
|
||||||
|
errs() << "DominatorTree is not up to date!\nComputed:\n";
|
||||||
|
print(errs());
|
||||||
|
errs() << "\nActual:\n";
|
||||||
|
OtherDT.print(errs());
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// DominatorTreeWrapperPass Implementation
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// The implementation details of the wrapper pass that holds a DominatorTree.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
char DominatorTreeWrapperPass::ID = 0;
|
||||||
|
INITIALIZE_PASS(DominatorTreeWrapperPass, "domtree",
|
||||||
|
"Dominator Tree Construction", true, true)
|
||||||
|
|
||||||
|
bool DominatorTreeWrapperPass::runOnFunction(Function &F) {
|
||||||
|
DT.recalculate(F);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DominatorTreeWrapperPass::verifyAnalysis() const { DT.verifyDomTree(); }
|
||||||
|
|
||||||
|
void DominatorTreeWrapperPass::print(raw_ostream &OS, const Module *) const {
|
||||||
|
DT.print(OS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -176,7 +176,7 @@ namespace {
|
||||||
|
|
||||||
bool runOnFunction(Function &F) {
|
bool runOnFunction(Function &F) {
|
||||||
// Get dominator information if we are being run by PassManager
|
// Get dominator information if we are being run by PassManager
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
Mod = F.getParent();
|
Mod = F.getParent();
|
||||||
if (!Context) Context = &F.getContext();
|
if (!Context) Context = &F.getContext();
|
||||||
|
@ -233,7 +233,7 @@ namespace {
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
AU.addRequiredID(PreVerifyID);
|
AU.addRequiredID(PreVerifyID);
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// abortIfBroken - If the module is broken and we are supposed to abort on
|
/// abortIfBroken - If the module is broken and we are supposed to abort on
|
||||||
|
@ -395,7 +395,7 @@ namespace {
|
||||||
char Verifier::ID = 0;
|
char Verifier::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(Verifier, "verify", "Module Verifier", false, false)
|
INITIALIZE_PASS_BEGIN(Verifier, "verify", "Module Verifier", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(PreVerifier)
|
INITIALIZE_PASS_DEPENDENCY(PreVerifier)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_END(Verifier, "verify", "Module Verifier", false, false)
|
INITIALIZE_PASS_END(Verifier, "verify", "Module Verifier", false, false)
|
||||||
|
|
||||||
// Assert - We know that cond should be true, if not print an error message.
|
// Assert - We know that cond should be true, if not print an error message.
|
||||||
|
|
|
@ -96,8 +96,8 @@ namespace {
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ namespace {
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(PPCCTRLoops, "ppc-ctr-loops", "PowerPC CTR Loops",
|
INITIALIZE_PASS_BEGIN(PPCCTRLoops, "ppc-ctr-loops", "PowerPC CTR Loops",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
INITIALIZE_PASS_END(PPCCTRLoops, "ppc-ctr-loops", "PowerPC CTR Loops",
|
INITIALIZE_PASS_END(PPCCTRLoops, "ppc-ctr-loops", "PowerPC CTR Loops",
|
||||||
|
@ -170,7 +170,7 @@ FunctionPass *llvm::createPPCCTRLoopsVerify() {
|
||||||
bool PPCCTRLoops::runOnFunction(Function &F) {
|
bool PPCCTRLoops::runOnFunction(Function &F) {
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
SE = &getAnalysis<ScalarEvolution>();
|
SE = &getAnalysis<ScalarEvolution>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
LibInfo = getAnalysisIfAvailable<TargetLibraryInfo>();
|
LibInfo = getAnalysisIfAvailable<TargetLibraryInfo>();
|
||||||
|
|
||||||
|
|
|
@ -98,8 +98,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
FunctionPass::getAnalysisUsage(AU);
|
FunctionPass::getAnalysisUsage(AU);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +289,7 @@ void SIAnnotateControlFlow::closeControlFlow(BasicBlock *BB) {
|
||||||
/// \brief Annotate the control flow with intrinsics so the backend can
|
/// \brief Annotate the control flow with intrinsics so the backend can
|
||||||
/// recognize if/then/else and loops.
|
/// recognize if/then/else and loops.
|
||||||
bool SIAnnotateControlFlow::runOnFunction(Function &F) {
|
bool SIAnnotateControlFlow::runOnFunction(Function &F) {
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
for (df_iterator<BasicBlock *> I = df_begin(&F.getEntryBlock()),
|
for (df_iterator<BasicBlock *> I = df_begin(&F.getEntryBlock()),
|
||||||
E = df_end(&F.getEntryBlock()); I != E; ++I) {
|
E = df_end(&F.getEntryBlock()); I != E; ++I) {
|
||||||
|
|
|
@ -47,7 +47,7 @@ namespace {
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequiredID(BreakCriticalEdgesID);
|
AU.addRequiredID(BreakCriticalEdgesID);
|
||||||
AU.addRequiredID(LoopSimplifyID);
|
AU.addRequiredID(LoopSimplifyID);
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ INITIALIZE_PASS_BEGIN(LoopExtractor, "loop-extract",
|
||||||
"Extract loops into new functions", false, false)
|
"Extract loops into new functions", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(BreakCriticalEdges)
|
INITIALIZE_PASS_DEPENDENCY(BreakCriticalEdges)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_END(LoopExtractor, "loop-extract",
|
INITIALIZE_PASS_END(LoopExtractor, "loop-extract",
|
||||||
"Extract loops into new functions", false, false)
|
"Extract loops into new functions", false, false)
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ bool LoopExtractor::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||||
if (!L->isLoopSimplifyForm())
|
if (!L->isLoopSimplifyForm())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DominatorTree &DT = getAnalysis<DominatorTree>();
|
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
|
||||||
// If there is more than one top-level loop in this function, extract all of
|
// If there is more than one top-level loop in this function, extract all of
|
||||||
|
|
|
@ -119,8 +119,8 @@ Function* PartialInliner::unswitchFunction(Function* F) {
|
||||||
|
|
||||||
// The CodeExtractor needs a dominator tree.
|
// The CodeExtractor needs a dominator tree.
|
||||||
DominatorTree DT;
|
DominatorTree DT;
|
||||||
DT.runOnFunction(*duplicateFunction);
|
DT.recalculate(*duplicateFunction);
|
||||||
|
|
||||||
// Extract the body of the if.
|
// Extract the body of the if.
|
||||||
Function* extractedFunction
|
Function* extractedFunction
|
||||||
= CodeExtractor(toExtract, &DT).extractCodeRegion();
|
= CodeExtractor(toExtract, &DT).extractCodeRegion();
|
||||||
|
|
|
@ -95,7 +95,7 @@ char ObjCARCContract::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(ObjCARCContract,
|
INITIALIZE_PASS_BEGIN(ObjCARCContract,
|
||||||
"objc-arc-contract", "ObjC ARC contraction", false, false)
|
"objc-arc-contract", "ObjC ARC contraction", false, false)
|
||||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_END(ObjCARCContract,
|
INITIALIZE_PASS_END(ObjCARCContract,
|
||||||
"objc-arc-contract", "ObjC ARC contraction", false, false)
|
"objc-arc-contract", "ObjC ARC contraction", false, false)
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ Pass *llvm::createObjCARCContractPass() {
|
||||||
|
|
||||||
void ObjCARCContract::getAnalysisUsage(AnalysisUsage &AU) const {
|
void ObjCARCContract::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -323,7 +323,7 @@ bool ObjCARCContract::runOnFunction(Function &F) {
|
||||||
|
|
||||||
Changed = false;
|
Changed = false;
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
PA.setAA(&getAnalysis<AliasAnalysis>());
|
PA.setAA(&getAnalysis<AliasAnalysis>());
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ namespace {
|
||||||
const char *getPassName() const { return "CodeGen Prepare"; }
|
const char *getPassName() const { return "CodeGen Prepare"; }
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<TargetLibraryInfo>();
|
AU.addRequired<TargetLibraryInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,9 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
|
||||||
ModifiedDT = false;
|
ModifiedDT = false;
|
||||||
if (TM) TLI = TM->getTargetLowering();
|
if (TM) TLI = TM->getTargetLowering();
|
||||||
TLInfo = &getAnalysis<TargetLibraryInfo>();
|
TLInfo = &getAnalysis<TargetLibraryInfo>();
|
||||||
DT = getAnalysisIfAvailable<DominatorTree>();
|
DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
OptSize = F.getAttributes().hasAttribute(AttributeSet::FunctionIndex,
|
OptSize = F.getAttributes().hasAttribute(AttributeSet::FunctionIndex,
|
||||||
Attribute::OptimizeForSize);
|
Attribute::OptimizeForSize);
|
||||||
|
|
||||||
|
@ -219,7 +221,7 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ModifiedDT && DT)
|
if (ModifiedDT && DT)
|
||||||
DT->DT->recalculate(F);
|
DT->recalculate(F);
|
||||||
|
|
||||||
return EverMadeChange;
|
return EverMadeChange;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ namespace {
|
||||||
virtual bool runOnFunction(Function &F) {
|
virtual bool runOnFunction(Function &F) {
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
MD = &getAnalysis<MemoryDependenceAnalysis>();
|
MD = &getAnalysis<MemoryDependenceAnalysis>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
TLI = AA->getTargetLibraryInfo();
|
TLI = AA->getTargetLibraryInfo();
|
||||||
|
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
@ -78,11 +78,11 @@ namespace {
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
AU.addRequired<MemoryDependenceAnalysis>();
|
AU.addRequired<MemoryDependenceAnalysis>();
|
||||||
AU.addPreserved<AliasAnalysis>();
|
AU.addPreserved<AliasAnalysis>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<MemoryDependenceAnalysis>();
|
AU.addPreserved<MemoryDependenceAnalysis>();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -90,7 +90,7 @@ namespace {
|
||||||
|
|
||||||
char DSE::ID = 0;
|
char DSE::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(DSE, "dse", "Dead Store Elimination", false, false)
|
INITIALIZE_PASS_BEGIN(DSE, "dse", "Dead Store Elimination", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
|
||||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||||
INITIALIZE_PASS_END(DSE, "dse", "Dead Store Elimination", false, false)
|
INITIALIZE_PASS_END(DSE, "dse", "Dead Store Elimination", false, false)
|
||||||
|
|
|
@ -377,7 +377,7 @@ private:
|
||||||
|
|
||||||
// This transformation requires dominator postdominator info
|
// This transformation requires dominator postdominator info
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<TargetLibraryInfo>();
|
AU.addRequired<TargetLibraryInfo>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
}
|
}
|
||||||
|
@ -392,7 +392,7 @@ FunctionPass *llvm::createEarlyCSEPass() {
|
||||||
}
|
}
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(EarlyCSE, "early-cse", "Early CSE", false, false)
|
INITIALIZE_PASS_BEGIN(EarlyCSE, "early-cse", "Early CSE", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||||
INITIALIZE_PASS_END(EarlyCSE, "early-cse", "Early CSE", false, false)
|
INITIALIZE_PASS_END(EarlyCSE, "early-cse", "Early CSE", false, false)
|
||||||
|
|
||||||
|
@ -556,7 +556,7 @@ bool EarlyCSE::runOnFunction(Function &F) {
|
||||||
|
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
// Tables that the pass uses when walking the domtree.
|
// Tables that the pass uses when walking the domtree.
|
||||||
ScopedHTType AVTable;
|
ScopedHTType AVTable;
|
||||||
|
|
|
@ -677,13 +677,13 @@ namespace {
|
||||||
|
|
||||||
// This transformation requires dominator postdominator info
|
// This transformation requires dominator postdominator info
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<TargetLibraryInfo>();
|
AU.addRequired<TargetLibraryInfo>();
|
||||||
if (!NoLoads)
|
if (!NoLoads)
|
||||||
AU.addRequired<MemoryDependenceAnalysis>();
|
AU.addRequired<MemoryDependenceAnalysis>();
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
|
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<AliasAnalysis>();
|
AU.addPreserved<AliasAnalysis>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -726,7 +726,7 @@ FunctionPass *llvm::createGVNPass(bool NoLoads) {
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(GVN, "gvn", "Global Value Numbering", false, false)
|
INITIALIZE_PASS_BEGIN(GVN, "gvn", "Global Value Numbering", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||||
INITIALIZE_PASS_END(GVN, "gvn", "Global Value Numbering", false, false)
|
INITIALIZE_PASS_END(GVN, "gvn", "Global Value Numbering", false, false)
|
||||||
|
@ -2315,7 +2315,7 @@ bool GVN::processInstruction(Instruction *I) {
|
||||||
bool GVN::runOnFunction(Function& F) {
|
bool GVN::runOnFunction(Function& F) {
|
||||||
if (!NoLoads)
|
if (!NoLoads)
|
||||||
MD = &getAnalysis<MemoryDependenceAnalysis>();
|
MD = &getAnalysis<MemoryDependenceAnalysis>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
|
VN.setAliasAnalysis(&getAnalysis<AliasAnalysis>());
|
||||||
|
|
|
@ -87,7 +87,7 @@ namespace {
|
||||||
virtual bool runOnLoop(Loop *L, LPPassManager &LPM);
|
virtual bool runOnLoop(Loop *L, LPPassManager &LPM);
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.addRequiredID(LoopSimplifyID);
|
AU.addRequiredID(LoopSimplifyID);
|
||||||
|
@ -122,7 +122,7 @@ namespace {
|
||||||
char IndVarSimplify::ID = 0;
|
char IndVarSimplify::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(IndVarSimplify, "indvars",
|
INITIALIZE_PASS_BEGIN(IndVarSimplify, "indvars",
|
||||||
"Induction Variable Simplification", false, false)
|
"Induction Variable Simplification", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
||||||
|
@ -1798,7 +1798,7 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||||
|
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
SE = &getAnalysis<ScalarEvolution>();
|
SE = &getAnalysis<ScalarEvolution>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
TLI = getAnalysisIfAvailable<TargetLibraryInfo>();
|
TLI = getAnalysisIfAvailable<TargetLibraryInfo>();
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ namespace {
|
||||||
///
|
///
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addRequiredID(LoopSimplifyID);
|
AU.addRequiredID(LoopSimplifyID);
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
|
@ -189,7 +189,7 @@ namespace {
|
||||||
|
|
||||||
char LICM::ID = 0;
|
char LICM::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LICM, "licm", "Loop Invariant Code Motion", false, false)
|
INITIALIZE_PASS_BEGIN(LICM, "licm", "Loop Invariant Code Motion", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||||
|
@ -208,7 +208,7 @@ bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||||
// Get our Loop and Alias Analysis information...
|
// Get our Loop and Alias Analysis information...
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
|
|
|
@ -37,14 +37,14 @@ namespace {
|
||||||
bool runOnLoop(Loop *L, LPPassManager &LPM);
|
bool runOnLoop(Loop *L, LPPassManager &LPM);
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.addRequiredID(LoopSimplifyID);
|
AU.addRequiredID(LoopSimplifyID);
|
||||||
AU.addRequiredID(LCSSAID);
|
AU.addRequiredID(LCSSAID);
|
||||||
|
|
||||||
AU.addPreserved<ScalarEvolution>();
|
AU.addPreserved<ScalarEvolution>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addPreservedID(LoopSimplifyID);
|
AU.addPreservedID(LoopSimplifyID);
|
||||||
AU.addPreservedID(LCSSAID);
|
AU.addPreservedID(LCSSAID);
|
||||||
|
@ -61,7 +61,7 @@ namespace {
|
||||||
char LoopDeletion::ID = 0;
|
char LoopDeletion::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LoopDeletion, "loop-deletion",
|
INITIALIZE_PASS_BEGIN(LoopDeletion, "loop-deletion",
|
||||||
"Delete dead loops", false, false)
|
"Delete dead loops", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
||||||
|
@ -202,7 +202,7 @@ bool LoopDeletion::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||||
|
|
||||||
// Update the dominator tree and remove the instructions and blocks that will
|
// Update the dominator tree and remove the instructions and blocks that will
|
||||||
// be deleted from the reference counting scheme.
|
// be deleted from the reference counting scheme.
|
||||||
DominatorTree &DT = getAnalysis<DominatorTree>();
|
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
SmallVector<DomTreeNode*, 8> ChildNodes;
|
SmallVector<DomTreeNode*, 8> ChildNodes;
|
||||||
for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
|
for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
|
||||||
LI != LE; ++LI) {
|
LI != LE; ++LI) {
|
||||||
|
|
|
@ -175,8 +175,8 @@ namespace {
|
||||||
AU.addPreserved<AliasAnalysis>();
|
AU.addPreserved<AliasAnalysis>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.addPreserved<ScalarEvolution>();
|
AU.addPreserved<ScalarEvolution>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<TargetLibraryInfo>();
|
AU.addRequired<TargetLibraryInfo>();
|
||||||
AU.addRequired<TargetTransformInfo>();
|
AU.addRequired<TargetTransformInfo>();
|
||||||
}
|
}
|
||||||
|
@ -186,7 +186,8 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
DominatorTree *getDominatorTree() {
|
DominatorTree *getDominatorTree() {
|
||||||
return DT ? DT : (DT=&getAnalysis<DominatorTree>());
|
return DT ? DT
|
||||||
|
: (DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree());
|
||||||
}
|
}
|
||||||
|
|
||||||
ScalarEvolution *getScalarEvolution() {
|
ScalarEvolution *getScalarEvolution() {
|
||||||
|
@ -213,7 +214,7 @@ char LoopIdiomRecognize::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LoopIdiomRecognize, "loop-idiom", "Recognize loop idioms",
|
INITIALIZE_PASS_BEGIN(LoopIdiomRecognize, "loop-idiom", "Recognize loop idioms",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
|
|
|
@ -54,7 +54,7 @@ char LoopInstSimplify::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LoopInstSimplify, "loop-instsimplify",
|
INITIALIZE_PASS_BEGIN(LoopInstSimplify, "loop-instsimplify",
|
||||||
"Simplify instructions in loops", false, false)
|
"Simplify instructions in loops", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
||||||
INITIALIZE_PASS_END(LoopInstSimplify, "loop-instsimplify",
|
INITIALIZE_PASS_END(LoopInstSimplify, "loop-instsimplify",
|
||||||
|
@ -65,7 +65,9 @@ Pass *llvm::createLoopInstSimplifyPass() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
bool LoopInstSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||||
DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
|
DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
DominatorTree *DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
||||||
const DataLayout *TD = getAnalysisIfAvailable<DataLayout>();
|
const DataLayout *TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
|
const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
|
|
|
@ -131,8 +131,8 @@ namespace {
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.addRequired<TargetLibraryInfo>();
|
AU.addRequired<TargetLibraryInfo>();
|
||||||
}
|
}
|
||||||
|
@ -341,7 +341,7 @@ char LoopReroll::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LoopReroll, "loop-reroll", "Reroll loops", false, false)
|
INITIALIZE_PASS_BEGIN(LoopReroll, "loop-reroll", "Reroll loops", false, false)
|
||||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||||
INITIALIZE_PASS_END(LoopReroll, "loop-reroll", "Reroll loops", false, false)
|
INITIALIZE_PASS_END(LoopReroll, "loop-reroll", "Reroll loops", false, false)
|
||||||
|
@ -1139,7 +1139,7 @@ bool LoopReroll::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||||
SE = &getAnalysis<ScalarEvolution>();
|
SE = &getAnalysis<ScalarEvolution>();
|
||||||
TLI = &getAnalysis<TargetLibraryInfo>();
|
TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
DL = getAnalysisIfAvailable<DataLayout>();
|
DL = getAnalysisIfAvailable<DataLayout>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
BasicBlock *Header = L->getHeader();
|
BasicBlock *Header = L->getHeader();
|
||||||
DEBUG(dbgs() << "LRR: F[" << Header->getParent()->getName() <<
|
DEBUG(dbgs() << "LRR: F[" << Header->getParent()->getName() <<
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace {
|
||||||
|
|
||||||
// LCSSA form makes instruction renaming easier.
|
// LCSSA form makes instruction renaming easier.
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addRequiredID(LoopSimplifyID);
|
AU.addRequiredID(LoopSimplifyID);
|
||||||
|
@ -252,8 +252,9 @@ bool LoopRotate::simplifyLoopLatch(Loop *L) {
|
||||||
// Nuke the Latch block.
|
// Nuke the Latch block.
|
||||||
assert(Latch->empty() && "unable to evacuate Latch");
|
assert(Latch->empty() && "unable to evacuate Latch");
|
||||||
LI->removeBlock(Latch);
|
LI->removeBlock(Latch);
|
||||||
if (DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>())
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
DT->eraseNode(Latch);
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>())
|
||||||
|
DTWP->getDomTree().eraseNode(Latch);
|
||||||
Latch->eraseFromParent();
|
Latch->eraseFromParent();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -434,23 +435,25 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
|
||||||
// The conditional branch can't be folded, handle the general case.
|
// The conditional branch can't be folded, handle the general case.
|
||||||
// Update DominatorTree to reflect the CFG change we just made. Then split
|
// Update DominatorTree to reflect the CFG change we just made. Then split
|
||||||
// edges as necessary to preserve LoopSimplify form.
|
// edges as necessary to preserve LoopSimplify form.
|
||||||
if (DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>()) {
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>()) {
|
||||||
|
DominatorTree &DT = DTWP->getDomTree();
|
||||||
// Everything that was dominated by the old loop header is now dominated
|
// Everything that was dominated by the old loop header is now dominated
|
||||||
// by the original loop preheader. Conceptually the header was merged
|
// by the original loop preheader. Conceptually the header was merged
|
||||||
// into the preheader, even though we reuse the actual block as a new
|
// into the preheader, even though we reuse the actual block as a new
|
||||||
// loop latch.
|
// loop latch.
|
||||||
DomTreeNode *OrigHeaderNode = DT->getNode(OrigHeader);
|
DomTreeNode *OrigHeaderNode = DT.getNode(OrigHeader);
|
||||||
SmallVector<DomTreeNode *, 8> HeaderChildren(OrigHeaderNode->begin(),
|
SmallVector<DomTreeNode *, 8> HeaderChildren(OrigHeaderNode->begin(),
|
||||||
OrigHeaderNode->end());
|
OrigHeaderNode->end());
|
||||||
DomTreeNode *OrigPreheaderNode = DT->getNode(OrigPreheader);
|
DomTreeNode *OrigPreheaderNode = DT.getNode(OrigPreheader);
|
||||||
for (unsigned I = 0, E = HeaderChildren.size(); I != E; ++I)
|
for (unsigned I = 0, E = HeaderChildren.size(); I != E; ++I)
|
||||||
DT->changeImmediateDominator(HeaderChildren[I], OrigPreheaderNode);
|
DT.changeImmediateDominator(HeaderChildren[I], OrigPreheaderNode);
|
||||||
|
|
||||||
assert(DT->getNode(Exit)->getIDom() == OrigPreheaderNode);
|
assert(DT.getNode(Exit)->getIDom() == OrigPreheaderNode);
|
||||||
assert(DT->getNode(NewHeader)->getIDom() == OrigPreheaderNode);
|
assert(DT.getNode(NewHeader)->getIDom() == OrigPreheaderNode);
|
||||||
|
|
||||||
// Update OrigHeader to be dominated by the new header block.
|
// Update OrigHeader to be dominated by the new header block.
|
||||||
DT->changeImmediateDominator(OrigHeader, OrigLatch);
|
DT.changeImmediateDominator(OrigHeader, OrigLatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right now OrigPreHeader has two successors, NewHeader and ExitBlock, and
|
// Right now OrigPreHeader has two successors, NewHeader and ExitBlock, and
|
||||||
|
@ -472,15 +475,17 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
|
||||||
PHBI->eraseFromParent();
|
PHBI->eraseFromParent();
|
||||||
|
|
||||||
// With our CFG finalized, update DomTree if it is available.
|
// With our CFG finalized, update DomTree if it is available.
|
||||||
if (DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>()) {
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>()) {
|
||||||
|
DominatorTree &DT = DTWP->getDomTree();
|
||||||
// Update OrigHeader to be dominated by the new header block.
|
// Update OrigHeader to be dominated by the new header block.
|
||||||
DT->changeImmediateDominator(NewHeader, OrigPreheader);
|
DT.changeImmediateDominator(NewHeader, OrigPreheader);
|
||||||
DT->changeImmediateDominator(OrigHeader, OrigLatch);
|
DT.changeImmediateDominator(OrigHeader, OrigLatch);
|
||||||
|
|
||||||
// Brute force incremental dominator tree update. Call
|
// Brute force incremental dominator tree update. Call
|
||||||
// findNearestCommonDominator on all CFG predecessors of each child of the
|
// findNearestCommonDominator on all CFG predecessors of each child of the
|
||||||
// original header.
|
// original header.
|
||||||
DomTreeNode *OrigHeaderNode = DT->getNode(OrigHeader);
|
DomTreeNode *OrigHeaderNode = DT.getNode(OrigHeader);
|
||||||
SmallVector<DomTreeNode *, 8> HeaderChildren(OrigHeaderNode->begin(),
|
SmallVector<DomTreeNode *, 8> HeaderChildren(OrigHeaderNode->begin(),
|
||||||
OrigHeaderNode->end());
|
OrigHeaderNode->end());
|
||||||
bool Changed;
|
bool Changed;
|
||||||
|
@ -493,11 +498,11 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
|
||||||
pred_iterator PI = pred_begin(BB);
|
pred_iterator PI = pred_begin(BB);
|
||||||
BasicBlock *NearestDom = *PI;
|
BasicBlock *NearestDom = *PI;
|
||||||
for (pred_iterator PE = pred_end(BB); PI != PE; ++PI)
|
for (pred_iterator PE = pred_end(BB); PI != PE; ++PI)
|
||||||
NearestDom = DT->findNearestCommonDominator(NearestDom, *PI);
|
NearestDom = DT.findNearestCommonDominator(NearestDom, *PI);
|
||||||
|
|
||||||
// Remember if this changes the DomTree.
|
// Remember if this changes the DomTree.
|
||||||
if (Node->getIDom()->getBlock() != NearestDom) {
|
if (Node->getIDom()->getBlock() != NearestDom) {
|
||||||
DT->changeImmediateDominator(BB, NearestDom);
|
DT.changeImmediateDominator(BB, NearestDom);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4694,7 +4694,8 @@ LSRInstance::ImplementSolution(const SmallVectorImpl<const Formula *> &Solution,
|
||||||
|
|
||||||
LSRInstance::LSRInstance(Loop *L, Pass *P)
|
LSRInstance::LSRInstance(Loop *L, Pass *P)
|
||||||
: IU(P->getAnalysis<IVUsers>()), SE(P->getAnalysis<ScalarEvolution>()),
|
: IU(P->getAnalysis<IVUsers>()), SE(P->getAnalysis<ScalarEvolution>()),
|
||||||
DT(P->getAnalysis<DominatorTree>()), LI(P->getAnalysis<LoopInfo>()),
|
DT(P->getAnalysis<DominatorTreeWrapperPass>().getDomTree()),
|
||||||
|
LI(P->getAnalysis<LoopInfo>()),
|
||||||
TTI(P->getAnalysis<TargetTransformInfo>()), L(L), Changed(false),
|
TTI(P->getAnalysis<TargetTransformInfo>()), L(L), Changed(false),
|
||||||
IVIncInsertPos(0) {
|
IVIncInsertPos(0) {
|
||||||
// If LoopSimplify form is not available, stay out of trouble.
|
// If LoopSimplify form is not available, stay out of trouble.
|
||||||
|
@ -4873,7 +4874,7 @@ char LoopStrengthReduce::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LoopStrengthReduce, "loop-reduce",
|
INITIALIZE_PASS_BEGIN(LoopStrengthReduce, "loop-reduce",
|
||||||
"Loop Strength Reduction", false, false)
|
"Loop Strength Reduction", false, false)
|
||||||
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
INITIALIZE_PASS_DEPENDENCY(IVUsers)
|
INITIALIZE_PASS_DEPENDENCY(IVUsers)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
|
@ -4898,8 +4899,8 @@ void LoopStrengthReduce::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addRequiredID(LoopSimplifyID);
|
AU.addRequiredID(LoopSimplifyID);
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.addPreserved<ScalarEvolution>();
|
AU.addPreserved<ScalarEvolution>();
|
||||||
// Requiring LoopSimplify a second time here prevents IVUsers from running
|
// Requiring LoopSimplify a second time here prevents IVUsers from running
|
||||||
|
@ -4924,10 +4925,9 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager & /*LPM*/) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
Rewriter.setDebugType(DEBUG_TYPE);
|
Rewriter.setDebugType(DEBUG_TYPE);
|
||||||
#endif
|
#endif
|
||||||
unsigned numFolded =
|
unsigned numFolded = Rewriter.replaceCongruentIVs(
|
||||||
Rewriter.replaceCongruentIVs(L, &getAnalysis<DominatorTree>(),
|
L, &getAnalysis<DominatorTreeWrapperPass>().getDomTree(), DeadInsts,
|
||||||
DeadInsts,
|
&getAnalysis<TargetTransformInfo>());
|
||||||
&getAnalysis<TargetTransformInfo>());
|
|
||||||
if (numFolded) {
|
if (numFolded) {
|
||||||
Changed = true;
|
Changed = true;
|
||||||
DeleteTriviallyDeadInstructions(DeadInsts);
|
DeleteTriviallyDeadInstructions(DeadInsts);
|
||||||
|
|
|
@ -106,7 +106,7 @@ namespace {
|
||||||
// If loop unroll does not preserve dom info then LCSSA pass on next
|
// If loop unroll does not preserve dom info then LCSSA pass on next
|
||||||
// loop will receive invalid dom info.
|
// loop will receive invalid dom info.
|
||||||
// For now, recreate dom info, if loop is unrolled.
|
// For now, recreate dom info, if loop is unrolled.
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,7 +169,7 @@ namespace {
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addRequiredID(LCSSAID);
|
AU.addRequiredID(LCSSAID);
|
||||||
AU.addPreservedID(LCSSAID);
|
AU.addPreservedID(LCSSAID);
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<ScalarEvolution>();
|
AU.addPreserved<ScalarEvolution>();
|
||||||
AU.addRequired<TargetTransformInfo>();
|
AU.addRequired<TargetTransformInfo>();
|
||||||
}
|
}
|
||||||
|
@ -384,7 +384,9 @@ static Value *FindLIVLoopCondition(Value *Cond, Loop *L, bool &Changed) {
|
||||||
bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPM_Ref) {
|
bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPM_Ref) {
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
LPM = &LPM_Ref;
|
LPM = &LPM_Ref;
|
||||||
DT = getAnalysisIfAvailable<DominatorTree>();
|
DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
currentLoop = L;
|
currentLoop = L;
|
||||||
Function *F = currentLoop->getHeader()->getParent();
|
Function *F = currentLoop->getHeader()->getParent();
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
@ -397,7 +399,7 @@ bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPM_Ref) {
|
||||||
if (Changed) {
|
if (Changed) {
|
||||||
// FIXME: Reconstruct dom info, because it is not preserved properly.
|
// FIXME: Reconstruct dom info, because it is not preserved properly.
|
||||||
if (DT)
|
if (DT)
|
||||||
DT->runOnFunction(*F);
|
DT->recalculate(*F);
|
||||||
}
|
}
|
||||||
return Changed;
|
return Changed;
|
||||||
}
|
}
|
||||||
|
|
|
@ -321,7 +321,7 @@ namespace {
|
||||||
// This transformation requires dominator postdominator info
|
// This transformation requires dominator postdominator info
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<MemoryDependenceAnalysis>();
|
AU.addRequired<MemoryDependenceAnalysis>();
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
AU.addRequired<TargetLibraryInfo>();
|
AU.addRequired<TargetLibraryInfo>();
|
||||||
|
@ -353,7 +353,7 @@ FunctionPass *llvm::createMemCpyOptPass() { return new MemCpyOpt(); }
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(MemCpyOpt, "memcpyopt", "MemCpy Optimization",
|
INITIALIZE_PASS_BEGIN(MemCpyOpt, "memcpyopt", "MemCpy Optimization",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
|
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)
|
||||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
|
||||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||||
|
@ -680,7 +680,7 @@ bool MemCpyOpt::performCallSlotOptzn(Instruction *cpy,
|
||||||
|
|
||||||
// Since we're changing the parameter to the callsite, we need to make sure
|
// Since we're changing the parameter to the callsite, we need to make sure
|
||||||
// that what would be the new parameter dominates the callsite.
|
// that what would be the new parameter dominates the callsite.
|
||||||
DominatorTree &DT = getAnalysis<DominatorTree>();
|
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
if (Instruction *cpyDestInst = dyn_cast<Instruction>(cpyDest))
|
if (Instruction *cpyDestInst = dyn_cast<Instruction>(cpyDest))
|
||||||
if (!DT.dominates(cpyDestInst, C))
|
if (!DT.dominates(cpyDestInst, C))
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -930,7 +930,7 @@ FunctionPass *llvm::createSROAPass(bool RequiresDomTree) {
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(SROA, "sroa", "Scalar Replacement Of Aggregates",
|
INITIALIZE_PASS_BEGIN(SROA, "sroa", "Scalar Replacement Of Aggregates",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_END(SROA, "sroa", "Scalar Replacement Of Aggregates",
|
INITIALIZE_PASS_END(SROA, "sroa", "Scalar Replacement Of Aggregates",
|
||||||
false, false)
|
false, false)
|
||||||
|
|
||||||
|
@ -3545,7 +3545,9 @@ bool SROA::runOnFunction(Function &F) {
|
||||||
DEBUG(dbgs() << " Skipping SROA -- no target data!\n");
|
DEBUG(dbgs() << " Skipping SROA -- no target data!\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
DT = getAnalysisIfAvailable<DominatorTree>();
|
DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
|
|
||||||
BasicBlock &EntryBB = F.getEntryBlock();
|
BasicBlock &EntryBB = F.getEntryBlock();
|
||||||
for (BasicBlock::iterator I = EntryBB.begin(), E = llvm::prior(EntryBB.end());
|
for (BasicBlock::iterator I = EntryBB.begin(), E = llvm::prior(EntryBB.end());
|
||||||
|
@ -3587,6 +3589,6 @@ bool SROA::runOnFunction(Function &F) {
|
||||||
|
|
||||||
void SROA::getAnalysisUsage(AnalysisUsage &AU) const {
|
void SROA::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
if (RequiresDomTree)
|
if (RequiresDomTree)
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
}
|
}
|
||||||
|
|
|
@ -254,7 +254,7 @@ public:
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<PostDominatorTree>();
|
AU.addRequired<PostDominatorTree>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,7 +628,7 @@ void SampleFunctionProfile::findEquivalenceClasses(Function &F) {
|
||||||
// If all those conditions hold, BB2's equivalence class is BB1.
|
// If all those conditions hold, BB2's equivalence class is BB1.
|
||||||
DominatedBBs.clear();
|
DominatedBBs.clear();
|
||||||
PDT->getDescendants(BB1, DominatedBBs);
|
PDT->getDescendants(BB1, DominatedBBs);
|
||||||
findEquivalencesFor(BB1, DominatedBBs, DT->DT);
|
findEquivalencesFor(BB1, DominatedBBs, DT);
|
||||||
|
|
||||||
DEBUG(printBlockEquivalence(dbgs(), BB1));
|
DEBUG(printBlockEquivalence(dbgs(), BB1));
|
||||||
}
|
}
|
||||||
|
@ -988,7 +988,7 @@ bool SampleFunctionProfile::emitAnnotations(Function &F, DominatorTree *DomTree,
|
||||||
char SampleProfileLoader::ID = 0;
|
char SampleProfileLoader::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(SampleProfileLoader, "sample-profile",
|
INITIALIZE_PASS_BEGIN(SampleProfileLoader, "sample-profile",
|
||||||
"Sample Profile loader", false, false)
|
"Sample Profile loader", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(PostDominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(PostDominatorTree)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_END(SampleProfileLoader, "sample-profile",
|
INITIALIZE_PASS_END(SampleProfileLoader, "sample-profile",
|
||||||
|
@ -1009,7 +1009,7 @@ FunctionPass *llvm::createSampleProfileLoaderPass(StringRef Name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SampleProfileLoader::runOnFunction(Function &F) {
|
bool SampleProfileLoader::runOnFunction(Function &F) {
|
||||||
DominatorTree *DT = &getAnalysis<DominatorTree>();
|
DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
PostDominatorTree *PDT = &getAnalysis<PostDominatorTree>();
|
PostDominatorTree *PDT = &getAnalysis<PostDominatorTree>();
|
||||||
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
||||||
SampleFunctionProfile &FunctionProfile = Profiler->getProfile(F);
|
SampleFunctionProfile &FunctionProfile = Profiler->getProfile(F);
|
||||||
|
|
|
@ -196,7 +196,7 @@ namespace {
|
||||||
// getAnalysisUsage - This pass does not require any passes, but we know it
|
// getAnalysisUsage - This pass does not require any passes, but we know it
|
||||||
// will not alter the CFG, so say so.
|
// will not alter the CFG, so say so.
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -224,7 +224,7 @@ char SROA_SSAUp::ID = 0;
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(SROA_DT, "scalarrepl",
|
INITIALIZE_PASS_BEGIN(SROA_DT, "scalarrepl",
|
||||||
"Scalar Replacement of Aggregates (DT)", false, false)
|
"Scalar Replacement of Aggregates (DT)", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_END(SROA_DT, "scalarrepl",
|
INITIALIZE_PASS_END(SROA_DT, "scalarrepl",
|
||||||
"Scalar Replacement of Aggregates (DT)", false, false)
|
"Scalar Replacement of Aggregates (DT)", false, false)
|
||||||
|
|
||||||
|
@ -1407,7 +1407,7 @@ bool SROA::performPromotion(Function &F) {
|
||||||
std::vector<AllocaInst*> Allocas;
|
std::vector<AllocaInst*> Allocas;
|
||||||
DominatorTree *DT = 0;
|
DominatorTree *DT = 0;
|
||||||
if (HasDomTree)
|
if (HasDomTree)
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
BasicBlock &BB = F.getEntryBlock(); // Get the entry node for the function
|
BasicBlock &BB = F.getEntryBlock(); // Get the entry node for the function
|
||||||
DIBuilder DIB(*F.getParent());
|
DIBuilder DIB(*F.getParent());
|
||||||
|
|
|
@ -46,9 +46,9 @@ namespace {
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
FunctionPass::getAnalysisUsage(AU);
|
FunctionPass::getAnalysisUsage(AU);
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
@ -62,7 +62,7 @@ namespace {
|
||||||
char Sinking::ID = 0;
|
char Sinking::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(Sinking, "sink", "Code sinking", false, false)
|
INITIALIZE_PASS_BEGIN(Sinking, "sink", "Code sinking", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||||
INITIALIZE_PASS_END(Sinking, "sink", "Code sinking", false, false)
|
INITIALIZE_PASS_END(Sinking, "sink", "Code sinking", false, false)
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ bool Sinking::AllUsesDominatedByBlock(Instruction *Inst,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sinking::runOnFunction(Function &F) {
|
bool Sinking::runOnFunction(Function &F) {
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
|
|
||||||
|
|
|
@ -245,8 +245,8 @@ public:
|
||||||
|
|
||||||
void getAnalysisUsage(AnalysisUsage &AU) const {
|
void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequiredID(LowerSwitchID);
|
AU.addRequiredID(LowerSwitchID);
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
RegionPass::getAnalysisUsage(AU);
|
RegionPass::getAnalysisUsage(AU);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -258,7 +258,7 @@ char StructurizeCFG::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(StructurizeCFG, "structurizecfg", "Structurize the CFG",
|
INITIALIZE_PASS_BEGIN(StructurizeCFG, "structurizecfg", "Structurize the CFG",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LowerSwitch)
|
INITIALIZE_PASS_DEPENDENCY(LowerSwitch)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(RegionInfo)
|
INITIALIZE_PASS_DEPENDENCY(RegionInfo)
|
||||||
INITIALIZE_PASS_END(StructurizeCFG, "structurizecfg", "Structurize the CFG",
|
INITIALIZE_PASS_END(StructurizeCFG, "structurizecfg", "Structurize the CFG",
|
||||||
false, false)
|
false, false)
|
||||||
|
@ -876,7 +876,7 @@ bool StructurizeCFG::runOnRegion(Region *R, RGPassManager &RGM) {
|
||||||
Func = R->getEntry()->getParent();
|
Func = R->getEntry()->getParent();
|
||||||
ParentRegion = R;
|
ParentRegion = R;
|
||||||
|
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
orderNodes();
|
orderNodes();
|
||||||
collectInfos();
|
collectInfos();
|
||||||
|
|
|
@ -167,15 +167,17 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, Pass *P) {
|
||||||
|
|
||||||
// Finally, erase the old block and update dominator info.
|
// Finally, erase the old block and update dominator info.
|
||||||
if (P) {
|
if (P) {
|
||||||
if (DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>()) {
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
if (DomTreeNode *DTN = DT->getNode(BB)) {
|
P->getAnalysisIfAvailable<DominatorTreeWrapperPass>()) {
|
||||||
DomTreeNode *PredDTN = DT->getNode(PredBB);
|
DominatorTree &DT = DTWP->getDomTree();
|
||||||
|
if (DomTreeNode *DTN = DT.getNode(BB)) {
|
||||||
|
DomTreeNode *PredDTN = DT.getNode(PredBB);
|
||||||
SmallVector<DomTreeNode*, 8> Children(DTN->begin(), DTN->end());
|
SmallVector<DomTreeNode*, 8> Children(DTN->begin(), DTN->end());
|
||||||
for (SmallVectorImpl<DomTreeNode *>::iterator DI = Children.begin(),
|
for (SmallVectorImpl<DomTreeNode *>::iterator DI = Children.begin(),
|
||||||
DE = Children.end(); DI != DE; ++DI)
|
DE = Children.end(); DI != DE; ++DI)
|
||||||
DT->changeImmediateDominator(*DI, PredDTN);
|
DT.changeImmediateDominator(*DI, PredDTN);
|
||||||
|
|
||||||
DT->eraseNode(BB);
|
DT.eraseNode(BB);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LoopInfo *LI = P->getAnalysisIfAvailable<LoopInfo>())
|
if (LoopInfo *LI = P->getAnalysisIfAvailable<LoopInfo>())
|
||||||
|
@ -280,18 +282,20 @@ BasicBlock *llvm::SplitBlock(BasicBlock *Old, Instruction *SplitPt, Pass *P) {
|
||||||
if (Loop *L = LI->getLoopFor(Old))
|
if (Loop *L = LI->getLoopFor(Old))
|
||||||
L->addBasicBlockToLoop(New, LI->getBase());
|
L->addBasicBlockToLoop(New, LI->getBase());
|
||||||
|
|
||||||
if (DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>()) {
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
|
P->getAnalysisIfAvailable<DominatorTreeWrapperPass>()) {
|
||||||
|
DominatorTree &DT = DTWP->getDomTree();
|
||||||
// Old dominates New. New node dominates all other nodes dominated by Old.
|
// Old dominates New. New node dominates all other nodes dominated by Old.
|
||||||
if (DomTreeNode *OldNode = DT->getNode(Old)) {
|
if (DomTreeNode *OldNode = DT.getNode(Old)) {
|
||||||
std::vector<DomTreeNode *> Children;
|
std::vector<DomTreeNode *> Children;
|
||||||
for (DomTreeNode::iterator I = OldNode->begin(), E = OldNode->end();
|
for (DomTreeNode::iterator I = OldNode->begin(), E = OldNode->end();
|
||||||
I != E; ++I)
|
I != E; ++I)
|
||||||
Children.push_back(*I);
|
Children.push_back(*I);
|
||||||
|
|
||||||
DomTreeNode *NewNode = DT->addNewBlock(New,Old);
|
DomTreeNode *NewNode = DT.addNewBlock(New, Old);
|
||||||
for (std::vector<DomTreeNode *>::iterator I = Children.begin(),
|
for (std::vector<DomTreeNode *>::iterator I = Children.begin(),
|
||||||
E = Children.end(); I != E; ++I)
|
E = Children.end(); I != E; ++I)
|
||||||
DT->changeImmediateDominator(*I, NewNode);
|
DT.changeImmediateDominator(*I, NewNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,9 +340,9 @@ static void UpdateAnalysisInformation(BasicBlock *OldBB, BasicBlock *NewBB,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update dominator tree if available.
|
// Update dominator tree if available.
|
||||||
DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>();
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
if (DT)
|
P->getAnalysisIfAvailable<DominatorTreeWrapperPass>())
|
||||||
DT->splitBlock(NewBB);
|
DTWP->getDomTree().splitBlock(NewBB);
|
||||||
|
|
||||||
if (!L) return;
|
if (!L) return;
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ namespace {
|
||||||
virtual bool runOnFunction(Function &F);
|
virtual bool runOnFunction(Function &F);
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
|
|
||||||
// No loop canonicalization guarantees are broken by this pass.
|
// No loop canonicalization guarantees are broken by this pass.
|
||||||
|
@ -209,7 +209,9 @@ BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum,
|
||||||
// If we don't have a pass object, we can't update anything...
|
// If we don't have a pass object, we can't update anything...
|
||||||
if (P == 0) return NewBB;
|
if (P == 0) return NewBB;
|
||||||
|
|
||||||
DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>();
|
DominatorTreeWrapperPass *DTWP =
|
||||||
|
P->getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
DominatorTree *DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
LoopInfo *LI = P->getAnalysisIfAvailable<LoopInfo>();
|
LoopInfo *LI = P->getAnalysisIfAvailable<LoopInfo>();
|
||||||
|
|
||||||
// If we have nothing to update, just return.
|
// If we have nothing to update, just return.
|
||||||
|
|
|
@ -67,7 +67,7 @@ namespace {
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
|
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addPreservedID(LoopSimplifyID);
|
AU.addPreservedID(LoopSimplifyID);
|
||||||
AU.addPreserved<ScalarEvolution>();
|
AU.addPreserved<ScalarEvolution>();
|
||||||
|
@ -86,7 +86,7 @@ namespace {
|
||||||
|
|
||||||
char LCSSA::ID = 0;
|
char LCSSA::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LCSSA, "lcssa", "Loop-Closed SSA Form Pass", false, false)
|
INITIALIZE_PASS_BEGIN(LCSSA, "lcssa", "Loop-Closed SSA Form Pass", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_END(LCSSA, "lcssa", "Loop-Closed SSA Form Pass", false, false)
|
INITIALIZE_PASS_END(LCSSA, "lcssa", "Loop-Closed SSA Form Pass", false, false)
|
||||||
|
|
||||||
|
@ -111,8 +111,8 @@ static bool BlockDominatesAnExit(BasicBlock *BB,
|
||||||
/// runOnFunction - Process all loops in the function, inner-most out.
|
/// runOnFunction - Process all loops in the function, inner-most out.
|
||||||
bool LCSSA::runOnLoop(Loop *TheLoop, LPPassManager &LPM) {
|
bool LCSSA::runOnLoop(Loop *TheLoop, LPPassManager &LPM) {
|
||||||
L = TheLoop;
|
L = TheLoop;
|
||||||
|
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
SE = getAnalysisIfAvailable<ScalarEvolution>();
|
SE = getAnalysisIfAvailable<ScalarEvolution>();
|
||||||
|
|
||||||
|
|
|
@ -508,11 +508,12 @@ void llvm::MergeBasicBlockIntoOnlyPred(BasicBlock *DestBB, Pass *P) {
|
||||||
DestBB->getInstList().splice(DestBB->begin(), PredBB->getInstList());
|
DestBB->getInstList().splice(DestBB->begin(), PredBB->getInstList());
|
||||||
|
|
||||||
if (P) {
|
if (P) {
|
||||||
DominatorTree *DT = P->getAnalysisIfAvailable<DominatorTree>();
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
if (DT) {
|
P->getAnalysisIfAvailable<DominatorTreeWrapperPass>()) {
|
||||||
BasicBlock *PredBBIDom = DT->getNode(PredBB)->getIDom()->getBlock();
|
DominatorTree &DT = DTWP->getDomTree();
|
||||||
DT->changeImmediateDominator(DestBB, PredBBIDom);
|
BasicBlock *PredBBIDom = DT.getNode(PredBB)->getIDom()->getBlock();
|
||||||
DT->eraseNode(PredBB);
|
DT.changeImmediateDominator(DestBB, PredBBIDom);
|
||||||
|
DT.eraseNode(PredBB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Nuke BB.
|
// Nuke BB.
|
||||||
|
|
|
@ -83,8 +83,8 @@ namespace {
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
// We need loop information to identify the loops...
|
// We need loop information to identify the loops...
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
|
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
|
@ -114,7 +114,7 @@ static void PlaceSplitBlockCarefully(BasicBlock *NewBB,
|
||||||
char LoopSimplify::ID = 0;
|
char LoopSimplify::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(LoopSimplify, "loop-simplify",
|
INITIALIZE_PASS_BEGIN(LoopSimplify, "loop-simplify",
|
||||||
"Canonicalize natural loops", true, false)
|
"Canonicalize natural loops", true, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_END(LoopSimplify, "loop-simplify",
|
INITIALIZE_PASS_END(LoopSimplify, "loop-simplify",
|
||||||
"Canonicalize natural loops", true, false)
|
"Canonicalize natural loops", true, false)
|
||||||
|
@ -131,7 +131,7 @@ bool LoopSimplify::runOnLoop(Loop *l, LPPassManager &LPM) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
AA = getAnalysisIfAvailable<AliasAnalysis>();
|
AA = getAnalysisIfAvailable<AliasAnalysis>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
SE = getAnalysisIfAvailable<ScalarEvolution>();
|
SE = getAnalysisIfAvailable<ScalarEvolution>();
|
||||||
|
|
||||||
Changed |= ProcessLoop(L, LPM);
|
Changed |= ProcessLoop(L, LPM);
|
||||||
|
|
|
@ -413,8 +413,9 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount,
|
||||||
if (LPM) {
|
if (LPM) {
|
||||||
// FIXME: Reconstruct dom info, because it is not preserved properly.
|
// FIXME: Reconstruct dom info, because it is not preserved properly.
|
||||||
// Incrementally updating domtree after loop unrolling would be easy.
|
// Incrementally updating domtree after loop unrolling would be easy.
|
||||||
if (DominatorTree *DT = LPM->getAnalysisIfAvailable<DominatorTree>())
|
if (DominatorTreeWrapperPass *DTWP =
|
||||||
DT->runOnFunction(*L->getHeader()->getParent());
|
LPM->getAnalysisIfAvailable<DominatorTreeWrapperPass>())
|
||||||
|
DTWP->getDomTree().recalculate(*L->getHeader()->getParent());
|
||||||
|
|
||||||
// Simplify any new induction variables in the partially unrolled loop.
|
// Simplify any new induction variables in the partially unrolled loop.
|
||||||
ScalarEvolution *SE = LPM->getAnalysisIfAvailable<ScalarEvolution>();
|
ScalarEvolution *SE = LPM->getAnalysisIfAvailable<ScalarEvolution>();
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace {
|
||||||
virtual bool runOnFunction(Function &F);
|
virtual bool runOnFunction(Function &F);
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
// This is a cluster of orthogonal Transforms
|
// This is a cluster of orthogonal Transforms
|
||||||
AU.addPreserved<UnifyFunctionExitNodes>();
|
AU.addPreserved<UnifyFunctionExitNodes>();
|
||||||
|
@ -50,7 +50,7 @@ namespace {
|
||||||
char PromotePass::ID = 0;
|
char PromotePass::ID = 0;
|
||||||
INITIALIZE_PASS_BEGIN(PromotePass, "mem2reg", "Promote Memory to Register",
|
INITIALIZE_PASS_BEGIN(PromotePass, "mem2reg", "Promote Memory to Register",
|
||||||
false, false)
|
false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_END(PromotePass, "mem2reg", "Promote Memory to Register",
|
INITIALIZE_PASS_END(PromotePass, "mem2reg", "Promote Memory to Register",
|
||||||
false, false)
|
false, false)
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ bool PromotePass::runOnFunction(Function &F) {
|
||||||
|
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
|
||||||
DominatorTree &DT = getAnalysis<DominatorTree>();
|
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
Allocas.clear();
|
Allocas.clear();
|
||||||
|
|
|
@ -45,7 +45,9 @@ namespace {
|
||||||
|
|
||||||
/// runOnFunction - Remove instructions that simplify.
|
/// runOnFunction - Remove instructions that simplify.
|
||||||
bool runOnFunction(Function &F) {
|
bool runOnFunction(Function &F) {
|
||||||
const DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
|
const DominatorTreeWrapperPass *DTWP =
|
||||||
|
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
|
||||||
|
const DominatorTree *DT = DTWP ? &DTWP->getDomTree() : 0;
|
||||||
const DataLayout *TD = getAnalysisIfAvailable<DataLayout>();
|
const DataLayout *TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
|
const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
|
||||||
SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
|
SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
|
||||||
|
|
|
@ -199,7 +199,7 @@ namespace {
|
||||||
BBVectorize(Pass *P, const VectorizeConfig &C)
|
BBVectorize(Pass *P, const VectorizeConfig &C)
|
||||||
: BasicBlockPass(ID), Config(C) {
|
: BasicBlockPass(ID), Config(C) {
|
||||||
AA = &P->getAnalysis<AliasAnalysis>();
|
AA = &P->getAnalysis<AliasAnalysis>();
|
||||||
DT = &P->getAnalysis<DominatorTree>();
|
DT = &P->getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
SE = &P->getAnalysis<ScalarEvolution>();
|
SE = &P->getAnalysis<ScalarEvolution>();
|
||||||
TD = P->getAnalysisIfAvailable<DataLayout>();
|
TD = P->getAnalysisIfAvailable<DataLayout>();
|
||||||
TTI = IgnoreTargetInfo ? 0 : &P->getAnalysis<TargetTransformInfo>();
|
TTI = IgnoreTargetInfo ? 0 : &P->getAnalysis<TargetTransformInfo>();
|
||||||
|
@ -430,7 +430,7 @@ namespace {
|
||||||
|
|
||||||
virtual bool runOnBasicBlock(BasicBlock &BB) {
|
virtual bool runOnBasicBlock(BasicBlock &BB) {
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
SE = &getAnalysis<ScalarEvolution>();
|
SE = &getAnalysis<ScalarEvolution>();
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
TTI = IgnoreTargetInfo ? 0 : &getAnalysis<TargetTransformInfo>();
|
TTI = IgnoreTargetInfo ? 0 : &getAnalysis<TargetTransformInfo>();
|
||||||
|
@ -441,11 +441,11 @@ namespace {
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
BasicBlockPass::getAnalysisUsage(AU);
|
BasicBlockPass::getAnalysisUsage(AU);
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.addRequired<TargetTransformInfo>();
|
AU.addRequired<TargetTransformInfo>();
|
||||||
AU.addPreserved<AliasAnalysis>();
|
AU.addPreserved<AliasAnalysis>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<ScalarEvolution>();
|
AU.addPreserved<ScalarEvolution>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
}
|
}
|
||||||
|
@ -3141,7 +3141,7 @@ static const char bb_vectorize_name[] = "Basic-Block Vectorization";
|
||||||
INITIALIZE_PASS_BEGIN(BBVectorize, BBV_NAME, bb_vectorize_name, false, false)
|
INITIALIZE_PASS_BEGIN(BBVectorize, BBV_NAME, bb_vectorize_name, false, false)
|
||||||
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
|
||||||
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
INITIALIZE_PASS_END(BBVectorize, BBV_NAME, bb_vectorize_name, false, false)
|
INITIALIZE_PASS_END(BBVectorize, BBV_NAME, bb_vectorize_name, false, false)
|
||||||
|
|
||||||
|
|
|
@ -960,7 +960,7 @@ struct LoopVectorize : public LoopPass {
|
||||||
DL = getAnalysisIfAvailable<DataLayout>();
|
DL = getAnalysisIfAvailable<DataLayout>();
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
TTI = &getAnalysis<TargetTransformInfo>();
|
TTI = &getAnalysis<TargetTransformInfo>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
TLI = getAnalysisIfAvailable<TargetLibraryInfo>();
|
TLI = getAnalysisIfAvailable<TargetLibraryInfo>();
|
||||||
|
|
||||||
// If the target claims to have no vector registers don't attempt
|
// If the target claims to have no vector registers don't attempt
|
||||||
|
@ -1055,12 +1055,12 @@ struct LoopVectorize : public LoopPass {
|
||||||
LoopPass::getAnalysisUsage(AU);
|
LoopPass::getAnalysisUsage(AU);
|
||||||
AU.addRequiredID(LoopSimplifyID);
|
AU.addRequiredID(LoopSimplifyID);
|
||||||
AU.addRequiredID(LCSSAID);
|
AU.addRequiredID(LCSSAID);
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.addRequired<TargetTransformInfo>();
|
AU.addRequired<TargetTransformInfo>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -2976,7 +2976,7 @@ void InnerLoopVectorizer::updateAnalysis() {
|
||||||
DT->changeImmediateDominator(LoopScalarBody, LoopScalarPreHeader);
|
DT->changeImmediateDominator(LoopScalarBody, LoopScalarPreHeader);
|
||||||
DT->changeImmediateDominator(LoopExitBlock, LoopMiddleBlock);
|
DT->changeImmediateDominator(LoopExitBlock, LoopMiddleBlock);
|
||||||
|
|
||||||
DEBUG(DT->verifyAnalysis());
|
DEBUG(DT->verifyDomTree());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Check whether it is safe to if-convert this phi node.
|
/// \brief Check whether it is safe to if-convert this phi node.
|
||||||
|
@ -5390,7 +5390,7 @@ char LoopVectorize::ID = 0;
|
||||||
static const char lv_name[] = "Loop Vectorization";
|
static const char lv_name[] = "Loop Vectorization";
|
||||||
INITIALIZE_PASS_BEGIN(LoopVectorize, LV_NAME, lv_name, false, false)
|
INITIALIZE_PASS_BEGIN(LoopVectorize, LV_NAME, lv_name, false, false)
|
||||||
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
|
|
|
@ -1776,7 +1776,7 @@ struct SLPVectorizer : public FunctionPass {
|
||||||
TTI = &getAnalysis<TargetTransformInfo>();
|
TTI = &getAnalysis<TargetTransformInfo>();
|
||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
LI = &getAnalysis<LoopInfo>();
|
LI = &getAnalysis<LoopInfo>();
|
||||||
DT = &getAnalysis<DominatorTree>();
|
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
|
|
||||||
StoreRefs.clear();
|
StoreRefs.clear();
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
@ -1831,9 +1831,9 @@ struct SLPVectorizer : public FunctionPass {
|
||||||
AU.addRequired<AliasAnalysis>();
|
AU.addRequired<AliasAnalysis>();
|
||||||
AU.addRequired<TargetTransformInfo>();
|
AU.addRequired<TargetTransformInfo>();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addPreserved<LoopInfo>();
|
AU.addPreserved<LoopInfo>();
|
||||||
AU.addPreserved<DominatorTree>();
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
||||||
AU.setPreservesCFG();
|
AU.setPreservesCFG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,12 +31,11 @@ namespace {
|
||||||
|
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool runOnFunction(Function &F) {
|
virtual bool runOnFunction(Function &F) {
|
||||||
getAnalysis<DominatorTree>().dump();
|
getAnalysis<DominatorTreeWrapperPass>().dump();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -78,14 +78,15 @@ protected:
|
||||||
"", &ID, 0, true, true);
|
"", &ID, 0, true, true);
|
||||||
PassRegistry::getPassRegistry()->registerPass(*PI, false);
|
PassRegistry::getPassRegistry()->registerPass(*PI, false);
|
||||||
initializeLoopInfoPass(*PassRegistry::getPassRegistry());
|
initializeLoopInfoPass(*PassRegistry::getPassRegistry());
|
||||||
initializeDominatorTreePass(*PassRegistry::getPassRegistry());
|
initializeDominatorTreeWrapperPassPass(
|
||||||
|
*PassRegistry::getPassRegistry());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void getAnalysisUsage(AnalysisUsage &AU) const {
|
void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.setPreservesAll();
|
AU.setPreservesAll();
|
||||||
AU.addRequired<LoopInfo>();
|
AU.addRequired<LoopInfo>();
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool runOnFunction(Function &F) {
|
bool runOnFunction(Function &F) {
|
||||||
|
@ -93,7 +94,8 @@ protected:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
||||||
DominatorTree *DT = &getAnalysis<DominatorTree>();
|
DominatorTree *DT =
|
||||||
|
&getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
EXPECT_EQ(isPotentiallyReachable(A, B, 0, 0), ExpectedResult);
|
EXPECT_EQ(isPotentiallyReachable(A, B, 0, 0), ExpectedResult);
|
||||||
EXPECT_EQ(isPotentiallyReachable(A, B, DT, 0), ExpectedResult);
|
EXPECT_EQ(isPotentiallyReachable(A, B, DT, 0), ExpectedResult);
|
||||||
EXPECT_EQ(isPotentiallyReachable(A, B, 0, LI), ExpectedResult);
|
EXPECT_EQ(isPotentiallyReachable(A, B, 0, LI), ExpectedResult);
|
||||||
|
|
|
@ -26,7 +26,8 @@ namespace llvm {
|
||||||
struct DPass : public FunctionPass {
|
struct DPass : public FunctionPass {
|
||||||
static char ID;
|
static char ID;
|
||||||
virtual bool runOnFunction(Function &F) {
|
virtual bool runOnFunction(Function &F) {
|
||||||
DominatorTree *DT = &getAnalysis<DominatorTree>();
|
DominatorTree *DT =
|
||||||
|
&getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||||
PostDominatorTree *PDT = &getAnalysis<PostDominatorTree>();
|
PostDominatorTree *PDT = &getAnalysis<PostDominatorTree>();
|
||||||
Function::iterator FI = F.begin();
|
Function::iterator FI = F.begin();
|
||||||
|
|
||||||
|
@ -176,7 +177,7 @@ namespace llvm {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
AU.addRequired<DominatorTree>();
|
AU.addRequired<DominatorTreeWrapperPass>();
|
||||||
AU.addRequired<PostDominatorTree>();
|
AU.addRequired<PostDominatorTree>();
|
||||||
}
|
}
|
||||||
DPass() : FunctionPass(ID) {
|
DPass() : FunctionPass(ID) {
|
||||||
|
@ -226,6 +227,6 @@ namespace llvm {
|
||||||
}
|
}
|
||||||
|
|
||||||
INITIALIZE_PASS_BEGIN(DPass, "dpass", "dpass", false, false)
|
INITIALIZE_PASS_BEGIN(DPass, "dpass", "dpass", false, false)
|
||||||
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||||
INITIALIZE_PASS_DEPENDENCY(PostDominatorTree)
|
INITIALIZE_PASS_DEPENDENCY(PostDominatorTree)
|
||||||
INITIALIZE_PASS_END(DPass, "dpass", "dpass", false, false)
|
INITIALIZE_PASS_END(DPass, "dpass", "dpass", false, false)
|
||||||
|
|
Loading…
Reference in New Issue