pass element size to delinearization
authorSebastian Pop <spop@codeaurora.org>
Tue, 27 May 2014 22:42:09 +0000 (22:42 +0000)
committerSebastian Pop <spop@codeaurora.org>
Tue, 27 May 2014 22:42:09 +0000 (22:42 +0000)
Instead of relying on the delinearization to infer the size of an element,
compute the element size from the base address type. This is a much more precise
way of computing the element size than before, as we would have mixed together
the size of an element with the strides of the innermost dimension.

llvm-svn: 209695

polly/include/polly/ScopDetection.h
polly/lib/Analysis/ScopDetection.cpp
polly/lib/Analysis/TempScopInfo.cpp

index d9a2615..e4f8f2b 100644 (file)
@@ -77,6 +77,7 @@ typedef std::set<const SCEV *> ParamSetType;
 
 typedef std::vector<const SCEVAddRecExpr *> AFs;
 typedef std::map<const SCEVUnknown *, AFs> BaseToAFs;
+typedef std::map<const SCEVUnknown *, const SCEV *> BaseToElSize;
 
 extern bool PollyTrackFailures;
 extern bool PollyDelinearize;
@@ -106,6 +107,7 @@ class ScopDetection : public FunctionPass {
 
     // Map a base pointer to all access functions accessing it.
     BaseToAFs NonAffineAccesses, AffineAccesses;
+    BaseToElSize ElementSize;
 
     DetectionContext(Region &R, AliasAnalysis &AA, bool Verify)
         : CurRegion(R), AST(AA), Verifying(Verify), Log(&R) {}
index c45524c..84508a2 100644 (file)
@@ -363,7 +363,7 @@ bool ScopDetection::hasAffineMemoryAccesses(DetectionContext &Context) const {
 
     // Second step: find array shape.
     SmallVector<const SCEV *, 4> Sizes;
-    SE->findArrayDimensions(Terms, Sizes);
+    SE->findArrayDimensions(Terms, Sizes, Context.ElementSize[BasePointer]);
 
     // Third step: compute the access functions for each subscript.
     for (const SCEVAddRecExpr *AF : Context.NonAffineAccesses[BasePointer]) {
@@ -422,6 +422,9 @@ bool ScopDetection::isValidMemoryAccess(Instruction &Inst,
       return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true,
                                             AccessFunction);
 
+    const SCEV *ElementSize = SE->getElementSize(&Inst);
+    Context.ElementSize[BasePointer] = ElementSize;
+
     // Collect all non affine memory accesses, and check whether they are linear
     // at the end of scop detection. That way we can delinearize all the memory
     // accesses to the same array in a unique step.
index 042f1cb..f007e3a 100644 (file)
@@ -171,7 +171,9 @@ IRAccess TempScopInfo::buildIRAccess(Instruction *Inst, Loop *L, Region *R) {
   const SCEVAddRecExpr *AF = dyn_cast<SCEVAddRecExpr>(AccessFunction);
 
   if (!IsAffine && PollyDelinearize && AF) {
-    const SCEV *Remainder = AF->delinearize(*SE, Subscripts, Sizes);
+    const SCEV *ElementSize = SE->getElementSize(Inst);
+    const SCEV *Remainder =
+        AF->delinearize(*SE, Subscripts, Sizes, ElementSize);
     int NSubs = Subscripts.size();
 
     if (NSubs > 0) {