[LLVMdev] scalar evolution to determine access functions in arays

Tobias Grosser tobias at grosser.es
Tue Aug 2 17:21:22 PDT 2011


On 07/27/2011 03:11 PM, Jimborean Alexandra wrote:
> Hello,
>
> How can I compute the functions on the loop iterators used as array
> indices?
>
> For example:
>
> for i = 0, N
> for j = 0, M
> A[2*i + j - 10] = ...
>
> Can I obtain that this instruction A[2*i + j - 10]= .. always accesses
> memory using a function f(i,j) = 2*i + j - 10 + base_address_of_A
>
> If I run the scalar evolution pass on this code I obtain:
>
> %arrayidx = getelementptr inbounds [200 x i32]* @main.A, i32 0, i64 %idxprom
>
> --> ((4 * (sext i32 (-10 + (2 * %tmp6) + %tmp7) to i64)) + @main.A)
>
> Could you please offer an insight on how can I obtain the function from
> the internals of the scalar evolution pass?


Hi Alexandra,

sorry for the delay, I was a little bit busy.

In general your approach is correct, but scalar evolution is in your 
case not able to derive an access function that is defined in terms of 
loop iterators. (If it would you would have something like {0, + 
1}<loop_1> in your scev expression).

What I suspect is that you need to run some canonicalization passes 
before you actually run the scalar evolution pass. Most of the time 
these passes should be sufficient:
-correlated-propagation -mem2reg -instcombine -loop-simplify -indvars

But in Polly we use e.g.:
-basicaa -mem2reg -simplify-libcalls -simplifycfg -instcombine 
-tailcallelim -loop-simplify -lcssa -loop-rotate -lcssa -loop-unswitch 
-instcombine -loop-simplify -lcssa -indvars -loop-deletion -instcombine 
-polly-prepare -polly-region-simplify -indvars

If you send me the .ll file you run your tool on, I could take a closer 
look.

Cheers and all the best
Tobi





More information about the llvm-dev mailing list