[PATCH] Mark all loops as vectorized

Renato Golin renato.golin at linaro.org
Thu Oct 24 07:56:40 PDT 2013


Thanks, r193349 with the change.

cheers,
--renato


On 24 October 2013 15:21, Arnold Schwaighofer <aschwaighofer at apple.com>wrote:

> LGTM,
>
> One small concern (assert mode) see below.
>
>
> thanks for fixing this Renato!
>
>
> On Oct 24, 2013, at 6:05 AM, Renato Golin <renato.golin at linaro.org> wrote:
>
> > Hi nadav,
> >
> > Make sure we mark all loops (scalar and vector) when vectorizing, so
> that we don't try to vectorize them anymore. Also, set unroll to 1, since
> this is what we check for on early exit.
> >
> >
> > http://llvm-reviews.chandlerc.com/D2011
> >
> > Files:
> >  lib/Transforms/Vectorize/LoopVectorize.cpp
> >  test/Transforms/LoopVectorize/already-vectorized.ll
> >  test/Transforms/LoopVectorize/vectorize-once.ll
> >
> > Index: lib/Transforms/Vectorize/LoopVectorize.cpp
> > ===================================================================
> > --- lib/Transforms/Vectorize/LoopVectorize.cpp
> > +++ lib/Transforms/Vectorize/LoopVectorize.cpp
> > @@ -801,6 +801,7 @@
> >         Vals.push_back(LoopID->getOperand(i));
> >
> >     Vals.push_back(createHint(Context, Twine(Prefix(), "width").str(),
> Width));
> > +    Vals.push_back(createHint(Context, Twine(Prefix(), "unroll").str(),
> 1));
> >
> >     MDNode *NewLoopID = MDNode::get(Context, Vals);
> >     // Set operand 0 to refer to the loop id itself.
> > @@ -1785,6 +1786,9 @@
> >   LoopExitBlock = ExitBlock;
> >   LoopVectorBody = VecBody;
> >   LoopScalarBody = OldBasicBlock;
> > +
> > +  LoopVectorizeHints Hints(Lp, true);
> > +  Hints.setAlreadyVectorized(Lp);
> > }
> >
> > /// This function returns the identity element (or neutral element) for
> > Index: test/Transforms/LoopVectorize/already-vectorized.ll
> > ===================================================================
> > --- /dev/null
> > +++ test/Transforms/LoopVectorize/already-vectorized.ll
> > @@ -0,0 +1,45 @@
> > +; RUN: opt < %s -debug-only=loop-vectorize -O3 -S 2>&1 | FileCheck %s
>
> This will only work in “…+Asserts” mode. I think you want to add:
>
> ; REQUIRES: asserts
>
> > +; We want to make sure that we don't even try to vectorize loops again
> > +; The vectorizer used to mark the un-vectorized loop only as already
> vectorized
> > +; thus, trying to vectorize the vectorized loop again
> > +
> > +target datalayout =
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> > +target triple = "x86_64-unknown-linux-gnu"
> > +
> > + at a = external global [255 x i32]
> > +
> > +; Function Attrs: nounwind readonly uwtable
> > +define i32 @vect() {
> > +; CHECK: LV: Checking a loop in "vect"
> > +entry:
> > +  br label %for.body
> > +
> > +for.body:                                         ; preds = %for.body,
> %entry
> > +; We need to make sure we did vectorize the loop
> > +; CHECK: LV: Found a loop: for.body
> > +; CHECK: LV: We can vectorize this loop!
> > +  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
> > +  %red.05 = phi i32 [ 0, %entry ], [ %add, %for.body ]
> > +  %arrayidx = getelementptr inbounds [255 x i32]* @a, i64 0, i64
> %indvars.iv
> > +  %0 = load i32* %arrayidx, align 4
> > +  %add = add nsw i32 %0, %red.05
> > +  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
> > +  %exitcond = icmp eq i64 %indvars.iv.next, 255
> > +  br i1 %exitcond, label %for.end, label %for.body
> > +
> > +; If it did, we have two loops:
> > +; CHECK: vector.body:
> > +; CHECK: br {{.*}} label %vector.body, !llvm.loop [[vect:![0-9]+]]
> > +; CHECK: for.body:
> > +; CHECK: br {{.*}} label %for.body, !llvm.loop [[scalar:![0-9]+]]
> > +
> > +for.end:                                          ; preds = %for.body
> > +  ret i32 %add
> > +}
> > +
> > +; Now, we check for the Hint metadata
> > +; CHECK: [[vect]] = metadata !{metadata [[vect]], metadata
> [[width:![0-9]+]], metadata [[unroll:![0-9]+]]}
> > +; CHECK: [[width]] = metadata !{metadata !"llvm.vectorizer.width", i32
> 1}
> > +; CHECK: [[unroll]] = metadata !{metadata !"llvm.vectorizer.unroll",
> i32 1}
> > +; CHECK: [[scalar]] = metadata !{metadata [[scalar]], metadata
> [[width]], metadata [[unroll]]}
> > +
> > Index: test/Transforms/LoopVectorize/vectorize-once.ll
> > ===================================================================
> > --- test/Transforms/LoopVectorize/vectorize-once.ll
> > +++ test/Transforms/LoopVectorize/vectorize-once.ll
> > @@ -68,9 +68,10 @@
> >
> > attributes #0 = { nounwind readonly ssp uwtable
> "fp-contract-model"="standard" "no-frame-pointer-elim"
> "no-frame-pointer-elim-non-leaf" "realign-stack" "relocation-model"="pic"
> "ssp-buffers-size"="8" }
> >
> > -; CHECK: !0 = metadata !{metadata !0, metadata !1}
> > +; CHECK: !0 = metadata !{metadata !0, metadata !1, metadata !2}
> > ; CHECK: !1 = metadata !{metadata !"llvm.vectorizer.width", i32 1}
> > -; CHECK: !2 = metadata !{metadata !2, metadata !1}
> > +; CHECK: !2 = metadata !{metadata !"llvm.vectorizer.unroll", i32 1}
> > +; CHECK: !3 = metadata !{metadata !3, metadata !1, metadata !2}
> >
> > !0 = metadata !{metadata !0, metadata !1}
> > !1 = metadata !{metadata !"llvm.vectorizer.width", i32 1}
> > <D2011.1.patch>_______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131024/a8e078c7/attachment.html>


More information about the llvm-commits mailing list