Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9843,6 +9843,8 @@ bool LoopVectorizePass::processLoop(Loop *L) {
// Get user vectorization factor and interleave count.
ElementCount UserVF = Hints.getWidth();
unsigned UserIC = Hints.getInterleave();
if (UserIC > 1 && !LVL.isSafeForAnyVectorWidth())
UserIC = 1;

// Plan how to best vectorize.
LVP.plan(UserVF, UserIC);
Expand Down Expand Up @@ -9907,7 +9909,15 @@ bool LoopVectorizePass::processLoop(Loop *L) {
VectorizeLoop = false;
}

if (!LVP.hasPlanWithVF(VF.Width) && UserIC > 1) {
if (UserIC == 1 && Hints.getInterleave() > 1) {
assert(!LVL.isSafeForAnyVectorWidth() &&
"UserIC should only be ignored due to unsafe dependencies");
LLVM_DEBUG(dbgs() << "LV: Ignoring user-specified interleave count.\n");
IntDiagMsg = {"InterleavingUnsafe",
"Ignoring user-specified interleave count due to possibly "
"unsafe dependencies in the loop."};
InterleaveLoop = false;
} else if (!LVP.hasPlanWithVF(VF.Width) && UserIC > 1) {
// Tell the user interleaving was avoided up-front, despite being explicitly
// requested.
LLVM_DEBUG(dbgs() << "LV: Ignoring UserIC, because vectorization and "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -417,21 +417,17 @@ for.end: ; preds = %for.body, %entry

; Note: This test was added to ensure we always check the legality of reductions (end emit a warning if necessary) before checking for memory dependencies
; CHECK-REMARK: Scalable vectorization not supported for the reduction operations found in this loop.
; CHECK-REMARK: vectorized loop (vectorization width: 4, interleaved count: 2)
; CHECK-REMARK: Ignoring user-specified interleave count due to possibly unsafe dependencies in the loop.
; CHECK-REMARK: vectorized loop (vectorization width: 4, interleaved count: 1)
define i32 @memory_dependence(ptr noalias nocapture %a, ptr noalias nocapture readonly %b, i64 %n) {
; CHECK-LABEL: @memory_dependence
; CHECK: vector.body:
; CHECK: %[[LOAD1:.*]] = load <4 x i32>
; CHECK: %[[LOAD2:.*]] = load <4 x i32>
; CHECK: %[[LOAD3:.*]] = load <4 x i32>
; CHECK: %[[LOAD4:.*]] = load <4 x i32>
; CHECK: %[[ADD1:.*]] = add nsw <4 x i32> %[[LOAD3]], %[[LOAD1]]
; CHECK: %[[ADD2:.*]] = add nsw <4 x i32> %[[LOAD4]], %[[LOAD2]]
; CHECK: %[[MUL1:.*]] = mul <4 x i32> %[[LOAD3]]
; CHECK: %[[MUL2:.*]] = mul <4 x i32> %[[LOAD4]]
; CHECK: %[[ADD1:.*]] = add nsw <4 x i32> %[[LOAD2]], %[[LOAD1]]
; CHECK: %[[MUL1:.*]] = mul <4 x i32> %[[LOAD2]]
; CHECK: middle.block:
; CHECK: %[[RDX:.*]] = mul <4 x i32> %[[MUL2]], %[[MUL1]]
; CHECK: call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %[[RDX]])
; CHECK: call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %[[MUL1]])
entry:
br label %for.body

Expand Down
30 changes: 30 additions & 0 deletions llvm/test/Transforms/LoopVectorize/unsafe-ic-hint-remark.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
; RUN: opt -passes=loop-vectorize -pass-remarks-analysis=loop-vectorize -S < %s 2>&1 | FileCheck %s

; Make sure the unsafe user specified interleave count is ignored.

; CHECK: remark: <unknown>:0:0: Ignoring user-specified interleave count due to possibly unsafe dependencies in the loop.
; CHECK-LABEL: @loop_distance_4
define void @loop_distance_4(ptr %a, ptr %b) {
entry:
br label %loop

loop:
%iv = phi i64 [ 4, %entry ], [ %iv.next, %loop ]
%0 = getelementptr i32, ptr %b, i64 %iv
%arrayidx = getelementptr i8, ptr %0, i64 -16
%1 = load i32, ptr %arrayidx, align 4
%arrayidx2 = getelementptr inbounds nuw i32, ptr %a, i64 %iv
%2 = load i32, ptr %arrayidx2, align 4
%add = add nsw i32 %2, %1
store i32 %add, ptr %0, align 4
%iv.next = add nuw nsw i64 %iv, 1
%exitcond.not = icmp eq i64 %iv.next, 64
br i1 %exitcond.not, label %for.end, label %loop, !llvm.loop !1

for.end:
ret void
}

!1 = !{!1, !2, !3}
!2 = !{!"llvm.loop.interleave.count", i32 4}
!3 = !{!"llvm.loop.vectorize.width", i32 4}