1*e4cfa899SFlorian Hahn; RUN: opt < %s -loop-vectorize -debug-only=loop-vectorize -S -disable-output 2>&1 | FileCheck %s
2*e4cfa899SFlorian Hahn; REQUIRES: asserts
3*e4cfa899SFlorian Hahn
4*e4cfa899SFlorian Hahn; Make sure LV legal bails out when the exiting block != loop latch.
5*e4cfa899SFlorian Hahn; CHECK-LABEL: "latch_is_not_exiting"
6*e4cfa899SFlorian Hahn; CHECK: LV: Not vectorizing: The exiting block is not the loop latch.
7*e4cfa899SFlorian Hahndefine i32 @latch_is_not_exiting() {
8*e4cfa899SFlorian Hahnentry:
9*e4cfa899SFlorian Hahn  br label %for.body
10*e4cfa899SFlorian Hahn
11*e4cfa899SFlorian Hahnfor.body:
12*e4cfa899SFlorian Hahn  %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ], [%inc, %for.second]
13*e4cfa899SFlorian Hahn  %inc = add nsw i32 %i.02, 1
14*e4cfa899SFlorian Hahn  %cmp = icmp slt i32 %inc, 16
15*e4cfa899SFlorian Hahn  br i1 %cmp, label %for.body, label %for.second
16*e4cfa899SFlorian Hahn
17*e4cfa899SFlorian Hahnfor.second:
18*e4cfa899SFlorian Hahn  %cmps = icmp sgt i32 %inc, 16
19*e4cfa899SFlorian Hahn  br i1 %cmps, label %for.body, label %for.end
20*e4cfa899SFlorian Hahn
21*e4cfa899SFlorian Hahnfor.end:
22*e4cfa899SFlorian Hahn  ret i32 0
23*e4cfa899SFlorian Hahn}
24*e4cfa899SFlorian Hahn
25*e4cfa899SFlorian Hahn; Make sure LV legal bails out when there is no exiting block
26*e4cfa899SFlorian Hahn; CHECK-LABEL: "no_exiting_block"
27*e4cfa899SFlorian Hahn; CHECK: LV: Not vectorizing: The loop must have an exiting block.
28*e4cfa899SFlorian Hahndefine i32 @no_exiting_block() {
29*e4cfa899SFlorian Hahnentry:
30*e4cfa899SFlorian Hahn  br label %for.body
31*e4cfa899SFlorian Hahn
32*e4cfa899SFlorian Hahnfor.body:
33*e4cfa899SFlorian Hahn  %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ], [%inc, %for.second]
34*e4cfa899SFlorian Hahn  %inc = add nsw i32 %i.02, 1
35*e4cfa899SFlorian Hahn  %cmp = icmp slt i32 %inc, 16
36*e4cfa899SFlorian Hahn  br i1 %cmp, label %for.body, label %for.second
37*e4cfa899SFlorian Hahn
38*e4cfa899SFlorian Hahnfor.second:
39*e4cfa899SFlorian Hahn  br label %for.body
40*e4cfa899SFlorian Hahn}
41*e4cfa899SFlorian Hahn
42*e4cfa899SFlorian Hahn; Make sure LV legal bails out when there is a non-int, non-ptr phi
43*e4cfa899SFlorian Hahn; CHECK-LABEL: "invalid_phi_types"
44*e4cfa899SFlorian Hahn; CHECK: LV: Not vectorizing: Found a non-int non-pointer PHI.
45*e4cfa899SFlorian Hahndefine i32 @invalid_phi_types() {
46*e4cfa899SFlorian Hahnentry:
47*e4cfa899SFlorian Hahn  br label %for.body
48*e4cfa899SFlorian Hahn
49*e4cfa899SFlorian Hahnfor.body:
50*e4cfa899SFlorian Hahn  %i.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
51*e4cfa899SFlorian Hahn  %vec.sum.02 = phi <2 x i32> [ zeroinitializer, %entry ], [ <i32 8, i32 8>, %for.body ]
52*e4cfa899SFlorian Hahn  %inc = add nsw i32 %i.02, 1
53*e4cfa899SFlorian Hahn  %cmp = icmp slt i32 %inc, 16
54*e4cfa899SFlorian Hahn  br i1 %cmp, label %for.body, label %for.end
55*e4cfa899SFlorian Hahn
56*e4cfa899SFlorian Hahnfor.end:
57*e4cfa899SFlorian Hahn  ret i32 0
58*e4cfa899SFlorian Hahn}
59*e4cfa899SFlorian Hahn
60*e4cfa899SFlorian Hahn; D40973
61*e4cfa899SFlorian Hahn; Make sure LV legal bails out when the loop doesn't have a legal pre-header.
62*e4cfa899SFlorian Hahn; CHECK-LABEL: "inc"
63*e4cfa899SFlorian Hahn; CHECK: LV: Not vectorizing: Loop doesn't have a legal pre-header.
64*e4cfa899SFlorian Hahndefine void @inc(i32 %n, i8* %P) {
65*e4cfa899SFlorian Hahn  %1 = icmp sgt i32 %n, 0
66*e4cfa899SFlorian Hahn  br i1 %1, label %BB1, label %BB2
67*e4cfa899SFlorian Hahn
68*e4cfa899SFlorian HahnBB1:
69*e4cfa899SFlorian Hahn  indirectbr i8* %P, [label %.lr.ph]
70*e4cfa899SFlorian Hahn
71*e4cfa899SFlorian HahnBB2:
72*e4cfa899SFlorian Hahn  br label %.lr.ph
73*e4cfa899SFlorian Hahn
74*e4cfa899SFlorian Hahn.lr.ph:
75*e4cfa899SFlorian Hahn  %indvars.iv = phi i32 [ %indvars.iv.next, %.lr.ph ], [ 0, %BB1 ], [ 0, %BB2 ]
76*e4cfa899SFlorian Hahn  %indvars.iv.next = add i32 %indvars.iv, 1
77*e4cfa899SFlorian Hahn  %exitcond = icmp eq i32 %indvars.iv.next, %n
78*e4cfa899SFlorian Hahn  br i1 %exitcond, label %._crit_edge, label %.lr.ph
79*e4cfa899SFlorian Hahn
80*e4cfa899SFlorian Hahn._crit_edge:
81*e4cfa899SFlorian Hahn  ret void
82*e4cfa899SFlorian Hahn}
83