brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 30ee480 Raw
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