Fix (hopefully the last) issue where LSR is nondeterminstic. When pulling
authorChris Lattner <sabre@nondot.org>
Tue, 11 Oct 2005 18:41:04 +0000 (18:41 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 11 Oct 2005 18:41:04 +0000 (18:41 +0000)
out CSE's of base expressions it could build a result whose order was
nondet.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23698 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index ad88fc10b25ae88232c9e86332b07b72965a31fa..a74b91b4f760cc546ccc7ea07ff868d416d7c0aa 100644 (file)
@@ -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;