1; REQUIRES: asserts 2; 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 3 4target datalayout = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512" 5 6; Currently we cannot handle reduction loops. 7; CHECK: LV: Checking a loop in "f1" 8; CHECK: LEV: Unable to vectorize epilogue because the loop is not a supported candidate. 9 10define signext i32 @f1(i8* noalias %A, i32 signext %n) { 11entry: 12 %cmp1 = icmp sgt i32 %n, 0 13 br i1 %cmp1, label %for.body.preheader, label %for.end 14 15for.body.preheader: ; preds = %entry 16 %wide.trip.count = zext i32 %n to i64 17 br label %for.body 18 19for.body: ; preds = %for.body.preheader, %for.body 20 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 21 %sum.02 = phi i32 [ %add, %for.body ], [ 0, %for.body.preheader ] 22 %arrayidx = getelementptr inbounds i8, i8* %A, i64 %indvars.iv 23 %0 = load i8, i8* %arrayidx, align 1 24 %conv = zext i8 %0 to i32 25 %add = add nuw nsw i32 %sum.02, %conv 26 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 27 %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count 28 br i1 %exitcond, label %for.body, label %for.end.loopexit 29 30for.end.loopexit: ; preds = %for.body 31 %add.lcssa = phi i32 [ %add, %for.body ] 32 br label %for.end 33 34for.end: ; preds = %for.end.loopexit, %entry 35 %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add.lcssa, %for.end.loopexit ] 36 ret i32 %sum.0.lcssa 37} 38 39; Currently we cannot handle live-out variables that are recurrences. 40; CHECK: LV: Checking a loop in "f2" 41; CHECK: LEV: Unable to vectorize epilogue because the loop is not a supported candidate. 42 43define signext i32 @f2(i8* noalias %A, i32 signext %n) { 44entry: 45 %cmp1 = icmp sgt i32 %n, 0 46 br i1 %cmp1, label %for.body.preheader, label %for.end 47 48for.body.preheader: ; preds = %entry 49 %wide.trip.count = zext i32 %n to i64 50 br label %for.body 51 52for.body: ; preds = %for.body.preheader, %for.body 53 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 54 %arrayidx = getelementptr inbounds i8, i8* %A, i64 %indvars.iv 55 %0 = load i8, i8* %arrayidx, align 1 56 %add = add i8 %0, 1 57 %arrayidx3 = getelementptr inbounds i8, i8* %A, i64 %indvars.iv 58 store i8 %add, i8* %arrayidx3, align 1 59 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 60 %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count 61 br i1 %exitcond, label %for.body, label %for.end.loopexit 62 63for.end.loopexit: ; preds = %for.body 64 %inc.lcssa.wide = phi i64 [ %indvars.iv.next, %for.body ] 65 %1 = trunc i64 %inc.lcssa.wide to i32 66 br label %for.end 67 68for.end: ; preds = %for.end.loopexit, %entry 69 %i.0.lcssa = phi i32 [ 0, %entry ], [ %1, %for.end.loopexit ] 70 ret i32 %i.0.lcssa 71} 72 73; Currently we cannot handle widended/truncated inductions. 74; CHECK: LV: Checking a loop in "f3" 75; CHECK: LEV: Unable to vectorize epilogue because the loop is not a supported candidate. 76 77define void @f3(i8* noalias %A, i32 signext %n) { 78entry: 79 %cmp1 = icmp sgt i32 %n, 0 80 br i1 %cmp1, label %for.body.preheader, label %for.end 81 82for.body.preheader: ; preds = %entry 83 %wide.trip.count = zext i32 %n to i64 84 br label %for.body 85 86for.body: ; preds = %for.body.preheader, %for.body 87 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 88 %0 = trunc i64 %indvars.iv to i32 89 %conv = trunc i32 %0 to i8 90 %arrayidx = getelementptr inbounds i8, i8* %A, i64 %indvars.iv 91 store i8 %conv, i8* %arrayidx, align 1 92 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 93 %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count 94 br i1 %exitcond, label %for.body, label %for.end.loopexit 95 96for.end.loopexit: ; preds = %for.body 97 br label %for.end 98 99for.end: ; preds = %for.end.loopexit, %entry 100 ret void 101} 102 103; Currently we cannot handle scalable vectorization factors. 104; CHECK: LV: Checking a loop in "f4" 105; CHECK: LEV: Epilogue vectorization for scalable vectors not yet supported. 106 107define void @f4(i8* %A) { 108entry: 109 br label %for.body 110 111for.body: 112 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ] 113 %arrayidx = getelementptr inbounds i8, i8* %A, i64 %iv 114 store i8 1, i8* %arrayidx, align 1 115 %iv.next = add nuw nsw i64 %iv, 1 116 %exitcond = icmp ne i64 %iv.next, 1024 117 br i1 %exitcond, label %for.body, label %exit, !llvm.loop !0 118 119exit: 120 ret void 121} 122 123!0 = !{!0, !1, !2} 124!1 = !{!"llvm.loop.vectorize.width", i32 4} 125!2 = !{!"llvm.loop.vectorize.scalable.enable", i1 true} 126