[LLVMdev] indirectbr and phi instructions

Bill Wendling wendling at apple.com
Mon Aug 2 18:46:59 PDT 2010


On Aug 2, 2010, at 3:19 PM, Joshua Warner wrote:

> Hi,
> 
> How does the requirement that phi instructions have one value per predecessor basic block interact with indirectbr instructions?  For instance, take the following code:
> 
> L1:
>    br i1 %somevalue, label %L2, label %L3
> L2:
>    %ret1 = i8* blockaddress(@myfunction, %L5)
>    br label %L4
> L3:
>    %ret2 = i8* blockaddress(@myfunction, %L6)
>    br label %L4
> L4:
>    %ret = phi i8* [%ret1, L2], [%ret2, L3]
>    indirectbr i8* %ret, [label %L5, label %L6]
> L5:
>    %myval = phi i32 [0, %L2], [1, %L3] ; are both of these values required, even though the only *real* possible predecessor block is L2?
>    ret i32 %myval
> L6:
>    %myval = phi i32 [0, %L2], [1, %L3] ; likewise
>    ret i32 %myval
> 
> Boiled down, I think my question is, "how strict is the 'one value per predecessor block' rule on a phi instruction?"
> 
Actually, if you look at your example, it will fail because of the PHIs in L5 and L6. :-) The PHI node entries must match up one-to-one and onto with the predecessors. Here's an example that will fail during code-gen:

@a1 = global i8* blockaddress(@foo, %bb4)
@a2 = global i8* blockaddress(@foo, %bb5)

define i32 @foo(i1 %a, i32 %b) {
entry:
  %a1_ = load i8** @a1
  %a2_ = load i8** @a2
  br i1 %a, label %bb1, label %bb2

bb1:
  %v1 = add i32 %b, 37
  br label %bb3

bb2:
  %v2 = add i32 %b, 927
  br label %bb3

bb3:
  %addr = phi i8* [%a1_, %bb1], [%a2_, %bb2]
  indirectbr i8* %addr, [label %bb4, label %bb5]

bb4:
  %v_bb4 = phi i32 [%v1, %bb1], [%v2, %bb2]
  br label %exit

bb5:
  %v_bb5 = phi i32 [%v1, %bb1], [%v2, %bb2]
  br label %exit

exit:
  %p = phi i32 [%v_bb4, %bb4], [%v_bb5, %bb5]
  ret i32 %p
}


-bw





More information about the llvm-dev mailing list