diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-10-11 18:30:57 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-10-11 18:30:57 +0000 | 
| commit | 5c9d63da310a31f32b679f357fe7f79b377575f8 (patch) | |
| tree | 2735016a546371bb643e62c215b31be0419adc0f /llvm/lib/Transforms | |
| parent | eb1579d3089887455d45ac75cb93e795d6a475ac (diff) | |
| download | bcm5719-llvm-5c9d63da310a31f32b679f357fe7f79b377575f8.tar.gz bcm5719-llvm-5c9d63da310a31f32b679f357fe7f79b377575f8.zip | |
Fix another problem where LSR was being nondeterminstic.  Also remove elements
from the end of a vector instead of the beginning
llvm-svn: 23697
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 26 | 
1 files changed, 16 insertions, 10 deletions
| diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index c04601b6d4b..ad88fc10b25 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/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.    } | 

