Seung Jae Lee
2007-Sep-17 14:36 UTC
[LLVMdev] constructing 'for' statement from LLVM bitcode
Wow... Thank you so much for this. I'll try this one. Thanks again, Wojciech. SJL ---- Original message ---->Date: Sat, 15 Sep 2007 15:07:34 +0200 >From: Wojciech Matyjewicz <wmatyjewicz at fastmail.fm> >Subject: Re: [LLVMdev] constructing 'for' statement from LLVM bitcode >To: LLVM Developers Mailing List <llvmdev at cs.uiuc.edu> > >Hi, > >Seung Jae Lee wrote: >> Hello, guys. >> I am trying to construct higher-level 'for' from the low-level LLVM bitcode(ver 1.9). >> It's partly successful thanks to David A. Greene's advice suggested to use Control Dependence Graph(CDG). >> I could find which BB contributes to form which loop with CDG. > >I know my post comes late... Are you still interested in this subject? >No? Just ignore it;) > >I have been recently dealing with a task which is somehow similar to >yours. I was trying to reconstruct simple 'for' loops and check if it's >possible to automatically parallelize their execution. > >> For example, for this simple function: >> ----------------------------------------------------------- >> void bsloop(int n, int pM, Params* ps) { >> int i, sim; >> for (sim=0; sim < pM; sim++) { >> for (i = 0; i < n; i++) { >> Params* p = ps + i; >> double eps = norm(0,1); >> } >> } >> } > >I think it would be possible to reconstruct loops like this. However, it >might be very difficult (impossible in general?) if they contained >'break', 'continue' or 'goto' statements. > >Have you tried the use LoopInfo pass for your aim? If you compile the >example to bitcode without optimization and then choose optimizer passes >manually: > opt -mem2reg -instcombine -indvars -o bsloop-opt.bc bsloop.bc >you will get the following code for bsloop() function (llvm and >llvm-gcc-4.2 from SVN): >-------------------------------------------------------- >define void @bsloop(i32 %n, i32 %pM, %struct.Params* %ps) { >entry: > br label %bb16 > >bb1: ; preds = %bb8 > %tmp4 = call i32 (...)* @norm( i32 0, i32 1 ) > %indvar.next = add i32 %i.0, 1 > br label %bb8 > >bb8: ; preds = %bb16, %bb1 > %i.0 = phi i32 [ %indvar.next, %bb1 ], [ 0, %bb16 ] > %tmp11 = icmp slt i32 %i.0, %n > br i1 %tmp11, label %bb1, label %bb13 > >bb13: > %indvar.next1 = add i32 %sim.0, 1 > br label %bb16 > >bb16: > %sim.0 = phi i32 [ 0, %entry ], [ %indvar.next1, %bb13 ] > %tmp19 = icmp slt i32 %sim.0, %pM > br i1 %tmp19, label %bb8, label %return > >return: > ret void >} >-------------------------------------------------------- > >Then, running LoopInfo pass: > opt -analyze -loops bsloop-opt.bc >prints: >-------------------------------------------------------- >Printing analysis 'Natural Loop Construction' for function 'bsloop': >Loop Containing: %bb16, %bb13, %bb8, %bb1 > Loop Containing: %bb8, %bb1 >-------------------------------------------------------- > >Using the LoopInfo interface allows you to gather much useful >information. In the internal loop basic block bb8 is the header, %i.0 is >the canonical induction variable (and the only induction variable). Loop >has a trip count %n which is a loop invariant. Inspecting the header >shows it doesn't produce any values that are used outside of it, except >for the loop induction variable. Furthermore, it doesn't produce any >side effects. Hence, in this simple case a 'for' loop could be >reconstructed: > FOR %i.0 = 0 TO %n - 1 STEP 1: > %tmp4 = call i32 (...)* @norm( i32 0, i32 1 ) > //%indvar.next is no longer needed > >I know such a heuristic applies to very simple 'for' loops only. >However, "very simple 'for' loops" are quite popular;) > >--Wojtek >_______________________________________________ >LLVM Developers mailing list >LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev