[llvm] r207574 - Fix vectorization remarks.

Nadav Rotem nrotem at apple.com
Tue Apr 29 14:10:22 PDT 2014


Thank you for working on this Diego!  Can you please document the fact that the vectorizer can now emit remarks? A small example in the vectorization page would be great: http://llvm.org/docs/Vectorizers.html 

Thanks,
Nadav

On Apr 29, 2014, at 1:06 PM, Diego Novillo <dnovillo at google.com> wrote:

> Author: dnovillo
> Date: Tue Apr 29 15:06:10 2014
> New Revision: 207574
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=207574&view=rev
> Log:
> Fix vectorization remarks.
> 
> This patch changes the vectorization remarks to also inform when
> vectorization is possible but not beneficial.
> 
> Added tests to exercise some loop remarks.
> 
> Added:
>    llvm/trunk/test/Transforms/LoopUnroll/loop-remarks.ll
>    llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks.ll
> Modified:
>    llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
> 
> Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=207574&r1=207573&r2=207574&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
> +++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Tue Apr 29 15:06:10 2014
> @@ -1209,6 +1209,13 @@ struct LoopVectorize : public FunctionPa
>       if (UF == 1)
>         return false;
>       DEBUG(dbgs() << "LV: Trying to at least unroll the loops.\n");
> +
> +      // Report the unrolling decision.
> +      F->getContext().emitOptimizationRemark(
> +          DEBUG_TYPE, *F, L->getStartLoc(),
> +          Twine("unrolled with interleaving factor " + Twine(UF) +
> +                " (vectorization not beneficial)"));
> +
>       // We decided not to vectorize, but we may want to unroll.
>       InnerLoopUnroller Unroller(L, SE, LI, DT, DL, TLI, UF);
>       Unroller.vectorize(&LVL);
> @@ -1217,17 +1224,17 @@ struct LoopVectorize : public FunctionPa
>       InnerLoopVectorizer LB(L, SE, LI, DT, DL, TLI, VF.Width, UF);
>       LB.vectorize(&LVL);
>       ++LoopsVectorized;
> +
> +      // Report the vectorization decision.
> +      F->getContext().emitOptimizationRemark(
> +          DEBUG_TYPE, *F, L->getStartLoc(),
> +          Twine("vectorized loop (vectorization factor: ") + Twine(VF.Width) +
> +              ", unrolling interleave factor: " + Twine(UF) + ")");
>     }
> 
>     // Mark the loop as already vectorized to avoid vectorizing again.
>     Hints.setAlreadyVectorized(L);
> 
> -    // Report the vectorization decision.
> -    F->getContext().emitOptimizationRemark(
> -        DEBUG_TYPE, *F, L->getStartLoc(),
> -        Twine("vectorized loop (vectorization factor: ") + Twine(VF.Width) +
> -            ", unroll factor: " + Twine(UF) + ")");
> -
>     DEBUG(verifyFunction(*L->getHeader()->getParent()));
>     return true;
>   }
> 
> Added: llvm/trunk/test/Transforms/LoopUnroll/loop-remarks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnroll/loop-remarks.ll?rev=207574&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopUnroll/loop-remarks.ll (added)
> +++ llvm/trunk/test/Transforms/LoopUnroll/loop-remarks.ll Tue Apr 29 15:06:10 2014
> @@ -0,0 +1,25 @@
> +; RUN: opt < %s -S -loop-unroll -pass-remarks=loop-unroll -unroll-count=16 2>&1 | FileCheck -check-prefix=COMPLETE-UNROLL %s
> +; RUN: opt < %s -S -loop-unroll -pass-remarks=loop-unroll -unroll-count=4 2>&1 | FileCheck -check-prefix=PARTIAL-UNROLL %s
> +
> +; COMPLETE-UNROLL: remark: {{.*}}: completely unrolled loop with 16 iterations
> +; PARTIAL-UNROLL: remark: {{.*}}: unrolled loop by a factor of 4
> +
> +define i32 @sum() {
> +entry:
> +  br label %for.body
> +
> +for.body:                                         ; preds = %for.body, %entry
> +  %s.06 = phi i32 [ 0, %entry ], [ %add1, %for.body ]
> +  %i.05 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
> +  %add = add nsw i32 %i.05, 4
> +  %call = tail call i32 @baz(i32 %add) #2
> +  %add1 = add nsw i32 %call, %s.06
> +  %inc = add nsw i32 %i.05, 1
> +  %exitcond = icmp eq i32 %inc, 16
> +  br i1 %exitcond, label %for.end, label %for.body
> +
> +for.end:                                          ; preds = %for.body
> +  ret i32 %add1
> +}
> +
> +declare i32 @baz(i32)
> 
> Added: llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks.ll?rev=207574&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks.ll (added)
> +++ llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks.ll Tue Apr 29 15:06:10 2014
> @@ -0,0 +1,67 @@
> +; RUN: opt < %s -loop-vectorize -mtriple=x86_64-unknown-linux -S -pass-remarks='loop-vectorize' 2>&1 | FileCheck -check-prefix=VECTORIZED %s
> +; RUN: opt < %s -loop-vectorize -force-vector-width=1 -force-vector-unroll=4 -mtriple=x86_64-unknown-linux -S -pass-remarks='.*vectorize.*' 2>&1 | FileCheck -check-prefix=UNROLLED %s
> +
> +; VECTORIZED: remark: {{.*}}.c:17:8: vectorized loop (vectorization factor: 4, unrolling interleave factor: 1)
> +; UNROLLED: remark: {{.*}}.c:17:8: unrolled with interleaving factor 4 (vectorization not beneficial)
> +
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +
> +define i32 @foo(i32 %n) #0 {
> +entry:
> +  %diff = alloca i32, align 4
> +  %cb = alloca [16 x i8], align 16
> +  %cc = alloca [16 x i8], align 16
> +  store i32 0, i32* %diff, align 4, !dbg !10, !tbaa !11
> +  br label %for.body, !dbg !15
> +
> +for.body:                                         ; preds = %for.body, %entry
> +  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
> +  %add8 = phi i32 [ 0, %entry ], [ %add, %for.body ], !dbg !19
> +  %arrayidx = getelementptr inbounds [16 x i8]* %cb, i64 0, i64 %indvars.iv, !dbg !19
> +  %0 = load i8* %arrayidx, align 1, !dbg !19, !tbaa !21
> +  %conv = sext i8 %0 to i32, !dbg !19
> +  %arrayidx2 = getelementptr inbounds [16 x i8]* %cc, i64 0, i64 %indvars.iv, !dbg !19
> +  %1 = load i8* %arrayidx2, align 1, !dbg !19, !tbaa !21
> +  %conv3 = sext i8 %1 to i32, !dbg !19
> +  %sub = sub i32 %conv, %conv3, !dbg !19
> +  %add = add nsw i32 %sub, %add8, !dbg !19
> +  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1, !dbg !15
> +  %exitcond = icmp eq i64 %indvars.iv.next, 16, !dbg !15
> +  br i1 %exitcond, label %for.end, label %for.body, !dbg !15
> +
> +for.end:                                          ; preds = %for.body
> +  store i32 %add, i32* %diff, align 4, !dbg !19, !tbaa !11
> +  call void @ibar(i32* %diff) #2, !dbg !22
> +  ret i32 0, !dbg !23
> +}
> +
> +declare void @ibar(i32*) #1
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!7, !8}
> +!llvm.ident = !{!9}
> +
> +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0 ", i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [./vectorization-remarks.c] [DW_LANG_C99]
> +!1 = metadata !{metadata !"vectorization-remarks.c", metadata !"."}
> +!2 = metadata !{}
> +!3 = metadata !{metadata !4}
> +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 5, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 true, i32 (i32)* @foo, null, null, metadata !2, i32 6} ; [ DW_TAG_subprogram ] [line 5] [def] [scope 6] [foo]
> +!5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type ] [./vectorization-remarks.c]
> +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!7 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
> +!8 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> +!9 = metadata !{metadata !"clang version 3.5.0 "}
> +!10 = metadata !{i32 8, i32 3, metadata !4, null} ; [ DW_TAG_imported_declaration ]
> +!11 = metadata !{metadata !12, metadata !12, i64 0}
> +!12 = metadata !{metadata !"int", metadata !13, i64 0}
> +!13 = metadata !{metadata !"omnipotent char", metadata !14, i64 0}
> +!14 = metadata !{metadata !"Simple C/C++ TBAA"}
> +!15 = metadata !{i32 17, i32 8, metadata !16, null}
> +!16 = metadata !{i32 786443, metadata !1, metadata !17, i32 17, i32 8, i32 2, i32 3} ; [ DW_TAG_lexical_block ] [./vectorization-remarks.c]
> +!17 = metadata !{i32 786443, metadata !1, metadata !18, i32 17, i32 8, i32 1, i32 2} ; [ DW_TAG_lexical_block ] [./vectorization-remarks.c]
> +!18 = metadata !{i32 786443, metadata !1, metadata !4, i32 17, i32 3, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [./vectorization-remarks.c]
> +!19 = metadata !{i32 18, i32 5, metadata !20, null}
> +!20 = metadata !{i32 786443, metadata !1, metadata !18, i32 17, i32 27, i32 0, i32 1} ; [ DW_TAG_lexical_block ] [./vectorization-remarks.c]
> +!21 = metadata !{metadata !13, metadata !13, i64 0}
> +!22 = metadata !{i32 20, i32 3, metadata !4, null}
> +!23 = metadata !{i32 21, i32 3, metadata !4, null}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list