96 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=loop-vectorize -vectorize-num-stores-pred=2 -prefer-predicate-over-epilogue=predicate-dont-vectorize -S | FileCheck %s3 4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"5 6; Vectorization with dependence checks.7 8; Check that a non-power-of-2 MaxVF, calculated based on maximum safe distance,9; does not lead fold-tail to think that no tail will be generated for any chosen10; (power of 2) VF.11; Dependence distance here is 3 iterations.12; Tiny trip count of 15 divides 3, but any (even) VF will have a tail.13 14;unsigned char a [15+3];15;void maxvf3(){16; for (int j = 0; j < 15; ++j) {17; a[j] = 69;18; a[j+3] = 7;19; }20;}21 22@a = common local_unnamed_addr global [18 x i8] zeroinitializer, align 1623 24define void @maxvf3() {25; CHECK-LABEL: @maxvf3(26; CHECK-NEXT: entry:27; CHECK-NEXT: br label [[VECTOR_PH:%.*]]28; CHECK: vector.ph:29; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]30; CHECK: vector.body:31; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE6:%.*]] ]32; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_STORE_CONTINUE6]] ]33; CHECK-NEXT: [[TMP0:%.*]] = icmp ule <2 x i32> [[VEC_IND]], splat (i32 14)34; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 035; CHECK-NEXT: br i1 [[TMP1]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]36; CHECK: pred.store.if:37; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[INDEX]], 038; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [18 x i8], ptr @a, i32 0, i32 [[TMP2]]39; CHECK-NEXT: store i8 69, ptr [[TMP3]], align 840; CHECK-NEXT: br label [[PRED_STORE_CONTINUE]]41; CHECK: pred.store.continue:42; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 143; CHECK-NEXT: br i1 [[TMP4]], label [[PRED_STORE_IF1:%.*]], label [[PRED_STORE_CONTINUE2:%.*]]44; CHECK: pred.store.if1:45; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[INDEX]], 146; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [18 x i8], ptr @a, i32 0, i32 [[TMP5]]47; CHECK-NEXT: store i8 69, ptr [[TMP6]], align 848; CHECK-NEXT: br label [[PRED_STORE_CONTINUE2]]49; CHECK: pred.store.continue2:50; CHECK-NEXT: [[TMP7:%.*]] = add nuw nsw <2 x i32> splat (i32 3), [[VEC_IND]]51; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i1> [[TMP0]], i32 052; CHECK-NEXT: br i1 [[TMP8]], label [[PRED_STORE_IF3:%.*]], label [[PRED_STORE_CONTINUE4:%.*]]53; CHECK: pred.store.if3:54; CHECK-NEXT: [[TMP9:%.*]] = extractelement <2 x i32> [[TMP7]], i32 055; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds [18 x i8], ptr @a, i32 0, i32 [[TMP9]]56; CHECK-NEXT: store i8 7, ptr [[TMP10]], align 857; CHECK-NEXT: br label [[PRED_STORE_CONTINUE4]]58; CHECK: pred.store.continue4:59; CHECK-NEXT: [[TMP11:%.*]] = extractelement <2 x i1> [[TMP0]], i32 160; CHECK-NEXT: br i1 [[TMP11]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6]]61; CHECK: pred.store.if5:62; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x i32> [[TMP7]], i32 163; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds [18 x i8], ptr @a, i32 0, i32 [[TMP12]]64; CHECK-NEXT: store i8 7, ptr [[TMP13]], align 865; CHECK-NEXT: br label [[PRED_STORE_CONTINUE6]]66; CHECK: pred.store.continue6:67; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 268; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], splat (i32 2)69; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1670; CHECK-NEXT: br i1 [[TMP14]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]71; CHECK: middle.block:72; CHECK-NEXT: br label [[FOR_BODY:%.*]]73; CHECK: for.end:74; CHECK-NEXT: ret void75;76entry:77 br label %for.body78 79for.body:80 %j = phi i32 [ 0, %entry ], [ %j.next, %for.body ]81 %aj = getelementptr inbounds [18 x i8], ptr @a, i32 0, i32 %j82 store i8 69, ptr %aj, align 883 %jp3 = add nuw nsw i32 3, %j84 %ajp3 = getelementptr inbounds [18 x i8], ptr @a, i32 0, i32 %jp385 store i8 7, ptr %ajp3, align 886 %j.next = add nuw nsw i32 %j, 187 %exitcond = icmp eq i32 %j.next, 1588 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !089 90for.end:91 ret void92}93 94!0 = distinct !{!0, !1}95!1 = !{!"llvm.loop.vectorize.enable", i1 true}96