[LLVMdev] Question to Chris

Bill Wendling isanbard at gmail.com
Sat Jan 26 22:10:01 PST 2008


On Jan 26, 2008, at 9:48 AM, Seung Jae Lee wrote:

> Dear Dr.Lattner
>
> Hello, Dr.Lattner.
> You may find your reply at http://lists.cs.uiuc.edu/pipermail/ 
> llvmdev/2007-August/010479.html and other your replies to me right  
> up and down at the list.
> You had suggested me to read the "structural analysis" section in  
> Muchnick's book.
> Thank you for this. I bought and read it, which was very helpful  
> but...
> I still don't have any idea about how to deal with phi-nodes in  
> LLVM Intermediate Representation systemically to resolve my problem.
> In order to construct high-level 'for' from LLVM IR, it is critical  
> to move Phi-nodes hither and thither or split them but... I can't  
> find any material about this from anywhere.
> So could you reply to me briefly about this if you are fine?
>
> Thank you very much and have a good day.
> Seung J. Lee
>
> P.S: In fact, I am thinking about an alternative way for doing this  
> by using reverse engineering. Now that LLVM IR has phi-nodes which  
> is tricky to handle for this issue, I just slightly changed my way  
> to use the machine assembly which does not have phi-nodes. Already  
> someone (like Doug Simon in Sun microsystems) got high-level C code  
> "which is quite same with the original including loops,  
> conditionals and so on" from Sparc assembly by using de-compilation.
> Therefore, if you reply "it is difficult to handle phi-nodes for  
> constructing high-level loops", I am almost ready to go the other  
> way using the machine assembly.
> Anyway, could you shed some lights on me?
> Thank you very much

Hi Seung,

It would appear to me that you would simply need to perform a  
modified form of "un-SSAification". For instance, if you have PHI  
nodes whose values come from the back edges of a loop, then you could  
perhaps store those values to memory and then load them inside of the  
loop in place of the PHI node.

Meta-code:

BB1:
     %v1 = ...
     ...
     br label %Loop


Loop:
     %v2 = phi i32 [%v1, %BB1], [%v3, %BB2]
     ...
     br label %BB2


BB2:
     %v3 = ...
     br label %Loop


into something like:

Entry:
     %ptr = alloca i32
...
BB1:
     %v1 = ...
     store i32 %v1, %32* %ptr
     ...
     br label %Loop

Loop:
     %v2 = load i32* %ptr
     ...
     br label %BB2

BB2:
     %v3 = ...
     store i32 %v3, i32* %ptr
     ...
     br label %Loop

What do you think?

-bw



More information about the llvm-dev mailing list