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