147 lines · plain
1; RUN: opt < %s -passes='loop-vectorize' -enable-epilogue-vectorization -S | FileCheck %s2 3; TODO: For now test for the `-epilogue-vectorization-minimum-VF` option. In4; the future we need to replace this with a more meaningful test of the5; epilogue vectorization cost-model.6; RUN: opt < %s -passes='loop-vectorize' -enable-epilogue-vectorization -epilogue-vectorization-minimum-VF=4 -S | FileCheck %s --check-prefix=CHECK-MIN-47; RUN: opt < %s -passes='loop-vectorize' -enable-epilogue-vectorization -force-vector-interleave=1 -S | FileCheck %s --check-prefix=CHECK-MIN-IC-18 9target datalayout = "e-m:e-i64:64-n32:64"10target triple = "powerpc64le-unknown-linux-gnu"11 12; Do not vectorize epilogues for loops with minsize attribute13; CHECK-LABEL: @f114; CHECK-NOT: vector.main.loop.iter.check15; CHECK-NOT: vec.epilog.iter.check16; CHECK-NOT: vec.epilog.ph17; CHECK-NOT: vec.epilog.vector.body18; CHECK-NOT: vec.epilog.middle.block19; CHECK: ret void20 21define dso_local void @f1(ptr noalias %aa, ptr noalias %bb, ptr noalias %cc, i32 signext %N) #0 {22entry:23 %cmp1 = icmp sgt i32 %N, 024 br i1 %cmp1, label %for.body.preheader, label %for.end25 26for.body.preheader: ; preds = %entry27 %wide.trip.count = zext i32 %N to i6428 br label %for.body29 30for.body: ; preds = %for.body.preheader, %for.body31 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]32 %arrayidx = getelementptr inbounds float, ptr %bb, i64 %indvars.iv33 %0 = load float, ptr %arrayidx, align 434 %arrayidx2 = getelementptr inbounds float, ptr %cc, i64 %indvars.iv35 %1 = load float, ptr %arrayidx2, align 436 %add = fadd fast float %0, %137 %arrayidx4 = getelementptr inbounds float, ptr %aa, i64 %indvars.iv38 store float %add, ptr %arrayidx4, align 439 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 140 %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count41 br i1 %exitcond, label %for.body, label %for.end.loopexit42 43for.end.loopexit: ; preds = %for.body44 br label %for.end45 46for.end: ; preds = %for.end.loopexit, %entry47 ret void48}49 50; Do not vectorize epilogues for loops with optsize attribute51; CHECK-LABEL: @f252; CHECK-NOT: vector.main.loop.iter.check53; CHECK-NOT: vec.epilog.iter.check54; CHECK-NOT: vec.epilog.ph55; CHECK-NOT: vec.epilog.vector.body56; CHECK-NOT: vec.epilog.middle.block57; CHECK: ret void58 59define dso_local void @f2(ptr noalias %aa, ptr noalias %bb, ptr noalias %cc, i32 signext %N) #1 {60entry:61 %cmp1 = icmp sgt i32 %N, 062 br i1 %cmp1, label %for.body.preheader, label %for.end63 64for.body.preheader: ; preds = %entry65 %wide.trip.count = zext i32 %N to i6466 br label %for.body67 68for.body: ; preds = %for.body.preheader, %for.body69 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]70 %arrayidx = getelementptr inbounds float, ptr %bb, i64 %indvars.iv71 %0 = load float, ptr %arrayidx, align 472 %arrayidx2 = getelementptr inbounds float, ptr %cc, i64 %indvars.iv73 %1 = load float, ptr %arrayidx2, align 474 %add = fadd fast float %0, %175 %arrayidx4 = getelementptr inbounds float, ptr %aa, i64 %indvars.iv76 store float %add, ptr %arrayidx4, align 477 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 178 %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count79 br i1 %exitcond, label %for.body, label %for.end.loopexit80 81for.end.loopexit: ; preds = %for.body82 br label %for.end83 84for.end: ; preds = %for.end.loopexit, %entry85 ret void86}87 88; Do not vectorize the epilogue for loops with VF*IC less than the default -epilogue-vectorization-minimum-VF of 16.89; CHECK-MIN-IC-1-LABEL: @f390; CHECK-MIN-IC-1-NOT: vector.main.loop.iter.check91; CHECK-MIN-IC-1-NOT: vec.epilog.iter.check92; CHECK-MIN-IC-1-NOT: vec.epilog.ph93; CHECK-MIN-IC-1-NOT: vec.epilog.vector.body94; CHECK-MIN-IC-1-NOT: vec.epilog.middle.block95; CHECK-MIN-IC-1: ret void96 97; Specify a smaller minimum VF (via `-epilogue-vectorization-minimum-VF=4`) and98; make sure the epilogue gets vectorized in that case.99; CHECK-MIN-4-LABEL: @f3100; CHECK-MIN-4: vector.main.loop.iter.check101; CHECK-MIN-4: vec.epilog.iter.check102; CHECK-MIN-4: vec.epilog.ph103; CHECK-MIN-4: vec.epilog.vector.body104; CHECK-MIN-4: vec.epilog.middle.block105; CHECK-MIN-4: ret void106 107; Default behaviour is to vectorize the epilogue for this loop.108; CHECK-LABEL: @f3109; CHECK: vector.main.loop.iter.check110; CHECK: vec.epilog.iter.check111; CHECK: vec.epilog.ph112; CHECK: vec.epilog.vector.body113; CHECK: vec.epilog.middle.block114; CHECK: ret void115 116define dso_local void @f3(ptr noalias %aa, ptr noalias %bb, ptr noalias %cc, i32 signext %N) {117entry:118 %cmp1 = icmp sgt i32 %N, 0119 br i1 %cmp1, label %for.body.preheader, label %for.end120 121for.body.preheader: ; preds = %entry122 %wide.trip.count = zext i32 %N to i64123 br label %for.body124 125for.body: ; preds = %for.body.preheader, %for.body126 %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]127 %arrayidx = getelementptr inbounds float, ptr %bb, i64 %indvars.iv128 %0 = load float, ptr %arrayidx, align 4129 %arrayidx2 = getelementptr inbounds float, ptr %cc, i64 %indvars.iv130 %1 = load float, ptr %arrayidx2, align 4131 %add = fadd fast float %0, %1132 %arrayidx4 = getelementptr inbounds float, ptr %aa, i64 %indvars.iv133 store float %add, ptr %arrayidx4, align 4134 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1135 %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count136 br i1 %exitcond, label %for.body, label %for.end.loopexit137 138for.end.loopexit: ; preds = %for.body139 br label %for.end140 141for.end: ; preds = %for.end.loopexit, %entry142 ret void143}144 145attributes #0 = { minsize }146attributes #1 = { optsize }147