summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-03-18 00:44:49 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-03-18 00:44:49 +0000
commitf09f0ebd48fed331802247cad9a6e7c4c1c034e0 (patch)
treee12752a929774fdbd70b7d69c90148d4954dad4d /llvm
parentf878f6aa54e06cddcb2f1a26474918d8a1f0b1a8 (diff)
downloadbcm5719-llvm-f09f0ebd48fed331802247cad9a6e7c4c1c034e0.tar.gz
bcm5719-llvm-f09f0ebd48fed331802247cad9a6e7c4c1c034e0.zip
Sort StrideOrder so we can process the smallest strides first. This allows
for more IV reuses. llvm-svn: 26837
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 7e894ca9dca..436f25bc7fc 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -1199,6 +1199,30 @@ void LoopStrengthReduce::OptimizeIndvars(Loop *L) {
CondUse->isUseOfPostIncrementedValue = true;
}
+namespace {
+ // Constant strides come first which in turns are sorted by their absolute
+ // values. If absolute values are the same, then positive strides comes first.
+ // e.g.
+ // 4, -1, X, 1, 2 ==> 1, -1, 2, 4, X
+ struct StrideCompare {
+ bool operator()(const SCEVHandle &LHS, const SCEVHandle &RHS) {
+ SCEVConstant *LHSC = dyn_cast<SCEVConstant>(LHS);
+ SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS);
+ if (LHSC && RHSC) {
+ int64_t LV = LHSC->getValue()->getSExtValue();
+ int64_t RV = RHSC->getValue()->getSExtValue();
+ uint64_t ALV = (LV < 0) ? -LV : LV;
+ uint64_t ARV = (RV < 0) ? -RV : RV;
+ if (ALV == ARV)
+ return LV > RV;
+ else
+ return ALV < ARV;
+ } else
+ return (LHSC && !RHSC);
+ }
+ };
+}
+
void LoopStrengthReduce::runOnLoop(Loop *L) {
// First step, transform all loops nesting inside of this loop.
for (LoopInfo::iterator I = L->begin(), E = L->end(); I != E; ++I)
@@ -1241,6 +1265,9 @@ void LoopStrengthReduce::runOnLoop(Loop *L) {
// IVsByStride keeps IVs for one particular loop.
IVsByStride.clear();
+ // Sort the StrideOrder so we process larger strides first.
+ std::stable_sort(StrideOrder.begin(), StrideOrder.end(), StrideCompare());
+
// Note: this processes each stride/type pair individually. All users passed
// into StrengthReduceStridedIVUsers have the same type AND stride. Also,
// node that we iterate over IVUsesByStride indirectly by using StrideOrder.
OpenPOWER on IntegriCloud