[LLVMdev] How to eliminate PHI nodes on pointer types?
Duncan Sands
baldrick at free.fr
Mon Aug 20 12:46:32 PDT 2012
Hi Andrew,
> Somewhere during optimization PHI nodes on pointer types (including
> alloca instructions) are being introduced, and they persist through the
> scalar replacement of aggregates pass and others. I can't seem to find
> a combination of passes or transformations to get rid of them. Has
> anyone had this problem before, and know a transformation to eliminate
> it? My optimization passes rely on everything being in pure SSA form.
why is this a problem? Presumably you are happy with phi nodes of integer
or float type, why are phi nodes of pointer type problematic?
Ciao, Duncan.
PS: I'm not sure what you mean by "pure SSA form". Phi nodes are needed for
values of pointer type exactly because these values are in SSA form...
>
> One more note, this particular optimization problem only seems to occur
> in llvm 2.8, not 3.0 - though I can't say for sure whether it never
> happens in 3.0.
>
> Here's an example from the compiled code:
>
>
> define private void @"vop_bindST at FFIFFI"(double* %news, double* %ss,
> i32* %isSConnected, double* %newt, double* %tt, i32* %isTConnected)
> nounwind alwaysinline {
> entry:
> %"reg2mem alloca point" = bitcast i32 0 to i32
> %isSConnected1 = load i32* %isSConnected
> %0 = icmp eq i32 %isSConnected1, 0
> br i1 %0, label %false, label %true
>
> true: ; preds = %entry
> br label %end
>
> false: ; preds = %entry
> br label %end
>
> end: ; preds = %false, %true
> %phi.in.reg2mem.0 = phi double* [ @s, %false ], [ %ss, %true ]
> %phi = load double* %phi.in.reg2mem.0
> store double %phi, double* %news
> %isTConnected4 = load i32* %isTConnected
> %1 = icmp eq i32 %isTConnected4, 0
> br i1 %1, label %false6, label %true5
>
> true5: ; preds = %end
> br label %end7
>
> false6: ; preds = %end
> br label %end7
>
> end7: ; preds = %false6, %true5
> %phi9.in.reg2mem.0 = phi double* [ @t, %false6 ], [ %tt, %true5 ]
> %phi9 = load double* %phi9.in.reg2mem.0
> store double %phi9, double* %newt
> ret void
> }
> _______________________________________________
> 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