[LLVMdev] loop fusion

Andrew Clinton andrew at sidefx.com
Wed Sep 8 11:34:33 CDT 2010


I did find this note from 2004 that references a LoopFusion pass, but I 
can't find it in the source code:
http://nondot.org/sabre/LLVMNotes/LoopOptimizerNotes.txt

A little background - I'm working on a SIMD runtime, where I have a 
scalar program but need to execute it on multiple independent data 
elements.  One approach is to generate a loop for each operation, then 
rely on the optimizer to merge the loops so that I get good locality.  
Does this sound like a reasonable approach in LLVM?  If you're familiar 
with CUDA, I'm after something quite similar where the program is scalar 
but the runtime is vectorized.  Any pointers in the right direction 
would be appreciated!

Andrew

On 09/07/2010 03:12 PM, Andrew Clinton wrote:
> Is there a transformation in LLVM that will perform loop fusion?
> http://en.wikipedia.org/wiki/Loop_fusion
>
> I have the following program, in which I would like the 2 loops
> (iterating the same number of times) to be merged into 1, after which
> other nice optimizations such as mem2reg will apply:
>
> ; ModuleID = 'test'
>
> define void @vector([16 x float]* nocapture %arg, [16 x float]*
> nocapture %ret) {
> bb.nph12:
>     %0 = alloca [16 x float], align 4               ;<[16 x float]*>
> [#uses=2]
>     br label %loop
>
> loop:                                             ; preds = %loop,
> %bb.nph12
>     %indvar13 = phi i64 [ 0, %bb.nph12 ], [ %indvar.next14, %loop ] ;
> <i64>  [#uses=3]
>     %gep = getelementptr [16 x float]* %ret, i64 0, i64 %indvar13 ;
> <float*>  [#uses=1]
>     %gep1 = getelementptr [16 x float]* %0, i64 0, i64 %indvar13 ;
> <float*>  [#uses=1]
>     %load = load float* %gep                        ;<float>  [#uses=1]
>     store float %load, float* %gep1
>     %indvar.next14 = add i64 %indvar13, 1           ;<i64>  [#uses=2]
>     %exitcond15 = icmp eq i64 %indvar.next14, 16    ;<i1>  [#uses=1]
>     br i1 %exitcond15, label %loop3, label %loop
>
> loop3:                                            ; preds = %loop, %loop3
>     %indvar = phi i64 [ %indvar.next, %loop3 ], [ 0, %loop ] ;<i64>
> [#uses=3]
>     %gep6 = getelementptr [16 x float]* %0, i64 0, i64 %indvar ;<float*>
> [#uses=1]
>     %gep8 = getelementptr [16 x float]* %arg, i64 0, i64 %indvar ;
> <float*>  [#uses=1]
>     %load7 = load float* %gep6                      ;<float>  [#uses=1]
>     store float %load7, float* %gep8
>     %indvar.next = add i64 %indvar, 1               ;<i64>  [#uses=2]
>     %exitcond = icmp eq i64 %indvar.next, 16        ;<i1>  [#uses=1]
>     br i1 %exitcond, label %end4, label %loop3
>
> end4:                                             ; preds = %loop3
>     ret void
> }
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>    



More information about the LLVMdev mailing list