Even though we previously correctly detected the multi-dimensional access
pattern for accesses with a certain base address, we only delinearized
non-affine accesses to this address. Affine accesses have not been touched and
remained as single dimensional accesses. The result was an inconsistent
description of accesses to the same array, with some being one dimensional and
some being multi-dimensional.
This patch ensures that all accesses are delinearized with the same
dimensionality as soon as a single one of them has been detected as non-affine.
While writing this patch, it became evident that the options
-polly-allow-nonaffine and -polly-detect-keep-going have not been properly
supported in case delinearization has been turned on. This patch adds relevant
test coverage and addresses these issues as well. We also added some more
documentation to the functions that are modified in this patch.
TODO: The documentation and the structure of this function is possibly still
non-perfect. If reviewers can suggest ways to further improve the readability of this function, such comments are appreciated. Maybe we should outline some of the computations performed in hasAffineMemoryAccesses()?
This fixes llvm.org/PR20123
The rrkDifferentElementSize enum value should go above rrkLastAffFunc because ReportDifferentArrayElementSize is a subclass of ReportAffFunc. Otherwise
will be false.