[llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Oct 11 11:31:08 PDT 2005



Changes in directory llvm/lib/Transforms/Scalar:

LoopStrengthReduce.cpp updated: 1.66 -> 1.67
---
Log message:

Fix another problem where LSR was being nondeterminstic.  Also remove elements
from the end of a vector instead of the beginning


---
Diffs of the changes:  (+16 -10)

 LoopStrengthReduce.cpp |   26 ++++++++++++++++----------
 1 files changed, 16 insertions(+), 10 deletions(-)


Index: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
diff -u llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.66 llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.67
--- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.66	Tue Oct 11 13:17:57 2005
+++ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp	Tue Oct 11 13:30:57 2005
@@ -474,10 +474,6 @@
     void RewriteInstructionToUseNewBase(const SCEVHandle &NewBase,
                                         SCEVExpander &Rewriter, Loop *L,
                                         Pass *P);
-
-    // Sort by the Base field.
-    bool operator<(const BasedUser &BU) const { return Base < BU.Base; }
-
     void dump() const;
   };
 }
@@ -878,9 +874,8 @@
 
   // Sort by the base value, so that all IVs with identical bases are next to
   // each other.
-  std::sort(UsersToProcess.begin(), UsersToProcess.end());
   while (!UsersToProcess.empty()) {
-    SCEVHandle Base = UsersToProcess.front().Base;
+    SCEVHandle Base = UsersToProcess.back().Base;
 
     DEBUG(std::cerr << "  INSERTING code for BASE = " << *Base << ":\n");
    
@@ -901,8 +896,9 @@
     
     // Emit the code to add the immediate offset to the Phi value, just before
     // the instructions that we identified as using this stride and base.
-    while (!UsersToProcess.empty() && UsersToProcess.front().Base == Base) {
-      BasedUser &User = UsersToProcess.front();
+    unsigned ScanPos = 0;
+    do {
+      BasedUser &User = UsersToProcess.back();
 
       // If this instruction wants to use the post-incremented value, move it
       // after the post-inc and use its value instead of the PHI.
@@ -933,9 +929,19 @@
       // if we just replaced the last use of that value.
       DeadInsts.insert(cast<Instruction>(User.OperandValToReplace));
 
-      UsersToProcess.erase(UsersToProcess.begin());
+      UsersToProcess.pop_back();
       ++NumReduced;
-    }
+
+      // If there are any more users to process with the same base, move one of
+      // them to the end of the list so that we will process it.
+      if (!UsersToProcess.empty()) {
+        for (unsigned e = UsersToProcess.size(); ScanPos != e; ++ScanPos)
+          if (UsersToProcess[ScanPos].Base == Base) {
+            std::swap(UsersToProcess[ScanPos], UsersToProcess.back());
+            break;
+          }
+      }
+    } while (!UsersToProcess.empty() && UsersToProcess.back().Base == Base);
     // TODO: Next, find out which base index is the most common, pull it out.
   }
 






More information about the llvm-commits mailing list