From 5133d2e9d4611d6d2d476aee14031f05e17557d1 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Fri, 21 Feb 2014 18:15:07 +0000 Subject: [PATCH] fail delinearization when the size of subscripts differs Because the delinearization is not a global analysis pass, it will compute the delinearization independently of knowledge about the way the delinearization happened for other data accesses to the same array: the dependence analysis will only trigger the delinearization on a tuple of access functions, and thus delinearization may compute different subscripts sizes for a same array. When that happens the safest is to discard the delinearized information. llvm-svn: 201866 --- llvm/lib/Analysis/DependenceAnalysis.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp index b74140db2cfb..6f9effa127a0 100644 --- a/llvm/lib/Analysis/DependenceAnalysis.cpp +++ b/llvm/lib/Analysis/DependenceAnalysis.cpp @@ -3193,10 +3193,23 @@ DependenceAnalysis::tryDelinearize(const SCEV *SrcSCEV, const SCEV *DstSCEV, DstAR->delinearize(*SE, DstSubscripts, DstSizes); int size = SrcSubscripts.size(); - int dstSize = DstSubscripts.size(); - if (size != dstSize || size < 2) + // Fail when there is only a subscript: that's a linearized access function. + if (size < 2) return false; + int dstSize = DstSubscripts.size(); + // Fail when the number of subscripts in Src and Dst differ. + if (size != dstSize) + return false; + + // Fail when the size of any of the subscripts in Src and Dst differs: the + // dependence analysis assumes that elements in the same array have same size. + // SCEV delinearization does not have a context based on which it would decide + // globally the size of subscripts that would best fit all the array accesses. + for (int i = 0; i < size; ++i) + if (SrcSizes[i] != DstSizes[i]) + return false; + #ifndef NDEBUG DEBUG(errs() << "\nSrcSubscripts: "); for (int i = 0; i < size; i++)