diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-10-11 18:41:04 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-10-11 18:41:04 +0000 |
| commit | 192cd18f538faf94efa84b5849993991c4a945e0 (patch) | |
| tree | 0957a602e68f6d8d88fa15e5324938b5dc5b8a0c /llvm/lib | |
| parent | 5c9d63da310a31f32b679f357fe7f79b377575f8 (diff) | |
| download | bcm5719-llvm-192cd18f538faf94efa84b5849993991c4a945e0.tar.gz bcm5719-llvm-192cd18f538faf94efa84b5849993991c4a945e0.zip | |
Fix (hopefully the last) issue where LSR is nondeterminstic. When pulling
out CSE's of base expressions it could build a result whose order was
nondet.
llvm-svn: 23698
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index ad88fc10b25..a74b91b4f76 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -715,6 +715,10 @@ RemoveCommonExpressionsFromUseBases(std::vector<BasedUser> &Uses) { // If any subexpressions are used Uses.size() times, they are common. std::map<SCEVHandle, unsigned> SubExpressionUseCounts; + // UniqueSubExprs - Keep track of all of the subexpressions we see in the + // order we see them. + std::vector<SCEVHandle> UniqueSubExprs; + std::vector<SCEVHandle> SubExprs; for (unsigned i = 0; i != NumUses; ++i) { // If the base is zero (which is common), return zero now, there are no @@ -725,22 +729,24 @@ RemoveCommonExpressionsFromUseBases(std::vector<BasedUser> &Uses) { SeparateSubExprs(SubExprs, Uses[i].Base); // Add one to SubExpressionUseCounts for each subexpr present. for (unsigned j = 0, e = SubExprs.size(); j != e; ++j) - SubExpressionUseCounts[SubExprs[j]]++; + if (++SubExpressionUseCounts[SubExprs[j]] == 1) + UniqueSubExprs.push_back(SubExprs[j]); SubExprs.clear(); } - - // Now that we know how many times each is used, build Result. - for (std::map<SCEVHandle, unsigned>::iterator I = - SubExpressionUseCounts.begin(), E = SubExpressionUseCounts.end(); - I != E; ) + // Now that we know how many times each is used, build Result. Iterate over + // UniqueSubexprs so that we have a stable ordering. + for (unsigned i = 0, e = UniqueSubExprs.size(); i != e; ++i) { + std::map<SCEVHandle, unsigned>::iterator I = + SubExpressionUseCounts.find(UniqueSubExprs[i]); + assert(I != SubExpressionUseCounts.end() && "Entry not found?"); if (I->second == NumUses) { // Found CSE! Result = SCEVAddExpr::get(Result, I->first); - ++I; } else { // Remove non-cse's from SubExpressionUseCounts. - SubExpressionUseCounts.erase(I++); + SubExpressionUseCounts.erase(I); } + } // If we found no CSE's, return now. if (Result == Zero) return Result; |

