[LLVMdev] determining the number of iteration of a loop
ether zhhb
etherzhhb at gmail.com
Thu Apr 22 03:26:07 PDT 2010
hi,
you could try the getBackedgeTakenCount function of ScalarEvolution.
opt -scalar-evolution -analyze
define void @f(i64* nocapture %a, i64 %N) nounwind {
entry:
%0 = icmp sgt i64 %N, 0 ; <i1> [#uses=1]
br i1 %0, label %bb, label %return
bb: ; preds = %bb, %entry
%1 = phi i64 [ 0, %entry ], [ %2, %bb ] ; <i64> [#uses=3]
%scevgep = getelementptr i64* %a, i64 %1 ; <i64*> [#uses=1]
store i64 %1, i64* %scevgep, align 8
%2 = add nsw i64 %1, 1 ; <i64> [#uses=2]
%exitcond = icmp eq i64 %2, %N ; <i1> [#uses=1]
br i1 %exitcond, label %return, label %bb
return: ; preds = %bb, %entry
ret void
}
Printing analysis 'Scalar Evolution Analysis' for function 'f':
Classifying expressions for: @f
%0 = icmp sgt i64 %N, 0 ; <i1> [#uses=1]
--> %0
%1 = phi i64 [ 0, %entry ], [ %2, %bb ] ; <i64> [#uses=3]
--> {0,+,1}<%bb> Exits: (-1 + %N)
%scevgep = getelementptr i64* %a, i64 %1 ; <i64*> [#uses=1]
--> {%a,+,sizeof(i64)}<%bb> Exits: (((-1 + %N) * sizeof(i64)) +
%a)
%2 = add nsw i64 %1, 1 ; <i64> [#uses=2]
--> {1,+,1}<%bb> Exits: %N
%exitcond = icmp eq i64 %2, %N ; <i1> [#uses=1]
--> %exitcond Exits: <<Unknown>>
Determining loop execution counts for: @f
Loop %bb: backedge-taken count is (-1 + %N)
Loop %bb: max backedge-taken count is (-1 + %N)
--best regares
ether
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100422/aa1edcca/attachment.html>
More information about the llvm-dev
mailing list