[LLVMdev] Version 1.9 SSA form question

Reid Spencer rspencer at reidspencer.com
Thu Mar 1 15:56:39 PST 2007


Hi Mark,

On Thu, 2007-03-01 at 15:36 -0800, Schimmel, Mark wrote:
> int %nlz10(uint %param.x) {
>         %.t3 = shr uint %param.x, ubyte 1               ; <uint>
> [#uses=1]
>         %.t4 = or uint %.t3, %param.x           ; <uint> [#uses=2]
>         %.t7 = shr uint %.t4, ubyte 2           ; <uint> [#uses=1]
>         %.t8 = or uint %.t7, %.t4               ; <uint> [#uses=2]
>         %.t11 = shr uint %.t8, ubyte 4          ; <uint> [#uses=1]
>         %.t12 = or uint %.t11, %.t8             ; <uint> [#uses=2]
>         %.t15 = shr uint %.t12, ubyte 8         ; <uint> [#uses=1]
>         %.t16 = or uint %.t15, %.t12            ; <uint> [#uses=2]
>         %.t19 = shr uint %.t16, ubyte 16                ; <uint>
> [#uses=1]
>         %.t20 = or uint %.t19, %.t16            ; <uint> [#uses=1]
>         %.t22 = mul uint %.t20, 116069625               ; <uint>
> [#uses=1]
>         %.t25 = shr uint %.t22, ubyte 26                ; <uint>
> [#uses=1]
>         %.t28 = getelementptr [64 x ubyte]* %table, int 0, uint %.t25
> ; <ubyte*> [#uses=1]
>         %.t28 = load ubyte* %.t28               ; <ubyte> [#uses=1]
>         %.t31 = cast ubyte %.t28 to int         ; <int> [#uses=1]
>         ret int %.t31
> } 
> 
> This is the disassembled output after running the optimizer.  How can
> %.t28 be written to twice?  That isn't my understanding of SSA.

We have corrected this in the most recent version of LLVM (CVS HEAD).
The reason it was allowed previously is because of "type planes". That
is, the names only needed to be unique for a given type. So, %.t28
resulting from the GEP is of type ubyte* while %.t28 resulting from the
LOAD is of type ubyte. Thus, no conflict.

However, many people have found this confusing so we did away with type
planes. It is now illegal to reuse a name, of any type, in a function.

> 
> Here's another similar situation:
> 
>         %x.2.i73 = cast uint %x.2.i73 to int            ; <int>
> [#uses=1]
> 
> Why are we not assigning to a different ssa var?

It is a different SSA var, just happens to have the same name.

> 
> 
> _______________________________________________
> 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 llvm-dev mailing list