[PATCH] D35430: DA: remove uses of GEP, only ask SCEV

Sebastian Pop via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 14 11:59:52 PDT 2017


sebpop created this revision.

It's been quite some time the Dependence Analysis (DA) is broken,
as it uses the GEP representation to "identify" multi-dimensional arrays.
It even wrongly detects multi-dimensional arrays in single nested loops:

from test/Analysis/DependenceAnalysis/Coupled.ll, example @couple6
;;  for (long int i = 0; i < 50; i++) {
;;    A[i][3*i - 6] = i;
;;    *B++ = A[i][i];

DA used to detect two subscripts, which makes no sense in the LLVM IR
or in C/C++ semantics, as there are no guarantees as in Fortran of
subscripts not overlapping into a next array dimension:

  maximum nesting levels = 1
  SrcPtrSCEV = %A
  DstPtrSCEV = %A
  using GEPs
  subscript 0
      src = {0,+,1}<nuw><nsw><%for.body>
      dst = {0,+,1}<nuw><nsw><%for.body>
      class = 1
      loops = {1}
  subscript 1
      src = {-6,+,3}<nsw><%for.body>
      dst = {0,+,1}<nuw><nsw><%for.body>
      class = 1
      loops = {1}
  Separable = {}
  Coupled = {1}

With the current patch, DA will correctly work on only one dimension:

  maximum nesting levels = 1
  SrcSCEV = {(-2424 + %A)<nsw>,+,1212}<%for.body>
  DstSCEV = {%A,+,404}<%for.body>
  subscript 0
      src = {(-2424 + %A)<nsw>,+,1212}<%for.body>
      dst = {%A,+,404}<%for.body>
      class = 1
      loops = {1}
  Separable = {0}
  Coupled = {}

This change removes all uses of GEP from DA, and we now only rely
on the SCEV representation.

The patch does not turn on -da-delinearize by default, though without
delinearization, and so the DA analysis will be more conservative in the
case of multi-dimensional memory accesses in nested loops.

I disabled some interchange tests, as the DA is not able to disambiguate
the dependence anymore.  To make DA stronger, we may need to
compute a bound on the number of iterations based on the access functions
and array dimensions.

Patch written by Sebastian Pop and Aditya Kumar.


https://reviews.llvm.org/D35430

Files:
  llvm/lib/Analysis/DependenceAnalysis.cpp
  llvm/test/Analysis/DependenceAnalysis/Coupled.ll
  llvm/test/Analysis/DependenceAnalysis/ExactSIV.ll
  llvm/test/Analysis/DependenceAnalysis/GCD.ll
  llvm/test/Analysis/DependenceAnalysis/Invariant.ll
  llvm/test/Analysis/DependenceAnalysis/NonCanonicalizedSubscript.ll
  llvm/test/Analysis/DependenceAnalysis/Preliminary.ll
  llvm/test/Analysis/DependenceAnalysis/Propagating.ll
  llvm/test/Analysis/DependenceAnalysis/Separability.ll
  llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll
  llvm/test/Analysis/DependenceAnalysis/SymbolicSIV.ll
  llvm/test/Transforms/LoopInterchange/interchange.ll
  llvm/test/Transforms/LoopInterchange/profitability.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D35430.106680.patch
Type: text/x-patch
Size: 64063 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170714/9d3df2cf/attachment-0001.bin>


More information about the llvm-commits mailing list