Support accesses with differently sized types to the same array
authorTobias Grosser <tobias@grosser.es>
Thu, 4 Feb 2016 13:18:42 +0000 (13:18 +0000)
committerTobias Grosser <tobias@grosser.es>
Thu, 4 Feb 2016 13:18:42 +0000 (13:18 +0000)
commitd840fc7277bf43214f7622cf43ac8cea5e0ee052
tree8d9282ad7e399f81f4138072acd66a79fc240a51
parent2293685731bd02a352d36ca2a54211169631f5bd
Support accesses with differently sized types to the same array

This allows code such as:

void multiple_types(char *Short, char *Float, char *Double) {
  for (long i = 0; i < 100; i++) {
    Short[i] = *(short *)&Short[2 * i];
    Float[i] = *(float *)&Float[4 * i];
    Double[i] = *(double *)&Double[8 * i];
  }
}

To model such code we use as canonical element type of the modeled array the
smallest element type of all original array accesses, if type allocation sizes
are multiples of each other. Otherwise, we use a newly created iN type, where N
is the gcd of the allocation size of the types used in the accesses to this
array. Accesses with types larger as the canonical element type are modeled as
multiple accesses with the smaller type.

For example the second load access is modeled as:

  { Stmt_bb2[i0] -> MemRef_Float[o0] : 4i0 <= o0 <= 3 + 4i0 }

To support code-generating these memory accesses, we introduce a new method
getAccessAddressFunction that assigns each statement instance a single memory
location, the address we load from/store to. Currently we obtain this address by
taking the lexmin of the access function. We may consider keeping track of the
memory location more explicitly in the future.

We currently do _not_ handle multi-dimensional arrays and also keep the
restriction of not supporting accesses where the offset expression is not a
multiple of the access element type size. This patch adds tests that ensure
we correctly invalidate a scop in case these accesses are found. Both types of
accesses can be handled using the very same model, but are left to be added in
the future.

We also move the initialization of the scop-context into the constructor to
ensure it is already available when invalidating the scop.

Finally, we add this as a new item to the 2.9 release notes

Reviewers: jdoerfert, Meinersbur

Differential Revision: http://reviews.llvm.org/D16878

llvm-svn: 259784
19 files changed:
polly/docs/ReleaseNotes.rst
polly/include/polly/ScopDetectionDiagnostic.h
polly/include/polly/ScopInfo.h
polly/include/polly/Support/ScopHelper.h
polly/lib/Analysis/ScopDetection.cpp
polly/lib/Analysis/ScopDetectionDiagnostic.cpp
polly/lib/Analysis/ScopInfo.cpp
polly/lib/CodeGen/BlockGenerators.cpp
polly/lib/CodeGen/IslNodeBuilder.cpp
polly/test/Isl/CodeGen/MemAccess/multiple_types.ll [new file with mode: 0644]
polly/test/Isl/CodeGen/MemAccess/multiple_types___%bb1---%bb22.jscop [new file with mode: 0644]
polly/test/Isl/CodeGen/multiple-types-invariant-load.ll [new file with mode: 0644]
polly/test/ScopDetectionDiagnostics/ReportDifferentElementSize.ll [deleted file]
polly/test/ScopInfo/multiple-types-access-offset-not-dividable-by-element-size.ll [new file with mode: 0644]
polly/test/ScopInfo/multiple-types-non-power-of-two-2.ll [new file with mode: 0644]
polly/test/ScopInfo/multiple-types-non-power-of-two.ll [new file with mode: 0644]
polly/test/ScopInfo/multiple-types-two-dimensional-2.ll [new file with mode: 0644]
polly/test/ScopInfo/multiple-types-two-dimensional.ll [new file with mode: 0644]
polly/test/ScopInfo/multiple-types.ll [new file with mode: 0644]