diff options
author | Chris Lattner <sabre@nondot.org> | 2004-06-19 08:56:43 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-06-19 08:56:43 +0000 |
commit | ec2d34cc19f872923db740080cf8e8544d4e760e (patch) | |
tree | dc99ab046ba91e0bb6670d5da262ff2523513059 /llvm/lib/Transforms | |
parent | 4db0f8260ab0c6f323b13b672b9d9d5211584a5d (diff) | |
download | bcm5719-llvm-ec2d34cc19f872923db740080cf8e8544d4e760e.tar.gz bcm5719-llvm-ec2d34cc19f872923db740080cf8e8544d4e760e.zip |
Fix one source of nondeterminism in the -licm pass: the hoist pass
was processing blocks in whatever order they happened to end up in the
dominator tree data structure. Force an ordering.
llvm-svn: 14248
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LICM.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp index 8bdde10b647..31aff0d9ebc 100644 --- a/llvm/lib/Transforms/Scalar/LICM.cpp +++ b/llvm/lib/Transforms/Scalar/LICM.cpp @@ -40,6 +40,7 @@ #include "llvm/Analysis/AliasSetTracker.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Support/CFG.h" +#include "llvm/Support/StableBasicBlockNumbering.h" #include "llvm/Transforms/Utils/PromoteMemToReg.h" #include "llvm/Transforms/Utils/Local.h" #include "Support/CommandLine.h" @@ -81,6 +82,7 @@ namespace { LoopInfo *LI; // Current LoopInfo DominatorTree *DT; // Dominator Tree for the current Loop... DominanceFrontier *DF; // Current Dominance Frontier + StableBasicBlockNumbering *BBNum; // Stable IDs for basic blocks // State that is updated as we process loops bool Changed; // Set to true when we change anything. @@ -203,7 +205,7 @@ FunctionPass *llvm::createLICMPass() { return new LICM(); } /// runOnFunction - For LICM, this simply traverses the loop structure of the /// function, hoisting expressions out of loops if possible. /// -bool LICM::runOnFunction(Function &) { +bool LICM::runOnFunction(Function &F) { Changed = false; // Get our Loop and Alias Analysis information... @@ -212,6 +214,10 @@ bool LICM::runOnFunction(Function &) { DF = &getAnalysis<DominanceFrontier>(); DT = &getAnalysis<DominatorTree>(); + // Get a stable numbering of basic blocks. + StableBasicBlockNumbering CurBBNum(&F); + BBNum = &CurBBNum; + // Hoist expressions out of all of the top-level loops. for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I) { AliasSetTracker AST(*AA); @@ -337,8 +343,16 @@ void LICM::HoistRegion(DominatorTree::Node *N) { } const std::vector<DominatorTree::Node*> &Children = N->getChildren(); + std::vector<std::pair<unsigned, DominatorTree::Node*> > ChildrenWithIDs; + ChildrenWithIDs.reserve(Children.size()); + for (unsigned i = 0, e = Children.size(); i != e; ++i) { + unsigned ID = BBNum->getNumber(Children[i]->getBlock()); + ChildrenWithIDs.push_back(std::make_pair(ID, Children[i])); + } + + std::sort(ChildrenWithIDs.begin(), ChildrenWithIDs.end()); for (unsigned i = 0, e = Children.size(); i != e; ++i) - HoistRegion(Children[i]); + HoistRegion(ChildrenWithIDs[i].second); } /// canSinkOrHoistInst - Return true if the hoister and sinker can handle this |