Skip to content

Commit

Permalink
fail delinearization when the size of subscripts differs
Browse files Browse the repository at this point in the history
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201866 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Sebastian Pop committed Feb 21, 2014
1 parent 1268135 commit fc605ac
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion lib/Analysis/DependenceAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3193,10 +3193,23 @@ DependenceAnalysis::tryDelinearize(const SCEV *SrcSCEV, const SCEV *DstSCEV,
DstAR->delinearize(*SE, DstSubscripts, DstSizes);

int size = SrcSubscripts.size();
// Fail when there is only a subscript: that's a linearized access function.
if (size < 2)
return false;

int dstSize = DstSubscripts.size();
if (size != dstSize || size < 2)
// 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++)
Expand Down

0 comments on commit fc605ac

Please sign in to comment.