diff options
| author | Sebastian Pop <spop@codeaurora.org> | 2014-04-08 21:20:44 +0000 |
|---|---|---|
| committer | Sebastian Pop <spop@codeaurora.org> | 2014-04-08 21:20:44 +0000 |
| commit | 1801668af3cbc51a1f8bab552f3896eb30268cfa (patch) | |
| tree | 602a155dd8b0c5f665c69eb1ebb73cd8bf1b329e /polly/lib/Analysis/ScopDetection.cpp | |
| parent | 0a31e042195765e7ac48f6f96e891348354ef2dd (diff) | |
| download | bcm5719-llvm-1801668af3cbc51a1f8bab552f3896eb30268cfa.tar.gz bcm5719-llvm-1801668af3cbc51a1f8bab552f3896eb30268cfa.zip | |
delinearize memory access functions
llvm-svn: 205799
Diffstat (limited to 'polly/lib/Analysis/ScopDetection.cpp')
| -rw-r--r-- | polly/lib/Analysis/ScopDetection.cpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index 69c63ae1b13..5f03e7a5b45 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -117,6 +117,12 @@ TrackFailures("polly-detect-track-failures", cl::location(PollyTrackFailures), cl::Hidden, cl::ZeroOrMore, cl::init(false), cl::cat(PollyCategory)); +static cl::opt<bool, true> +PollyDelinearizeX("polly-delinearize", + cl::desc("Delinearize array access functions"), + cl::location(PollyDelinearize), cl::Hidden, cl::ZeroOrMore, + cl::init(false), cl::cat(PollyCategory)); + static cl::opt<bool> VerifyScops("polly-detect-verify", cl::desc("Verify the detected SCoPs after each transformation"), @@ -124,6 +130,7 @@ VerifyScops("polly-detect-verify", cl::cat(PollyCategory)); bool polly::PollyTrackFailures = false; +bool polly::PollyDelinearize = false; //===----------------------------------------------------------------------===// // Statistics. @@ -357,11 +364,25 @@ bool ScopDetection::isValidMemoryAccess(Instruction &Inst, return invalid<ReportVariantBasePtr>(Context, /*Assert=*/false, BaseValue); AccessFunction = SE->getMinusSCEV(AccessFunction, BasePointer); - - if (!AllowNonAffine && - !isAffineExpr(&Context.CurRegion, AccessFunction, *SE, BaseValue)) + const SCEVAddRecExpr *AF = dyn_cast<SCEVAddRecExpr>(AccessFunction); + + if (AllowNonAffine) { + // Do not check whether AccessFunction is affine. + } else if (PollyDelinearize && AF) { + // Try to delinearize AccessFunction. + SmallVector<const SCEV *, 4> Subscripts, Sizes; + AF->delinearize(*SE, Subscripts, Sizes); + int size = Subscripts.size(); + + for (int i = 0; i < size; ++i) + if (!isAffineExpr(&Context.CurRegion, Subscripts[i], *SE, BaseValue)) + return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true, + AccessFunction); + } else if (!isAffineExpr(&Context.CurRegion, AccessFunction, *SE, + BaseValue)) { return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true, AccessFunction); + } // FIXME: Alias Analysis thinks IntToPtrInst aliases with alloca instructions // created by IndependentBlocks Pass. |

