brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · 5ccbd19 Raw
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