aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/LoopStrengthReduce.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-10-11 18:30:57 +0000
committerChris Lattner <sabre@nondot.org>2005-10-11 18:30:57 +0000
commit7b445c521bc191d0d25799b289e17b45f202a1af (patch)
treec61b09220d17aa945557574b564012fa0cc0f6bb /lib/Transforms/Scalar/LoopStrengthReduce.cpp
parent4b43159c55b30551f667b21143d943a852cc9ea9 (diff)
Fix another problem where LSR was being nondeterminstic. Also remove elements
from the end of a vector instead of the beginning git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23697 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/LoopStrengthReduce.cpp')
-rw-r--r--lib/Transforms/Scalar/LoopStrengthReduce.cpp26
1 files changed, 16 insertions, 10 deletions
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index c04601b6d4..ad88fc10b2 100644
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -474,10 +474,6 @@ namespace {
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 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
// 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 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
// 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 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
// 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.
}