[LLVMdev] "Graphite" for llvm

Dan Gohman gohman at apple.com
Mon Jan 4 11:44:24 PST 2010


On Dec 28, 2009, at 4:24 PM, Tobias Grosser wrote:
> 
> Probably. I think for single dimensional arrays it will not be too 
> difficult using scalar evolution to get the access functions. I think 
> multi dimensional arrays will get complicated.

If you want to know how the address is calculated as a function of
each enclosing loop, ScalarEvolution should be quite usable for
multiple dimensions. This is represented with an add-recurrence
with another add-recurrence as its "start" operand. For example:

  for (i=0; i<m; ++i)    // X
    for (j=0; j<n; ++j)  // Y
      A[i][j];

The store address has this expression:

  {{A,+,sizeof(double)*n}<X>,+,sizeof(double)}<Y>

This says that the value starts at A, steps by sizeof(double)*n
(address units) with the iteration of loop X, and steps by
sizeof(double) with the iteration of loop Y.

However, if you want to recognize this as a high-level array
reference on A with subscripts "i" and then "j", there are some
missing pieces.

On a related note, analyzing getelementptr yourself directly is
doable, but there are several major complications. Using a helper
library such as ScalarEvolution can protect you from many
low-level artifacts (though not all).

Dan




More information about the llvm-dev mailing list