Mark vector loops as already vectorized

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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193349 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Renato Golin 2013-10-24 14:50:51 +00:00
parent 43752f2d4f
commit d6aa89eca5
3 changed files with 53 additions and 2 deletions

View File

@ -801,6 +801,7 @@ struct LoopVectorizeHints {
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 @@ InnerLoopVectorizer::createEmptyLoop(LoopVectorizationLegality *Legal) {
LoopExitBlock = ExitBlock;
LoopVectorBody = VecBody;
LoopScalarBody = OldBasicBlock;
LoopVectorizeHints Hints(Lp, true);
Hints.setAlreadyVectorized(Lp);
}
/// This function returns the identity element (or neutral element) for

View File

@ -0,0 +1,46 @@
; RUN: opt < %s -debug-only=loop-vectorize -O3 -S 2>&1 | FileCheck %s
; 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"
@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]]}

View File

@ -68,9 +68,10 @@ _ZSt10accumulateIPiiET0_T_S2_S1_.exit: ; preds = %for.body.i, %entry
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}