blob: 45ee680d2b1a6eb859eb97afa866a0967c9900d3 [file]
; RUN: opt -passes=loop-vectorize -enable-vplan-native-path -pass-remarks=loop-vectorize -pass-remarks-analysis=loop-vectorize -disable-output %s 2>&1 | FileCheck --implicit-check-not='vectorized outer loop' %s
declare i1 @cond()
; Make sure we do not vectorize (or crash) on outer loops with uncomputable
; trip-counts.
define void @test() {
; CHECK: remark: <unknown>:0:0: loop not vectorized: loop induction variable could not be identified
;
entry:
br label %outer.header
outer.header:
%outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]
br label %inner
inner:
%iv = phi i64 [ 0, %outer.header ], [ %iv.next, %inner ]
%iv.next = add nuw nsw i64 %iv, 1
%inner.ec = icmp eq i64 %iv.next, 0
br i1 %inner.ec, label %outer.latch, label %inner
outer.latch:
%outer.iv.next = add nuw nsw i64 %outer.iv, 1
%c = call i1 @cond()
br i1 %c, label %exit, label %outer.header, !llvm.loop !0
exit:
ret void
}
; The outer loop has no induction phi, but a computable backedge-taken count
; (0). It must be rejected like an inner loop without an integer induction,
; as the widest induction type is used for the canonical IV and trip count.
define void @outer_loop_without_induction(ptr %p) {
; CHECK: remark: <unknown>:0:0: loop not vectorized: Unsupported outer loop
;
entry:
br label %outer.header
outer.header:
br label %inner
inner:
%iv = phi i64 [ 0, %outer.header ], [ %iv.next, %inner ]
%gep = getelementptr inbounds i32, ptr %p, i64 %iv
store i32 0, ptr %gep, align 4
%iv.next = add nuw nsw i64 %iv, 1
%ec = icmp eq i64 %iv.next, 8
br i1 %ec, label %outer.latch, label %inner
outer.latch:
%outer.ec = icmp eq i64 %iv.next, 8
br i1 %outer.ec, label %exit, label %outer.header, !llvm.loop !1
exit:
ret void
}
!0 = distinct !{!0, !2}
!1 = distinct !{!1, !2, !3}
!2 = !{!"llvm.loop.vectorize.enable"}
!3 = !{!"llvm.loop.vectorize.width", i32 4}