[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