[LLVMdev] loop fusion
Andrew Clinton
andrew at sidefx.com
Tue Sep 7 12:12:40 PDT 2010
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
}
More information about the llvm-dev
mailing list