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