1cee313d2SEric Christopher; This test verifies that the loop vectorizer will NOT produce a tail 2cee313d2SEric Christopher; loop with the optimize for size or the minimize size attributes. 3*b55d4c2aSDavid Green; REQUIRES: asserts 4*b55d4c2aSDavid Green; RUN: opt < %s -enable-new-pm=0 -loop-vectorize -S | FileCheck %s 5*b55d4c2aSDavid Green; RUN: opt < %s -enable-new-pm=0 -loop-vectorize -pgso -S | FileCheck %s -check-prefix=PGSO 6*b55d4c2aSDavid Green; RUN: opt < %s -enable-new-pm=0 -loop-vectorize -pgso=false -S | FileCheck %s -check-prefix=NPGSO 7*b55d4c2aSDavid Green; RUN: opt < %s -passes='require<profile-summary>,loop-vectorize' -S | FileCheck %s 8*b55d4c2aSDavid Green; RUN: opt < %s -passes='require<profile-summary>,loop-vectorize' -pgso -S | FileCheck %s -check-prefix=PGSO 9*b55d4c2aSDavid Green; RUN: opt < %s -passes='require<profile-summary>,loop-vectorize' -pgso=false -S | FileCheck %s -check-prefix=NPGSO 10cee313d2SEric Christopher 11cee313d2SEric Christophertarget datalayout = "E-m:e-p:32:32-i64:32-f64:32:64-a:0:32-n32-S128" 12cee313d2SEric Christopher 13cee313d2SEric Christopher@tab = common global [32 x i8] zeroinitializer, align 1 14cee313d2SEric Christopher 15cee313d2SEric Christopherdefine i32 @foo_optsize() #0 { 16*b55d4c2aSDavid Green; CHECK-LABEL: @foo_optsize( 17*b55d4c2aSDavid Green; CHECK-NOT: <2 x i8> 18*b55d4c2aSDavid Green; CHECK-NOT: <4 x i8> 19*b55d4c2aSDavid Green 20cee313d2SEric Christopherentry: 21cee313d2SEric Christopher br label %for.body 22cee313d2SEric Christopher 23cee313d2SEric Christopherfor.body: ; preds = %for.body, %entry 24cee313d2SEric Christopher %i.08 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 25cee313d2SEric Christopher %arrayidx = getelementptr inbounds [32 x i8], [32 x i8]* @tab, i32 0, i32 %i.08 26cee313d2SEric Christopher %0 = load i8, i8* %arrayidx, align 1 27cee313d2SEric Christopher %cmp1 = icmp eq i8 %0, 0 28cee313d2SEric Christopher %. = select i1 %cmp1, i8 2, i8 1 29cee313d2SEric Christopher store i8 %., i8* %arrayidx, align 1 30cee313d2SEric Christopher %inc = add nsw i32 %i.08, 1 31cee313d2SEric Christopher %exitcond = icmp eq i32 %i.08, 202 32cee313d2SEric Christopher br i1 %exitcond, label %for.end, label %for.body 33cee313d2SEric Christopher 34cee313d2SEric Christopherfor.end: ; preds = %for.body 35cee313d2SEric Christopher ret i32 0 36cee313d2SEric Christopher} 37cee313d2SEric Christopher 38cee313d2SEric Christopherattributes #0 = { optsize } 39cee313d2SEric Christopher 40cee313d2SEric Christopherdefine i32 @foo_minsize() #1 { 41*b55d4c2aSDavid Green; CHECK-LABEL: @foo_minsize( 42*b55d4c2aSDavid Green; CHECK-NOT: <2 x i8> 43*b55d4c2aSDavid Green; CHECK-NOT: <4 x i8> 44*b55d4c2aSDavid Green; CHECK-LABEL: @foo_pgso( 45*b55d4c2aSDavid Green 46cee313d2SEric Christopherentry: 47cee313d2SEric Christopher br label %for.body 48cee313d2SEric Christopher 49cee313d2SEric Christopherfor.body: ; preds = %for.body, %entry 50cee313d2SEric Christopher %i.08 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 51cee313d2SEric Christopher %arrayidx = getelementptr inbounds [32 x i8], [32 x i8]* @tab, i32 0, i32 %i.08 52cee313d2SEric Christopher %0 = load i8, i8* %arrayidx, align 1 53cee313d2SEric Christopher %cmp1 = icmp eq i8 %0, 0 54cee313d2SEric Christopher %. = select i1 %cmp1, i8 2, i8 1 55cee313d2SEric Christopher store i8 %., i8* %arrayidx, align 1 56cee313d2SEric Christopher %inc = add nsw i32 %i.08, 1 57cee313d2SEric Christopher %exitcond = icmp eq i32 %i.08, 202 58cee313d2SEric Christopher br i1 %exitcond, label %for.end, label %for.body 59cee313d2SEric Christopher 60cee313d2SEric Christopherfor.end: ; preds = %for.body 61cee313d2SEric Christopher ret i32 0 62cee313d2SEric Christopher} 63cee313d2SEric Christopher 64cee313d2SEric Christopherattributes #1 = { minsize } 65cee313d2SEric Christopher 66cee313d2SEric Christopherdefine i32 @foo_pgso() !prof !14 { 67cee313d2SEric Christopher; PGSO-LABEL: @foo_pgso( 68*b55d4c2aSDavid Green; PGSO-NOT: <{{[0-9]+}} x i8> 69cee313d2SEric Christopher; NPGSO-LABEL: @foo_pgso( 70*b55d4c2aSDavid Green; NPGSO: <{{[0-9]+}} x i8> 71*b55d4c2aSDavid Green 72cee313d2SEric Christopherentry: 73cee313d2SEric Christopher br label %for.body 74cee313d2SEric Christopher 75cee313d2SEric Christopherfor.body: ; preds = %for.body, %entry 76cee313d2SEric Christopher %i.08 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 77cee313d2SEric Christopher %arrayidx = getelementptr inbounds [32 x i8], [32 x i8]* @tab, i32 0, i32 %i.08 78cee313d2SEric Christopher %0 = load i8, i8* %arrayidx, align 1 79cee313d2SEric Christopher %cmp1 = icmp eq i8 %0, 0 80cee313d2SEric Christopher %. = select i1 %cmp1, i8 2, i8 1 81cee313d2SEric Christopher store i8 %., i8* %arrayidx, align 1 82cee313d2SEric Christopher %inc = add nsw i32 %i.08, 1 83cee313d2SEric Christopher %exitcond = icmp eq i32 %i.08, 202 84cee313d2SEric Christopher br i1 %exitcond, label %for.end, label %for.body 85cee313d2SEric Christopher 86cee313d2SEric Christopherfor.end: ; preds = %for.body 87cee313d2SEric Christopher ret i32 0 88cee313d2SEric Christopher} 89cee313d2SEric Christopher 90d1170dbeSSjoerd Meijer; PR43371: don't run into an assert due to emitting SCEV runtime checks 91d1170dbeSSjoerd Meijer; with OptForSize. 92d1170dbeSSjoerd Meijer; 93d1170dbeSSjoerd Meijer@cm_array = external global [2592 x i16], align 1 94d1170dbeSSjoerd Meijer 95d1170dbeSSjoerd Meijerdefine void @pr43371() optsize { 96*b55d4c2aSDavid Green; 97*b55d4c2aSDavid Green; CHECK-LABEL: @pr43371 98*b55d4c2aSDavid Green; CHECK-NOT: vector.scevcheck 99*b55d4c2aSDavid Green; 100*b55d4c2aSDavid Green; We do not want to generate SCEV predicates when optimising for size, because 101*b55d4c2aSDavid Green; that will lead to extra code generation such as the SCEV overflow runtime 102*b55d4c2aSDavid Green; checks. Not generating SCEV predicates can still result in vectorisation as 103*b55d4c2aSDavid Green; the non-consecutive loads/stores can be scalarized: 104*b55d4c2aSDavid Green; 105*b55d4c2aSDavid Green; CHECK: vector.body: 106*b55d4c2aSDavid Green; CHECK: store i16 0, i16* %{{.*}}, align 1 107*b55d4c2aSDavid Green; CHECK: store i16 0, i16* %{{.*}}, align 1 108*b55d4c2aSDavid Green; CHECK: br i1 {{.*}}, label %vector.body 109d1170dbeSSjoerd Meijer; 110d1170dbeSSjoerd Meijerentry: 111d1170dbeSSjoerd Meijer br label %for.body29 112d1170dbeSSjoerd Meijer 113d1170dbeSSjoerd Meijerfor.cond.cleanup28: 114d1170dbeSSjoerd Meijer unreachable 115d1170dbeSSjoerd Meijer 116d1170dbeSSjoerd Meijerfor.body29: 117d1170dbeSSjoerd Meijer %i24.0170 = phi i16 [ 0, %entry], [ %inc37, %for.body29] 118d1170dbeSSjoerd Meijer %add33 = add i16 undef, %i24.0170 119d1170dbeSSjoerd Meijer %idxprom34 = zext i16 %add33 to i32 120d1170dbeSSjoerd Meijer %arrayidx35 = getelementptr [2592 x i16], [2592 x i16] * @cm_array, i32 0, i32 %idxprom34 121d1170dbeSSjoerd Meijer store i16 0, i16 * %arrayidx35, align 1 122d1170dbeSSjoerd Meijer %inc37 = add i16 %i24.0170, 1 123d1170dbeSSjoerd Meijer %cmp26 = icmp ult i16 %inc37, 756 124d1170dbeSSjoerd Meijer br i1 %cmp26, label %for.body29, label %for.cond.cleanup28 125d1170dbeSSjoerd Meijer} 126d1170dbeSSjoerd Meijer 1277bedae7dSHiroshi Yamauchidefine void @pr43371_pgso() !prof !14 { 1287bedae7dSHiroshi Yamauchi; 129*b55d4c2aSDavid Green; CHECK-LABEL: @pr43371_pgso 130*b55d4c2aSDavid Green; CHECK-NOT: vector.scevcheck 131*b55d4c2aSDavid Green; 132*b55d4c2aSDavid Green; We do not want to generate SCEV predicates when optimising for size, because 133*b55d4c2aSDavid Green; that will lead to extra code generation such as the SCEV overflow runtime 134*b55d4c2aSDavid Green; checks. Not generating SCEV predicates can still result in vectorisation as 135*b55d4c2aSDavid Green; the non-consecutive loads/stores can be scalarized: 136*b55d4c2aSDavid Green; 137*b55d4c2aSDavid Green; CHECK: vector.body: 138*b55d4c2aSDavid Green; CHECK: store i16 0, i16* %{{.*}}, align 1 139*b55d4c2aSDavid Green; CHECK: store i16 0, i16* %{{.*}}, align 1 140*b55d4c2aSDavid Green; CHECK: br i1 {{.*}}, label %vector.body 1417bedae7dSHiroshi Yamauchi; 1427bedae7dSHiroshi Yamauchientry: 1437bedae7dSHiroshi Yamauchi br label %for.body29 1447bedae7dSHiroshi Yamauchi 1457bedae7dSHiroshi Yamauchifor.cond.cleanup28: 1467bedae7dSHiroshi Yamauchi unreachable 1477bedae7dSHiroshi Yamauchi 1487bedae7dSHiroshi Yamauchifor.body29: 1497bedae7dSHiroshi Yamauchi %i24.0170 = phi i16 [ 0, %entry], [ %inc37, %for.body29] 1507bedae7dSHiroshi Yamauchi %add33 = add i16 undef, %i24.0170 1517bedae7dSHiroshi Yamauchi %idxprom34 = zext i16 %add33 to i32 1527bedae7dSHiroshi Yamauchi %arrayidx35 = getelementptr [2592 x i16], [2592 x i16] * @cm_array, i32 0, i32 %idxprom34 1537bedae7dSHiroshi Yamauchi store i16 0, i16 * %arrayidx35, align 1 1547bedae7dSHiroshi Yamauchi %inc37 = add i16 %i24.0170, 1 1557bedae7dSHiroshi Yamauchi %cmp26 = icmp ult i16 %inc37, 756 1567bedae7dSHiroshi Yamauchi br i1 %cmp26, label %for.body29, label %for.cond.cleanup28 1577bedae7dSHiroshi Yamauchi} 1587bedae7dSHiroshi Yamauchi 1598e0c5f72SAyal Zaks; PR45526: don't vectorize with fold-tail if first-order-recurrence is live-out. 1608e0c5f72SAyal Zaks; 1618e0c5f72SAyal Zaksdefine i32 @pr45526() optsize { 162*b55d4c2aSDavid Green; 163*b55d4c2aSDavid Green; CHECK-LABEL: @pr45526 164*b55d4c2aSDavid Green; CHECK-NEXT: entry: 165*b55d4c2aSDavid Green; CHECK-NEXT: br label %loop 166*b55d4c2aSDavid Green; CHECK-EMPTY: 167*b55d4c2aSDavid Green; CHECK-NEXT: loop: 168*b55d4c2aSDavid Green; CHECK-NEXT: %piv = phi i32 [ 0, %entry ], [ %pivPlus1, %loop ] 169*b55d4c2aSDavid Green; CHECK-NEXT: %for = phi i32 [ 5, %entry ], [ %pivPlus1, %loop ] 170*b55d4c2aSDavid Green; CHECK-NEXT: %pivPlus1 = add nuw nsw i32 %piv, 1 171*b55d4c2aSDavid Green; CHECK-NEXT: %cond = icmp ult i32 %piv, 510 172*b55d4c2aSDavid Green; CHECK-NEXT: br i1 %cond, label %loop, label %exit 173*b55d4c2aSDavid Green; CHECK-EMPTY: 174*b55d4c2aSDavid Green; CHECK-NEXT: exit: 175*b55d4c2aSDavid Green; CHECK-NEXT: %for.lcssa = phi i32 [ %for, %loop ] 176*b55d4c2aSDavid Green; CHECK-NEXT: ret i32 %for.lcssa 1778e0c5f72SAyal Zaks; 1788e0c5f72SAyal Zaksentry: 1798e0c5f72SAyal Zaks br label %loop 1808e0c5f72SAyal Zaks 1818e0c5f72SAyal Zaksloop: 1828e0c5f72SAyal Zaks %piv = phi i32 [ 0, %entry ], [ %pivPlus1, %loop ] 1838e0c5f72SAyal Zaks %for = phi i32 [ 5, %entry ], [ %pivPlus1, %loop ] 1848e0c5f72SAyal Zaks %pivPlus1 = add nuw nsw i32 %piv, 1 1858e0c5f72SAyal Zaks %cond = icmp ult i32 %piv, 510 1868e0c5f72SAyal Zaks br i1 %cond, label %loop, label %exit 1878e0c5f72SAyal Zaks 1888e0c5f72SAyal Zaksexit: 1898e0c5f72SAyal Zaks ret i32 %for 1908e0c5f72SAyal Zaks} 1918e0c5f72SAyal Zaks 1927bedae7dSHiroshi Yamauchidefine i32 @pr45526_pgso() !prof !14 { 1937bedae7dSHiroshi Yamauchi; 194*b55d4c2aSDavid Green; CHECK-LABEL: @pr45526_pgso 195*b55d4c2aSDavid Green; CHECK-NEXT: entry: 196*b55d4c2aSDavid Green; CHECK-NEXT: br label %loop 197*b55d4c2aSDavid Green; CHECK-EMPTY: 198*b55d4c2aSDavid Green; CHECK-NEXT: loop: 199*b55d4c2aSDavid Green; CHECK-NEXT: %piv = phi i32 [ 0, %entry ], [ %pivPlus1, %loop ] 200*b55d4c2aSDavid Green; CHECK-NEXT: %for = phi i32 [ 5, %entry ], [ %pivPlus1, %loop ] 201*b55d4c2aSDavid Green; CHECK-NEXT: %pivPlus1 = add nuw nsw i32 %piv, 1 202*b55d4c2aSDavid Green; CHECK-NEXT: %cond = icmp ult i32 %piv, 510 203*b55d4c2aSDavid Green; CHECK-NEXT: br i1 %cond, label %loop, label %exit 204*b55d4c2aSDavid Green; CHECK-EMPTY: 205*b55d4c2aSDavid Green; CHECK-NEXT: exit: 206*b55d4c2aSDavid Green; CHECK-NEXT: %for.lcssa = phi i32 [ %for, %loop ] 207*b55d4c2aSDavid Green; CHECK-NEXT: ret i32 %for.lcssa 2087bedae7dSHiroshi Yamauchi; 2097bedae7dSHiroshi Yamauchientry: 2107bedae7dSHiroshi Yamauchi br label %loop 2117bedae7dSHiroshi Yamauchi 2127bedae7dSHiroshi Yamauchiloop: 2137bedae7dSHiroshi Yamauchi %piv = phi i32 [ 0, %entry ], [ %pivPlus1, %loop ] 2147bedae7dSHiroshi Yamauchi %for = phi i32 [ 5, %entry ], [ %pivPlus1, %loop ] 2157bedae7dSHiroshi Yamauchi %pivPlus1 = add nuw nsw i32 %piv, 1 2167bedae7dSHiroshi Yamauchi %cond = icmp ult i32 %piv, 510 2177bedae7dSHiroshi Yamauchi br i1 %cond, label %loop, label %exit 2187bedae7dSHiroshi Yamauchi 2197bedae7dSHiroshi Yamauchiexit: 2207bedae7dSHiroshi Yamauchi ret i32 %for 2217bedae7dSHiroshi Yamauchi} 2227bedae7dSHiroshi Yamauchi 2237bf299c8SAyal Zaks; PR46228: Vectorize w/o versioning for unit stride under optsize and enabled 2247bf299c8SAyal Zaks; vectorization. 2257bf299c8SAyal Zaks 2267bf299c8SAyal Zaks; NOTE: Some assertions have been autogenerated by utils/update_test_checks.py 2277bf299c8SAyal Zaksdefine void @stride1(i16* noalias %B, i32 %BStride) optsize { 228*b55d4c2aSDavid Green; CHECK-LABEL: @stride1( 229*b55d4c2aSDavid Green; CHECK-NEXT: entry: 230*b55d4c2aSDavid Green; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 231*b55d4c2aSDavid Green; CHECK: vector.ph: 232*b55d4c2aSDavid Green; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[BSTRIDE:%.*]], i32 0 233*b55d4c2aSDavid Green; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i32> [[BROADCAST_SPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer 234*b55d4c2aSDavid Green; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 235*b55d4c2aSDavid Green; CHECK: vector.body: 236*b55d4c2aSDavid Green; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE2:%.*]] ] 237*b55d4c2aSDavid Green; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[PRED_STORE_CONTINUE2]] ] 238*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP1:%.*]] = icmp ule <2 x i32> [[VEC_IND]], <i32 1024, i32 1024> 239*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP0:%.*]] = mul nsw <2 x i32> [[VEC_IND]], [[BROADCAST_SPLAT]] 240*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x i1> [[TMP1]], i32 0 241*b55d4c2aSDavid Green; CHECK-NEXT: br i1 [[TMP2]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]] 242*b55d4c2aSDavid Green; CHECK: pred.store.if: 243*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x i32> [[TMP0]], i32 0 244*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i16, i16* [[B:%.*]], i32 [[TMP3]] 245*b55d4c2aSDavid Green; CHECK-NEXT: store i16 42, i16* [[TMP4]], align 4 246*b55d4c2aSDavid Green; CHECK-NEXT: br label [[PRED_STORE_CONTINUE]] 247*b55d4c2aSDavid Green; CHECK: pred.store.continue: 248*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP1]], i32 1 249*b55d4c2aSDavid Green; CHECK-NEXT: br i1 [[TMP5]], label [[PRED_STORE_IF1:%.*]], label [[PRED_STORE_CONTINUE2]] 250*b55d4c2aSDavid Green; CHECK: pred.store.if1: 251*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i32> [[TMP0]], i32 1 252*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i16, i16* [[B]], i32 [[TMP6]] 253*b55d4c2aSDavid Green; CHECK-NEXT: store i16 42, i16* [[TMP7]], align 4 254*b55d4c2aSDavid Green; CHECK-NEXT: br label [[PRED_STORE_CONTINUE2]] 255*b55d4c2aSDavid Green; CHECK: pred.store.continue2: 256*b55d4c2aSDavid Green; CHECK-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 2 257*b55d4c2aSDavid Green; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], <i32 2, i32 2> 258*b55d4c2aSDavid Green; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i32 [[INDEX_NEXT]], 1026 259*b55d4c2aSDavid Green; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop !21 260*b55d4c2aSDavid Green; CHECK: middle.block: 261*b55d4c2aSDavid Green; CHECK-NEXT: br i1 true, label [[FOR_END:%.*]], label [[SCALAR_PH]] 262*b55d4c2aSDavid Green; CHECK: scalar.ph: 263*b55d4c2aSDavid Green; CHECK: for.end: 264*b55d4c2aSDavid Green; CHECK-NEXT: ret void 265*b55d4c2aSDavid Green; 2667bf299c8SAyal Zaks; PGSO-LABEL: @stride1( 2677bf299c8SAyal Zaks; PGSO-NEXT: entry: 268*b55d4c2aSDavid Green; PGSO-NEXT: br i1 false, label %scalar.ph, label %vector.ph 2697bf299c8SAyal Zaks; 2707bf299c8SAyal Zaks; NPGSO-LABEL: @stride1( 2717bf299c8SAyal Zaks; NPGSO-NEXT: entry: 272*b55d4c2aSDavid Green; NPGSO-NEXT: br i1 false, label %scalar.ph, label %vector.ph 273*b55d4c2aSDavid Green 2747bf299c8SAyal Zaksentry: 2757bf299c8SAyal Zaks br label %for.body 2767bf299c8SAyal Zaks 2777bf299c8SAyal Zaksfor.body: 2787bf299c8SAyal Zaks %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 2797bf299c8SAyal Zaks %mulB = mul nsw i32 %iv, %BStride 2807bf299c8SAyal Zaks %gepOfB = getelementptr inbounds i16, i16* %B, i32 %mulB 2817bf299c8SAyal Zaks store i16 42, i16* %gepOfB, align 4 2827bf299c8SAyal Zaks %iv.next = add nuw nsw i32 %iv, 1 2837bf299c8SAyal Zaks %exitcond = icmp eq i32 %iv.next, 1025 2847bf299c8SAyal Zaks br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !15 2857bf299c8SAyal Zaks 2867bf299c8SAyal Zaksfor.end: 2877bf299c8SAyal Zaks ret void 2887bf299c8SAyal Zaks} 2897bf299c8SAyal Zaks 290ab401a8cSHiroshi Yamauchi; Vectorize with versioning for unit stride for PGSO and enabled vectorization. 291ab401a8cSHiroshi Yamauchi; 292ab401a8cSHiroshi Yamauchidefine void @stride1_pgso(i16* noalias %B, i32 %BStride) !prof !14 { 293*b55d4c2aSDavid Green; CHECK-LABEL: @stride1_pgso( 294*b55d4c2aSDavid Green; CHECK: vector.body 295*b55d4c2aSDavid Green; 296ab401a8cSHiroshi Yamauchi; PGSO-LABEL: @stride1_pgso( 297*b55d4c2aSDavid Green; PGSO: vector.body 298ab401a8cSHiroshi Yamauchi; 299ab401a8cSHiroshi Yamauchi; NPGSO-LABEL: @stride1_pgso( 300*b55d4c2aSDavid Green; NPGSO: vector.body 301*b55d4c2aSDavid Green 302ab401a8cSHiroshi Yamauchientry: 303ab401a8cSHiroshi Yamauchi br label %for.body 304ab401a8cSHiroshi Yamauchi 305ab401a8cSHiroshi Yamauchifor.body: 306ab401a8cSHiroshi Yamauchi %iv = phi i32 [ %iv.next, %for.body ], [ 0, %entry ] 307ab401a8cSHiroshi Yamauchi %mulB = mul nsw i32 %iv, %BStride 308ab401a8cSHiroshi Yamauchi %gepOfB = getelementptr inbounds i16, i16* %B, i32 %mulB 309ab401a8cSHiroshi Yamauchi store i16 42, i16* %gepOfB, align 4 310ab401a8cSHiroshi Yamauchi %iv.next = add nuw nsw i32 %iv, 1 311ab401a8cSHiroshi Yamauchi %exitcond = icmp eq i32 %iv.next, 1025 312ab401a8cSHiroshi Yamauchi br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !15 313ab401a8cSHiroshi Yamauchi 314ab401a8cSHiroshi Yamauchifor.end: 315ab401a8cSHiroshi Yamauchi ret void 316ab401a8cSHiroshi Yamauchi} 317ab401a8cSHiroshi Yamauchi 31882a5157fSAyal Zaks; PR46652: Check that the need for stride==1 check prevents vectorizing a loop 31982a5157fSAyal Zaks; having tiny trip count, when compiling w/o -Os/-Oz. 320*b55d4c2aSDavid Green; CHECK-LABEL: @pr46652 321*b55d4c2aSDavid Green; CHECK-NOT: vector.scevcheck 322*b55d4c2aSDavid Green; CHECK-NOT: vector.body 323*b55d4c2aSDavid Green; CHECK-LABEL: for.body 32482a5157fSAyal Zaks 32582a5157fSAyal Zaks@g = external global [1 x i16], align 1 32682a5157fSAyal Zaks 32782a5157fSAyal Zaksdefine void @pr46652(i16 %stride) { 32882a5157fSAyal Zaksentry: 32982a5157fSAyal Zaks br label %for.body 33082a5157fSAyal Zaks 33182a5157fSAyal Zaksfor.body: ; preds = %for.body, %entry 33282a5157fSAyal Zaks %l1.02 = phi i16 [ 1, %entry ], [ %inc9, %for.body ] 33382a5157fSAyal Zaks %mul = mul nsw i16 %l1.02, %stride 33482a5157fSAyal Zaks %arrayidx6 = getelementptr inbounds [1 x i16], [1 x i16]* @g, i16 0, i16 %mul 33582a5157fSAyal Zaks %0 = load i16, i16* %arrayidx6, align 1 33682a5157fSAyal Zaks %inc9 = add nuw nsw i16 %l1.02, 1 33782a5157fSAyal Zaks %exitcond.not = icmp eq i16 %inc9, 16 33882a5157fSAyal Zaks br i1 %exitcond.not, label %for.end, label %for.body 33982a5157fSAyal Zaks 34082a5157fSAyal Zaksfor.end: ; preds = %for.body 34182a5157fSAyal Zaks ret void 34282a5157fSAyal Zaks} 34382a5157fSAyal Zaks 344a70b511eSFlorian Hahn; Make sure we do not crash while building the VPlan for the loop with the 345a70b511eSFlorian Hahn; select below. 346a70b511eSFlorian Hahndefine i32 @PR48142(i32* %ptr.start, i32* %ptr.end) optsize { 347*b55d4c2aSDavid Green; CHECK-LABEL: PR48142 348*b55d4c2aSDavid Green; CHECK-NOT: vector.body 349a70b511eSFlorian Hahnentry: 350a70b511eSFlorian Hahn br label %for.body 351a70b511eSFlorian Hahn 352a70b511eSFlorian Hahnfor.body: 353a70b511eSFlorian Hahn %i.014 = phi i32 [ 20, %entry ], [ %cond, %for.body ] 354a70b511eSFlorian Hahn %ptr.iv = phi i32* [ %ptr.start, %entry ], [ %ptr.next, %for.body ] 355a70b511eSFlorian Hahn %cmp4 = icmp slt i32 %i.014, 99 356a70b511eSFlorian Hahn %cond = select i1 %cmp4, i32 99, i32 %i.014 357a70b511eSFlorian Hahn store i32 0, i32* %ptr.iv 358a70b511eSFlorian Hahn %ptr.next = getelementptr inbounds i32, i32* %ptr.iv, i64 1 359a70b511eSFlorian Hahn %cmp.not = icmp eq i32* %ptr.next, %ptr.end 360a70b511eSFlorian Hahn br i1 %cmp.not, label %exit, label %for.body 361a70b511eSFlorian Hahn 362a70b511eSFlorian Hahnexit: 363a70b511eSFlorian Hahn %res = phi i32 [ %cond, %for.body ] 364a70b511eSFlorian Hahn ret i32 %res 365a70b511eSFlorian Hahn} 366a70b511eSFlorian Hahn 367cee313d2SEric Christopher!llvm.module.flags = !{!0} 368cee313d2SEric Christopher!0 = !{i32 1, !"ProfileSummary", !1} 369cee313d2SEric Christopher!1 = !{!2, !3, !4, !5, !6, !7, !8, !9} 370cee313d2SEric Christopher!2 = !{!"ProfileFormat", !"InstrProf"} 371cee313d2SEric Christopher!3 = !{!"TotalCount", i64 10000} 372cee313d2SEric Christopher!4 = !{!"MaxCount", i64 10} 373cee313d2SEric Christopher!5 = !{!"MaxInternalCount", i64 1} 374cee313d2SEric Christopher!6 = !{!"MaxFunctionCount", i64 1000} 375cee313d2SEric Christopher!7 = !{!"NumCounts", i64 3} 376cee313d2SEric Christopher!8 = !{!"NumFunctions", i64 3} 377cee313d2SEric Christopher!9 = !{!"DetailedSummary", !10} 378cee313d2SEric Christopher!10 = !{!11, !12, !13} 379cee313d2SEric Christopher!11 = !{i32 10000, i64 100, i32 1} 380cee313d2SEric Christopher!12 = !{i32 999000, i64 100, i32 1} 381cee313d2SEric Christopher!13 = !{i32 999999, i64 1, i32 2} 382cee313d2SEric Christopher!14 = !{!"function_entry_count", i64 0} 3837bf299c8SAyal Zaks!15 = distinct !{!15, !16} 3847bf299c8SAyal Zaks!16 = !{!"llvm.loop.vectorize.enable", i1 true} 385