diff options
author | Andreas Bolka <a@bolka.at> | 2009-07-29 05:35:53 +0000 |
---|---|---|
committer | Andreas Bolka <a@bolka.at> | 2009-07-29 05:35:53 +0000 |
commit | 15f72dbf972f056b1685786e5118148fb528f233 (patch) | |
tree | 700e798597427d154003045fa2d7ee08c3eb2ccf /lib/Analysis/LoopDependenceAnalysis.cpp | |
parent | 45ce89ba080f4be72e4e49367567114800f6b3c5 (diff) |
Skeleton for pairwise subscript testing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77437 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/LoopDependenceAnalysis.cpp')
-rw-r--r-- | lib/Analysis/LoopDependenceAnalysis.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/lib/Analysis/LoopDependenceAnalysis.cpp b/lib/Analysis/LoopDependenceAnalysis.cpp index 78c3975b6d..51f6c3aafd 100644 --- a/lib/Analysis/LoopDependenceAnalysis.cpp +++ b/lib/Analysis/LoopDependenceAnalysis.cpp @@ -15,6 +15,8 @@ // // TODO: adapt as implementation progresses. // +// TODO: document lingo (pair, subscript, index) +// //===----------------------------------------------------------------------===// #define DEBUG_TYPE "lda" @@ -24,6 +26,7 @@ #include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Instructions.h" +#include "llvm/Operator.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" @@ -87,6 +90,10 @@ static AliasAnalysis::AliasResult UnderlyingObjectsAlias(AliasAnalysis *AA, bObj, AA->getTypeStoreSize(bObj->getType())); } +static inline const SCEV *GetZeroSCEV(ScalarEvolution *SE) { + return SE->getConstant(Type::Int32Ty, 0L); +} + //===----------------------------------------------------------------------===// // Dependence Testing //===----------------------------------------------------------------------===// @@ -117,6 +124,13 @@ bool LoopDependenceAnalysis::findOrInsertDependencePair(Value *A, } LoopDependenceAnalysis::DependenceResult +LoopDependenceAnalysis::analyseSubscript(const SCEV *A, + const SCEV *B, + Subscript *S) const { + return Unknown; // TODO: Implement. +} + +LoopDependenceAnalysis::DependenceResult LoopDependenceAnalysis::analysePair(DependencePair *P) const { DEBUG(errs() << "Analysing:\n" << *P->A << "\n" << *P->B << "\n"); @@ -145,9 +159,37 @@ LoopDependenceAnalysis::analysePair(DependencePair *P) const { break; // The underlying objects alias, test accesses for dependence. } - // We failed to analyse this pair to get a more specific answer. - DEBUG(errs() << "---> [?] cannot analyse\n"); - return Unknown; + const GEPOperator *aGEP = dyn_cast<GEPOperator>(aPtr); + const GEPOperator *bGEP = dyn_cast<GEPOperator>(bPtr); + + if (!aGEP || !bGEP) + return Unknown; + + // FIXME: Is filtering coupled subscripts necessary? + + // Analyse indices pairwise (FIXME: use GetGEPOperands from BasicAA), adding + // trailing zeroes to the smaller GEP, if needed. + GEPOperator::const_op_iterator aIdx = aGEP->idx_begin(), + aEnd = aGEP->idx_end(), + bIdx = bGEP->idx_begin(), + bEnd = bGEP->idx_end(); + while (aIdx != aEnd && bIdx != bEnd) { + const SCEV* aSCEV = (aIdx != aEnd) ? SE->getSCEV(*aIdx) : GetZeroSCEV(SE); + const SCEV* bSCEV = (bIdx != bEnd) ? SE->getSCEV(*bIdx) : GetZeroSCEV(SE); + Subscript subscript; + DependenceResult result = analyseSubscript(aSCEV, bSCEV, &subscript); + if (result != Dependent) { + // We either proved independence or failed to analyse this subscript. + // Further subscripts will not improve the situation, so abort early. + return result; + } + P->Subscripts.push_back(subscript); + if (aIdx != aEnd) ++aIdx; + if (bIdx != bEnd) ++bIdx; + } + // Either there were no subscripts or all subscripts were analysed to be + // dependent; in both cases we know the accesses are dependent. + return Dependent; } bool LoopDependenceAnalysis::depends(Value *A, Value *B) { |