From 7b445c521bc191d0d25799b289e17b45f202a1af Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 11 Oct 2005 18:30:57 +0000 Subject: [PATCH] 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 --- lib/Transforms/Scalar/LoopStrengthReduce.cpp | 26 ++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index c04601b6d4b..ad88fc10b25 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(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. }