1*a7e2c269SBardia Mahjour; RUN: opt < %s  -passes='loop-vectorize' -force-vector-width=2 -enable-epilogue-vectorization -epilogue-vectorization-force-VF=2 --debug-only=loop-vectorize -S 2>&1 | FileCheck %s
2*a7e2c269SBardia Mahjour
3*a7e2c269SBardia Mahjourtarget datalayout = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512"
4*a7e2c269SBardia Mahjour
5*a7e2c269SBardia Mahjour; Currently we cannot handle reduction loops.
6*a7e2c269SBardia Mahjour; CHECK: LV: Checking a loop in "f1"
7*a7e2c269SBardia Mahjour; CHECK: LEV: Unable to vectorize epilogue because the loop is not a supported candidate.
8*a7e2c269SBardia Mahjour
9*a7e2c269SBardia Mahjourdefine signext i32 @f1(i8* noalias %A, i32 signext %n) {
10*a7e2c269SBardia Mahjourentry:
11*a7e2c269SBardia Mahjour  %cmp1 = icmp sgt i32 %n, 0
12*a7e2c269SBardia Mahjour  br i1 %cmp1, label %for.body.preheader, label %for.end
13*a7e2c269SBardia Mahjour
14*a7e2c269SBardia Mahjourfor.body.preheader:                               ; preds = %entry
15*a7e2c269SBardia Mahjour  %wide.trip.count = zext i32 %n to i64
16*a7e2c269SBardia Mahjour  br label %for.body
17*a7e2c269SBardia Mahjour
18*a7e2c269SBardia Mahjourfor.body:                                         ; preds = %for.body.preheader, %for.body
19*a7e2c269SBardia Mahjour  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
20*a7e2c269SBardia Mahjour  %sum.02 = phi i32 [ %add, %for.body ], [ 0, %for.body.preheader ]
21*a7e2c269SBardia Mahjour  %arrayidx = getelementptr inbounds i8, i8* %A, i64 %indvars.iv
22*a7e2c269SBardia Mahjour  %0 = load i8, i8* %arrayidx, align 1
23*a7e2c269SBardia Mahjour  %conv = zext i8 %0 to i32
24*a7e2c269SBardia Mahjour  %add = add nuw nsw i32 %sum.02, %conv
25*a7e2c269SBardia Mahjour  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
26*a7e2c269SBardia Mahjour  %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count
27*a7e2c269SBardia Mahjour  br i1 %exitcond, label %for.body, label %for.end.loopexit
28*a7e2c269SBardia Mahjour
29*a7e2c269SBardia Mahjourfor.end.loopexit:                                 ; preds = %for.body
30*a7e2c269SBardia Mahjour  %add.lcssa = phi i32 [ %add, %for.body ]
31*a7e2c269SBardia Mahjour  br label %for.end
32*a7e2c269SBardia Mahjour
33*a7e2c269SBardia Mahjourfor.end:                                          ; preds = %for.end.loopexit, %entry
34*a7e2c269SBardia Mahjour  %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add.lcssa, %for.end.loopexit ]
35*a7e2c269SBardia Mahjour  ret i32 %sum.0.lcssa
36*a7e2c269SBardia Mahjour}
37*a7e2c269SBardia Mahjour
38*a7e2c269SBardia Mahjour; Currently we cannot handle live-out variables that are recurrences.
39*a7e2c269SBardia Mahjour; CHECK: LV: Checking a loop in "f2"
40*a7e2c269SBardia Mahjour; CHECK: LEV: Unable to vectorize epilogue because the loop is not a supported candidate.
41*a7e2c269SBardia Mahjour
42*a7e2c269SBardia Mahjourdefine signext i32 @f2(i8* noalias %A, i32 signext %n) {
43*a7e2c269SBardia Mahjourentry:
44*a7e2c269SBardia Mahjour  %cmp1 = icmp sgt i32 %n, 0
45*a7e2c269SBardia Mahjour  br i1 %cmp1, label %for.body.preheader, label %for.end
46*a7e2c269SBardia Mahjour
47*a7e2c269SBardia Mahjourfor.body.preheader:                               ; preds = %entry
48*a7e2c269SBardia Mahjour  %wide.trip.count = zext i32 %n to i64
49*a7e2c269SBardia Mahjour  br label %for.body
50*a7e2c269SBardia Mahjour
51*a7e2c269SBardia Mahjourfor.body:                                         ; preds = %for.body.preheader, %for.body
52*a7e2c269SBardia Mahjour  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
53*a7e2c269SBardia Mahjour  %arrayidx = getelementptr inbounds i8, i8* %A, i64 %indvars.iv
54*a7e2c269SBardia Mahjour  %0 = load i8, i8* %arrayidx, align 1
55*a7e2c269SBardia Mahjour  %add = add i8 %0, 1
56*a7e2c269SBardia Mahjour  %arrayidx3 = getelementptr inbounds i8, i8* %A, i64 %indvars.iv
57*a7e2c269SBardia Mahjour  store i8 %add, i8* %arrayidx3, align 1
58*a7e2c269SBardia Mahjour  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
59*a7e2c269SBardia Mahjour  %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count
60*a7e2c269SBardia Mahjour  br i1 %exitcond, label %for.body, label %for.end.loopexit
61*a7e2c269SBardia Mahjour
62*a7e2c269SBardia Mahjourfor.end.loopexit:                                 ; preds = %for.body
63*a7e2c269SBardia Mahjour  %inc.lcssa.wide = phi i64 [ %indvars.iv.next, %for.body ]
64*a7e2c269SBardia Mahjour  %1 = trunc i64 %inc.lcssa.wide to i32
65*a7e2c269SBardia Mahjour  br label %for.end
66*a7e2c269SBardia Mahjour
67*a7e2c269SBardia Mahjourfor.end:                                          ; preds = %for.end.loopexit, %entry
68*a7e2c269SBardia Mahjour  %i.0.lcssa = phi i32 [ 0, %entry ], [ %1, %for.end.loopexit ]
69*a7e2c269SBardia Mahjour  ret i32 %i.0.lcssa
70*a7e2c269SBardia Mahjour}
71*a7e2c269SBardia Mahjour
72*a7e2c269SBardia Mahjour; Currently we cannot handle widended/truncated inductions.
73*a7e2c269SBardia Mahjour; CHECK: LV: Checking a loop in "f3"
74*a7e2c269SBardia Mahjour; CHECK: LEV: Unable to vectorize epilogue because the loop is not a supported candidate.
75*a7e2c269SBardia Mahjour
76*a7e2c269SBardia Mahjourdefine void @f3(i8* noalias %A, i32 signext %n) {
77*a7e2c269SBardia Mahjourentry:
78*a7e2c269SBardia Mahjour  %cmp1 = icmp sgt i32 %n, 0
79*a7e2c269SBardia Mahjour  br i1 %cmp1, label %for.body.preheader, label %for.end
80*a7e2c269SBardia Mahjour
81*a7e2c269SBardia Mahjourfor.body.preheader:                               ; preds = %entry
82*a7e2c269SBardia Mahjour  %wide.trip.count = zext i32 %n to i64
83*a7e2c269SBardia Mahjour  br label %for.body
84*a7e2c269SBardia Mahjour
85*a7e2c269SBardia Mahjourfor.body:                                         ; preds = %for.body.preheader, %for.body
86*a7e2c269SBardia Mahjour  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
87*a7e2c269SBardia Mahjour  %0 = trunc i64 %indvars.iv to i32
88*a7e2c269SBardia Mahjour  %conv = trunc i32 %0 to i8
89*a7e2c269SBardia Mahjour  %arrayidx = getelementptr inbounds i8, i8* %A, i64 %indvars.iv
90*a7e2c269SBardia Mahjour  store i8 %conv, i8* %arrayidx, align 1
91*a7e2c269SBardia Mahjour  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
92*a7e2c269SBardia Mahjour  %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count
93*a7e2c269SBardia Mahjour  br i1 %exitcond, label %for.body, label %for.end.loopexit
94*a7e2c269SBardia Mahjour
95*a7e2c269SBardia Mahjourfor.end.loopexit:                                 ; preds = %for.body
96*a7e2c269SBardia Mahjour  br label %for.end
97*a7e2c269SBardia Mahjour
98*a7e2c269SBardia Mahjourfor.end:                                          ; preds = %for.end.loopexit, %entry
99*a7e2c269SBardia Mahjour  ret void
100*a7e2c269SBardia Mahjour}
101