[LLVMdev] Auto-vectorization and phi nodes
Hal Finkel
hfinkel at anl.gov
Tue Feb 19 07:51:11 PST 2013
----- Original Message -----
> From: "Vesa Norilo" <vnorilo at siba.fi>
> To: llvmdev at cs.uiuc.edu
> Sent: Tuesday, February 19, 2013 4:40:26 AM
> Subject: [LLVMdev] Auto-vectorization and phi nodes
>
> Hi all,
>
> Sorry if this is a dumb or FAQ or the wrong list!
>
> I'm currently investigating LLVM vectorization of my generated code.
> My
> codegen emits a lot of recursions that step through arrays via
> pointers.
> The recursions are nicely optimized into loops, but the loop
> vectorization can't seem to work on them because of phi nodes that
> point
> to gep nodes.
>
> Some simple IR to demonstrate; it vectorizes nicely with opt -O3
> -vectorize-loops -force-vector-width until I uncomment the phi/gep
> nodes.
>
> define void @add_vector(float* noalias %a, float* noalias %b, float*
> noalias %c, i32 %num)
> {
> Top:
> br label %Loop
> Loop:
> %i = phi i32 [0,%Top],[%i.next,%Loop]
>
> ; phi and gep - won't vectorize
> ; %a.ptr = phi float* [%a,%Top],[%a.next,%Loop]
> ; %b.ptr = phi float* [%b,%Top],[%b.next,%Loop]
> ; %c.ptr = phi float* [%c,%Top],[%c.next,%Loop]
>
> ; %a.next = getelementptr float* %a.ptr, i32 1
> ; %b.next = getelementptr float* %b.ptr, i32 1
> ; %c.next = getelementptr float* %c.ptr, i32 1
>
> ; induction variable as index - will vectorize
> %a.ptr = getelementptr float* %a, i32 %i
> %b.ptr = getelementptr float* %b, i32 %i
> %c.ptr = getelementptr float* %c, i32 %i
>
> %a.val = load float* %a.ptr
> %b.val = load float* %b.ptr
> %sum = fadd float %a.val, %b.val
> store float %sum, float* %c.ptr
>
> %i.next = add i32 %i, 1
> %more = icmp slt i32 %i.next, %num
> br i1 %more, label %Loop, label %End
> End:
> ret void
> }
>
> So it seems that the loop vectorizer would like the pointer stepping
> to
> be converted to base+index. However as expected, clang doesn't care
> whether C code is written as pointer arithmetic or table index.
>
> Is there a pass that converts simple pointer arithmetic to
> base+index?
As I recall, loop strength reduction can do this; but that happens only very late in the compilation process (well after vectorization). It would probably be better to update the loop vectorizer to deal with this directly. Nadav?
-Hal
> If not, should I write one (shouldn't be too hard for my limited use
> case) or try to emit more vector-friendly code from the front end?
>
> Thanks a bunch!
> Vesa Norilo
> _______________________________________________
> 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