Skip to content

Commit

Permalink
[LoopVectorize] Change comment for isOutOfScope in collectLoopUniform…
Browse files Browse the repository at this point in the history
…s, NFC

Update comment for isOutOfScope and add a testcase for uniform value being used
out of scope.

Differential Revision: https://reviews.llvm.org/D23073


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277515 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
wmi-11 committed Aug 2, 2016
1 parent 22b561a commit ba9543c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
7 changes: 4 additions & 3 deletions lib/Transforms/Vectorize/LoopVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4946,10 +4946,11 @@ void LoopVectorizationLegality::collectLoopScalars() {

void LoopVectorizationLegality::collectLoopUniforms() {
// We now know that the loop is vectorizable!
// Collect variables that will remain uniform after vectorization.
// Collect instructions inside the loop that will remain uniform after
// vectorization.

// If V is not an instruction inside the current loop, it is a Value
// outside of the scope which we are interesting in.
// Global values, params and instructions outside of current loop are out of
// scope.
auto isOutOfScope = [&](Value *V) -> bool {
Instruction *I = dyn_cast<Instruction>(V);
return (!I || !TheLoop->contains(I));
Expand Down
27 changes: 27 additions & 0 deletions test/Transforms/LoopVectorize/X86/uniform-phi.ll
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,30 @@ for.body:
for.end:
ret void
}

; CHECK-LABEL: goo
; Check %indvars.iv and %indvars.iv.next are uniform instructions even if they are used outside of loop.
; CHECK-DAG: LV: Found uniform instruction: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
; CHECK-DAG: LV: Found uniform instruction: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
; CHECK-DAG: LV: Found uniform instruction: %exitcond = icmp eq i64 %indvars.iv, 1599

define i64 @goo(float* noalias nocapture %a, float* noalias nocapture readonly %b) #0 {
entry:
br label %for.body

for.body: ; preds = %for.body, %entry
%indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
%arrayidx = getelementptr inbounds float, float* %b, i64 %indvars.iv
%tmp0 = load float, float* %arrayidx, align 4
%add = fadd float %tmp0, 1.000000e+00
%arrayidx5 = getelementptr inbounds float, float* %a, i64 %indvars.iv
store float %add, float* %arrayidx5, align 4
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%exitcond = icmp eq i64 %indvars.iv, 1599
br i1 %exitcond, label %for.end, label %for.body

for.end: ; preds = %for.body
%retval = add i64 %indvars.iv, %indvars.iv.next
ret i64 %retval
}

0 comments on commit ba9543c

Please sign in to comment.