[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