xref: /llvm-project/llvm/test/Transforms/LoopVectorize/ARM/mve-known-trip-count.ll (revision 46541a363695b9014cd95267fa78592be752d64d)
1; RUN: opt -passes=loop-vectorize -debug-only=loop-vectorize -disable-output < %s 2>&1 | FileCheck %s
2; REQUIRES: asserts
3
4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
5target triple = "thumbv8.1m.main-arm-none-eabi"
6
7; Trip count of 5 - shouldn't be vectorized.
8; CHECK-LABEL: tripcount5
9; CHECK: LV: Selecting VF: 1
10define void @tripcount5(ptr nocapture readonly %in, ptr nocapture %out, ptr nocapture readonly %consts, i32 %n) #0 {
11entry:
12  %arrayidx20 = getelementptr inbounds i32, ptr %out, i32 1
13  %arrayidx38 = getelementptr inbounds i32, ptr %out, i32 2
14  %arrayidx56 = getelementptr inbounds i32, ptr %out, i32 3
15  %arrayidx74 = getelementptr inbounds i32, ptr %out, i32 4
16  %arrayidx92 = getelementptr inbounds i32, ptr %out, i32 5
17  %arrayidx110 = getelementptr inbounds i32, ptr %out, i32 6
18  %arrayidx128 = getelementptr inbounds i32, ptr %out, i32 7
19  %out.promoted = load i32, ptr %out, align 4
20  %arrayidx20.promoted = load i32, ptr %arrayidx20, align 4
21  %arrayidx38.promoted = load i32, ptr %arrayidx38, align 4
22  %arrayidx56.promoted = load i32, ptr %arrayidx56, align 4
23  %arrayidx74.promoted = load i32, ptr %arrayidx74, align 4
24  %arrayidx92.promoted = load i32, ptr %arrayidx92, align 4
25  %arrayidx110.promoted = load i32, ptr %arrayidx110, align 4
26  %arrayidx128.promoted = load i32, ptr %arrayidx128, align 4
27  br label %for.body
28
29for.cond.cleanup:                                 ; preds = %for.body
30  store i32 %add12, ptr %out, align 4
31  store i32 %add30, ptr %arrayidx20, align 4
32  store i32 %add48, ptr %arrayidx38, align 4
33  store i32 %add66, ptr %arrayidx56, align 4
34  store i32 %add84, ptr %arrayidx74, align 4
35  store i32 %add102, ptr %arrayidx92, align 4
36  store i32 %add120, ptr %arrayidx110, align 4
37  store i32 %add138, ptr %arrayidx128, align 4
38  ret void
39
40for.body:                                         ; preds = %entry, %for.body
41  %hop.0236 = phi i32 [ 0, %entry ], [ %add139, %for.body ]
42  %add12220235 = phi i32 [ %out.promoted, %entry ], [ %add12, %for.body ]
43  %add30221234 = phi i32 [ %arrayidx20.promoted, %entry ], [ %add30, %for.body ]
44  %add48222233 = phi i32 [ %arrayidx38.promoted, %entry ], [ %add48, %for.body ]
45  %add66223232 = phi i32 [ %arrayidx56.promoted, %entry ], [ %add66, %for.body ]
46  %add84224231 = phi i32 [ %arrayidx74.promoted, %entry ], [ %add84, %for.body ]
47  %add102225230 = phi i32 [ %arrayidx92.promoted, %entry ], [ %add102, %for.body ]
48  %add120226229 = phi i32 [ %arrayidx110.promoted, %entry ], [ %add120, %for.body ]
49  %add138227228 = phi i32 [ %arrayidx128.promoted, %entry ], [ %add138, %for.body ]
50  %arrayidx = getelementptr inbounds i16, ptr %in, i32 %hop.0236
51  %0 = load i16, ptr %arrayidx, align 2
52  %conv = sext i16 %0 to i32
53  %arrayidx1 = getelementptr inbounds i16, ptr %consts, i32 %hop.0236
54  %1 = load i16, ptr %arrayidx1, align 2
55  %conv2 = sext i16 %1 to i32
56  %mul = mul nsw i32 %conv2, %conv
57  %add = add nsw i32 %mul, %add12220235
58  %add4 = or i32 %hop.0236, 1
59  %arrayidx5 = getelementptr inbounds i16, ptr %in, i32 %add4
60  %2 = load i16, ptr %arrayidx5, align 2
61  %conv6 = sext i16 %2 to i32
62  %arrayidx8 = getelementptr inbounds i16, ptr %consts, i32 %add4
63  %3 = load i16, ptr %arrayidx8, align 2
64  %conv9 = sext i16 %3 to i32
65  %mul10 = mul nsw i32 %conv9, %conv6
66  %add12 = add nsw i32 %mul10, %add
67  %add13 = or i32 %hop.0236, 2
68  %arrayidx14 = getelementptr inbounds i16, ptr %in, i32 %add13
69  %4 = load i16, ptr %arrayidx14, align 2
70  %conv15 = sext i16 %4 to i32
71  %arrayidx17 = getelementptr inbounds i16, ptr %consts, i32 %add13
72  %5 = load i16, ptr %arrayidx17, align 2
73  %conv18 = sext i16 %5 to i32
74  %mul19 = mul nsw i32 %conv18, %conv15
75  %add21 = add nsw i32 %mul19, %add30221234
76  %add22 = or i32 %hop.0236, 3
77  %arrayidx23 = getelementptr inbounds i16, ptr %in, i32 %add22
78  %6 = load i16, ptr %arrayidx23, align 2
79  %conv24 = sext i16 %6 to i32
80  %arrayidx26 = getelementptr inbounds i16, ptr %consts, i32 %add22
81  %7 = load i16, ptr %arrayidx26, align 2
82  %conv27 = sext i16 %7 to i32
83  %mul28 = mul nsw i32 %conv27, %conv24
84  %add30 = add nsw i32 %mul28, %add21
85  %add31 = or i32 %hop.0236, 4
86  %arrayidx32 = getelementptr inbounds i16, ptr %in, i32 %add31
87  %8 = load i16, ptr %arrayidx32, align 2
88  %conv33 = sext i16 %8 to i32
89  %arrayidx35 = getelementptr inbounds i16, ptr %consts, i32 %add31
90  %9 = load i16, ptr %arrayidx35, align 2
91  %conv36 = sext i16 %9 to i32
92  %mul37 = mul nsw i32 %conv36, %conv33
93  %add39 = add nsw i32 %mul37, %add48222233
94  %add40 = or i32 %hop.0236, 5
95  %arrayidx41 = getelementptr inbounds i16, ptr %in, i32 %add40
96  %10 = load i16, ptr %arrayidx41, align 2
97  %conv42 = sext i16 %10 to i32
98  %arrayidx44 = getelementptr inbounds i16, ptr %consts, i32 %add40
99  %11 = load i16, ptr %arrayidx44, align 2
100  %conv45 = sext i16 %11 to i32
101  %mul46 = mul nsw i32 %conv45, %conv42
102  %add48 = add nsw i32 %mul46, %add39
103  %add49 = or i32 %hop.0236, 6
104  %arrayidx50 = getelementptr inbounds i16, ptr %in, i32 %add49
105  %12 = load i16, ptr %arrayidx50, align 2
106  %conv51 = sext i16 %12 to i32
107  %arrayidx53 = getelementptr inbounds i16, ptr %consts, i32 %add49
108  %13 = load i16, ptr %arrayidx53, align 2
109  %conv54 = sext i16 %13 to i32
110  %mul55 = mul nsw i32 %conv54, %conv51
111  %add57 = add nsw i32 %mul55, %add66223232
112  %add58 = or i32 %hop.0236, 7
113  %arrayidx59 = getelementptr inbounds i16, ptr %in, i32 %add58
114  %14 = load i16, ptr %arrayidx59, align 2
115  %conv60 = sext i16 %14 to i32
116  %arrayidx62 = getelementptr inbounds i16, ptr %consts, i32 %add58
117  %15 = load i16, ptr %arrayidx62, align 2
118  %conv63 = sext i16 %15 to i32
119  %mul64 = mul nsw i32 %conv63, %conv60
120  %add66 = add nsw i32 %mul64, %add57
121  %add67 = or i32 %hop.0236, 8
122  %arrayidx68 = getelementptr inbounds i16, ptr %in, i32 %add67
123  %16 = load i16, ptr %arrayidx68, align 2
124  %conv69 = sext i16 %16 to i32
125  %arrayidx71 = getelementptr inbounds i16, ptr %consts, i32 %add67
126  %17 = load i16, ptr %arrayidx71, align 2
127  %conv72 = sext i16 %17 to i32
128  %mul73 = mul nsw i32 %conv72, %conv69
129  %add75 = add nsw i32 %mul73, %add84224231
130  %add76 = or i32 %hop.0236, 9
131  %arrayidx77 = getelementptr inbounds i16, ptr %in, i32 %add76
132  %18 = load i16, ptr %arrayidx77, align 2
133  %conv78 = sext i16 %18 to i32
134  %arrayidx80 = getelementptr inbounds i16, ptr %consts, i32 %add76
135  %19 = load i16, ptr %arrayidx80, align 2
136  %conv81 = sext i16 %19 to i32
137  %mul82 = mul nsw i32 %conv81, %conv78
138  %add84 = add nsw i32 %mul82, %add75
139  %add85 = or i32 %hop.0236, 10
140  %arrayidx86 = getelementptr inbounds i16, ptr %in, i32 %add85
141  %20 = load i16, ptr %arrayidx86, align 2
142  %conv87 = sext i16 %20 to i32
143  %arrayidx89 = getelementptr inbounds i16, ptr %consts, i32 %add85
144  %21 = load i16, ptr %arrayidx89, align 2
145  %conv90 = sext i16 %21 to i32
146  %mul91 = mul nsw i32 %conv90, %conv87
147  %add93 = add nsw i32 %mul91, %add102225230
148  %add94 = or i32 %hop.0236, 11
149  %arrayidx95 = getelementptr inbounds i16, ptr %in, i32 %add94
150  %22 = load i16, ptr %arrayidx95, align 2
151  %conv96 = sext i16 %22 to i32
152  %arrayidx98 = getelementptr inbounds i16, ptr %consts, i32 %add94
153  %23 = load i16, ptr %arrayidx98, align 2
154  %conv99 = sext i16 %23 to i32
155  %mul100 = mul nsw i32 %conv99, %conv96
156  %add102 = add nsw i32 %mul100, %add93
157  %add103 = or i32 %hop.0236, 12
158  %arrayidx104 = getelementptr inbounds i16, ptr %in, i32 %add103
159  %24 = load i16, ptr %arrayidx104, align 2
160  %conv105 = sext i16 %24 to i32
161  %arrayidx107 = getelementptr inbounds i16, ptr %consts, i32 %add103
162  %25 = load i16, ptr %arrayidx107, align 2
163  %conv108 = sext i16 %25 to i32
164  %mul109 = mul nsw i32 %conv108, %conv105
165  %add111 = add nsw i32 %mul109, %add120226229
166  %add112 = or i32 %hop.0236, 13
167  %arrayidx113 = getelementptr inbounds i16, ptr %in, i32 %add112
168  %26 = load i16, ptr %arrayidx113, align 2
169  %conv114 = sext i16 %26 to i32
170  %arrayidx116 = getelementptr inbounds i16, ptr %consts, i32 %add112
171  %27 = load i16, ptr %arrayidx116, align 2
172  %conv117 = sext i16 %27 to i32
173  %mul118 = mul nsw i32 %conv117, %conv114
174  %add120 = add nsw i32 %mul118, %add111
175  %add121 = or i32 %hop.0236, 14
176  %arrayidx122 = getelementptr inbounds i16, ptr %in, i32 %add121
177  %28 = load i16, ptr %arrayidx122, align 2
178  %conv123 = sext i16 %28 to i32
179  %arrayidx125 = getelementptr inbounds i16, ptr %consts, i32 %add121
180  %29 = load i16, ptr %arrayidx125, align 2
181  %conv126 = sext i16 %29 to i32
182  %mul127 = mul nsw i32 %conv126, %conv123
183  %add129 = add nsw i32 %mul127, %add138227228
184  %add130 = or i32 %hop.0236, 15
185  %arrayidx131 = getelementptr inbounds i16, ptr %in, i32 %add130
186  %30 = load i16, ptr %arrayidx131, align 2
187  %conv132 = sext i16 %30 to i32
188  %arrayidx134 = getelementptr inbounds i16, ptr %consts, i32 %add130
189  %31 = load i16, ptr %arrayidx134, align 2
190  %conv135 = sext i16 %31 to i32
191  %mul136 = mul nsw i32 %conv135, %conv132
192  %add138 = add nsw i32 %mul136, %add129
193  %add139 = add nuw nsw i32 %hop.0236, 16
194  %cmp = icmp ult i32 %hop.0236, 64
195  br i1 %cmp, label %for.body, label %for.cond.cleanup
196}
197
198; Trip count of 8 - does get vectorized
199; CHECK-LABEL: tripcount8
200; CHECK: LV: Selecting VF: 4
201define void @tripcount8(ptr nocapture readonly %in, ptr nocapture %out, ptr nocapture readonly %consts, i32 %n) #0 {
202entry:
203  %arrayidx20 = getelementptr inbounds i32, ptr %out, i32 1
204  %arrayidx38 = getelementptr inbounds i32, ptr %out, i32 2
205  %arrayidx56 = getelementptr inbounds i32, ptr %out, i32 3
206  %arrayidx74 = getelementptr inbounds i32, ptr %out, i32 4
207  %arrayidx92 = getelementptr inbounds i32, ptr %out, i32 5
208  %arrayidx110 = getelementptr inbounds i32, ptr %out, i32 6
209  %arrayidx128 = getelementptr inbounds i32, ptr %out, i32 7
210  %out.promoted = load i32, ptr %out, align 4
211  %arrayidx20.promoted = load i32, ptr %arrayidx20, align 4
212  %arrayidx38.promoted = load i32, ptr %arrayidx38, align 4
213  %arrayidx56.promoted = load i32, ptr %arrayidx56, align 4
214  %arrayidx74.promoted = load i32, ptr %arrayidx74, align 4
215  %arrayidx92.promoted = load i32, ptr %arrayidx92, align 4
216  %arrayidx110.promoted = load i32, ptr %arrayidx110, align 4
217  %arrayidx128.promoted = load i32, ptr %arrayidx128, align 4
218  br label %for.body
219
220for.cond.cleanup:                                 ; preds = %for.body
221  store i32 %add12, ptr %out, align 4
222  store i32 %add30, ptr %arrayidx20, align 4
223  store i32 %add48, ptr %arrayidx38, align 4
224  store i32 %add66, ptr %arrayidx56, align 4
225  store i32 %add84, ptr %arrayidx74, align 4
226  store i32 %add102, ptr %arrayidx92, align 4
227  store i32 %add120, ptr %arrayidx110, align 4
228  store i32 %add138, ptr %arrayidx128, align 4
229  ret void
230
231for.body:                                         ; preds = %entry, %for.body
232  %hop.0236 = phi i32 [ 0, %entry ], [ %add139, %for.body ]
233  %add12220235 = phi i32 [ %out.promoted, %entry ], [ %add12, %for.body ]
234  %add30221234 = phi i32 [ %arrayidx20.promoted, %entry ], [ %add30, %for.body ]
235  %add48222233 = phi i32 [ %arrayidx38.promoted, %entry ], [ %add48, %for.body ]
236  %add66223232 = phi i32 [ %arrayidx56.promoted, %entry ], [ %add66, %for.body ]
237  %add84224231 = phi i32 [ %arrayidx74.promoted, %entry ], [ %add84, %for.body ]
238  %add102225230 = phi i32 [ %arrayidx92.promoted, %entry ], [ %add102, %for.body ]
239  %add120226229 = phi i32 [ %arrayidx110.promoted, %entry ], [ %add120, %for.body ]
240  %add138227228 = phi i32 [ %arrayidx128.promoted, %entry ], [ %add138, %for.body ]
241  %arrayidx = getelementptr inbounds i16, ptr %in, i32 %hop.0236
242  %0 = load i16, ptr %arrayidx, align 2
243  %conv = sext i16 %0 to i32
244  %arrayidx1 = getelementptr inbounds i16, ptr %consts, i32 %hop.0236
245  %1 = load i16, ptr %arrayidx1, align 2
246  %conv2 = sext i16 %1 to i32
247  %mul = mul nsw i32 %conv2, %conv
248  %add = add nsw i32 %mul, %add12220235
249  %add4 = or i32 %hop.0236, 1
250  %arrayidx5 = getelementptr inbounds i16, ptr %in, i32 %add4
251  %2 = load i16, ptr %arrayidx5, align 2
252  %conv6 = sext i16 %2 to i32
253  %arrayidx8 = getelementptr inbounds i16, ptr %consts, i32 %add4
254  %3 = load i16, ptr %arrayidx8, align 2
255  %conv9 = sext i16 %3 to i32
256  %mul10 = mul nsw i32 %conv9, %conv6
257  %add12 = add nsw i32 %mul10, %add
258  %add13 = or i32 %hop.0236, 2
259  %arrayidx14 = getelementptr inbounds i16, ptr %in, i32 %add13
260  %4 = load i16, ptr %arrayidx14, align 2
261  %conv15 = sext i16 %4 to i32
262  %arrayidx17 = getelementptr inbounds i16, ptr %consts, i32 %add13
263  %5 = load i16, ptr %arrayidx17, align 2
264  %conv18 = sext i16 %5 to i32
265  %mul19 = mul nsw i32 %conv18, %conv15
266  %add21 = add nsw i32 %mul19, %add30221234
267  %add22 = or i32 %hop.0236, 3
268  %arrayidx23 = getelementptr inbounds i16, ptr %in, i32 %add22
269  %6 = load i16, ptr %arrayidx23, align 2
270  %conv24 = sext i16 %6 to i32
271  %arrayidx26 = getelementptr inbounds i16, ptr %consts, i32 %add22
272  %7 = load i16, ptr %arrayidx26, align 2
273  %conv27 = sext i16 %7 to i32
274  %mul28 = mul nsw i32 %conv27, %conv24
275  %add30 = add nsw i32 %mul28, %add21
276  %add31 = or i32 %hop.0236, 4
277  %arrayidx32 = getelementptr inbounds i16, ptr %in, i32 %add31
278  %8 = load i16, ptr %arrayidx32, align 2
279  %conv33 = sext i16 %8 to i32
280  %arrayidx35 = getelementptr inbounds i16, ptr %consts, i32 %add31
281  %9 = load i16, ptr %arrayidx35, align 2
282  %conv36 = sext i16 %9 to i32
283  %mul37 = mul nsw i32 %conv36, %conv33
284  %add39 = add nsw i32 %mul37, %add48222233
285  %add40 = or i32 %hop.0236, 5
286  %arrayidx41 = getelementptr inbounds i16, ptr %in, i32 %add40
287  %10 = load i16, ptr %arrayidx41, align 2
288  %conv42 = sext i16 %10 to i32
289  %arrayidx44 = getelementptr inbounds i16, ptr %consts, i32 %add40
290  %11 = load i16, ptr %arrayidx44, align 2
291  %conv45 = sext i16 %11 to i32
292  %mul46 = mul nsw i32 %conv45, %conv42
293  %add48 = add nsw i32 %mul46, %add39
294  %add49 = or i32 %hop.0236, 6
295  %arrayidx50 = getelementptr inbounds i16, ptr %in, i32 %add49
296  %12 = load i16, ptr %arrayidx50, align 2
297  %conv51 = sext i16 %12 to i32
298  %arrayidx53 = getelementptr inbounds i16, ptr %consts, i32 %add49
299  %13 = load i16, ptr %arrayidx53, align 2
300  %conv54 = sext i16 %13 to i32
301  %mul55 = mul nsw i32 %conv54, %conv51
302  %add57 = add nsw i32 %mul55, %add66223232
303  %add58 = or i32 %hop.0236, 7
304  %arrayidx59 = getelementptr inbounds i16, ptr %in, i32 %add58
305  %14 = load i16, ptr %arrayidx59, align 2
306  %conv60 = sext i16 %14 to i32
307  %arrayidx62 = getelementptr inbounds i16, ptr %consts, i32 %add58
308  %15 = load i16, ptr %arrayidx62, align 2
309  %conv63 = sext i16 %15 to i32
310  %mul64 = mul nsw i32 %conv63, %conv60
311  %add66 = add nsw i32 %mul64, %add57
312  %add67 = or i32 %hop.0236, 8
313  %arrayidx68 = getelementptr inbounds i16, ptr %in, i32 %add67
314  %16 = load i16, ptr %arrayidx68, align 2
315  %conv69 = sext i16 %16 to i32
316  %arrayidx71 = getelementptr inbounds i16, ptr %consts, i32 %add67
317  %17 = load i16, ptr %arrayidx71, align 2
318  %conv72 = sext i16 %17 to i32
319  %mul73 = mul nsw i32 %conv72, %conv69
320  %add75 = add nsw i32 %mul73, %add84224231
321  %add76 = or i32 %hop.0236, 9
322  %arrayidx77 = getelementptr inbounds i16, ptr %in, i32 %add76
323  %18 = load i16, ptr %arrayidx77, align 2
324  %conv78 = sext i16 %18 to i32
325  %arrayidx80 = getelementptr inbounds i16, ptr %consts, i32 %add76
326  %19 = load i16, ptr %arrayidx80, align 2
327  %conv81 = sext i16 %19 to i32
328  %mul82 = mul nsw i32 %conv81, %conv78
329  %add84 = add nsw i32 %mul82, %add75
330  %add85 = or i32 %hop.0236, 10
331  %arrayidx86 = getelementptr inbounds i16, ptr %in, i32 %add85
332  %20 = load i16, ptr %arrayidx86, align 2
333  %conv87 = sext i16 %20 to i32
334  %arrayidx89 = getelementptr inbounds i16, ptr %consts, i32 %add85
335  %21 = load i16, ptr %arrayidx89, align 2
336  %conv90 = sext i16 %21 to i32
337  %mul91 = mul nsw i32 %conv90, %conv87
338  %add93 = add nsw i32 %mul91, %add102225230
339  %add94 = or i32 %hop.0236, 11
340  %arrayidx95 = getelementptr inbounds i16, ptr %in, i32 %add94
341  %22 = load i16, ptr %arrayidx95, align 2
342  %conv96 = sext i16 %22 to i32
343  %arrayidx98 = getelementptr inbounds i16, ptr %consts, i32 %add94
344  %23 = load i16, ptr %arrayidx98, align 2
345  %conv99 = sext i16 %23 to i32
346  %mul100 = mul nsw i32 %conv99, %conv96
347  %add102 = add nsw i32 %mul100, %add93
348  %add103 = or i32 %hop.0236, 12
349  %arrayidx104 = getelementptr inbounds i16, ptr %in, i32 %add103
350  %24 = load i16, ptr %arrayidx104, align 2
351  %conv105 = sext i16 %24 to i32
352  %arrayidx107 = getelementptr inbounds i16, ptr %consts, i32 %add103
353  %25 = load i16, ptr %arrayidx107, align 2
354  %conv108 = sext i16 %25 to i32
355  %mul109 = mul nsw i32 %conv108, %conv105
356  %add111 = add nsw i32 %mul109, %add120226229
357  %add112 = or i32 %hop.0236, 13
358  %arrayidx113 = getelementptr inbounds i16, ptr %in, i32 %add112
359  %26 = load i16, ptr %arrayidx113, align 2
360  %conv114 = sext i16 %26 to i32
361  %arrayidx116 = getelementptr inbounds i16, ptr %consts, i32 %add112
362  %27 = load i16, ptr %arrayidx116, align 2
363  %conv117 = sext i16 %27 to i32
364  %mul118 = mul nsw i32 %conv117, %conv114
365  %add120 = add nsw i32 %mul118, %add111
366  %add121 = or i32 %hop.0236, 14
367  %arrayidx122 = getelementptr inbounds i16, ptr %in, i32 %add121
368  %28 = load i16, ptr %arrayidx122, align 2
369  %conv123 = sext i16 %28 to i32
370  %arrayidx125 = getelementptr inbounds i16, ptr %consts, i32 %add121
371  %29 = load i16, ptr %arrayidx125, align 2
372  %conv126 = sext i16 %29 to i32
373  %mul127 = mul nsw i32 %conv126, %conv123
374  %add129 = add nsw i32 %mul127, %add138227228
375  %add130 = or i32 %hop.0236, 15
376  %arrayidx131 = getelementptr inbounds i16, ptr %in, i32 %add130
377  %30 = load i16, ptr %arrayidx131, align 2
378  %conv132 = sext i16 %30 to i32
379  %arrayidx134 = getelementptr inbounds i16, ptr %consts, i32 %add130
380  %31 = load i16, ptr %arrayidx134, align 2
381  %conv135 = sext i16 %31 to i32
382  %mul136 = mul nsw i32 %conv135, %conv132
383  %add138 = add nsw i32 %mul136, %add129
384  %add139 = add nuw nsw i32 %hop.0236, 16
385  %cmp = icmp ult i32 %hop.0236, 112
386  br i1 %cmp, label %for.body, label %for.cond.cleanup
387}
388
389; Larger example with predication that should also not be vectorized
390; CHECK-LABEL: predicated_test
391; CHECK: LV: Selecting VF: 1
392; CHECK: LV: Selecting VF: 1
393define dso_local i32 @predicated_test(i32 noundef %0, ptr %glob) #0 {
394  %2 = alloca [101 x i32], align 4
395  %3 = alloca [21 x i32], align 4
396  call void @llvm.lifetime.start.p0(i64 404, ptr nonnull %2)
397  call void @llvm.lifetime.start.p0(i64 84, ptr nonnull %3)
398  %4 = icmp sgt i32 %0, 0
399  br i1 %4, label %5, label %159
400
4015:                                                ; preds = %1
402  %6 = getelementptr inbounds [21 x i32], ptr %3, i32 0, i32 5
403  br label %7
404
4057:                                                ; preds = %5, %155
406  %8 = phi i32 [ %10, %155 ], [ undef, %5 ]
407  %9 = phi i32 [ %156, %155 ], [ 0, %5 ]
408  %10 = shl i32 %8, 4
409  store i32 %10, ptr %6, align 4
410  br label %11
411
41211:                                               ; preds = %7, %152
413  %12 = phi i32 [ 0, %7 ], [ %153, %152 ]
414  %13 = lshr i32 %12, 3
415  %14 = getelementptr inbounds [21 x i32], ptr %3, i32 0, i32 %13
416  %15 = load i32, ptr %14, align 4
417  %16 = shl nuw nsw i32 %12, 2
418  %17 = and i32 %16, 28
419  %18 = ashr i32 %15, %17
420  %19 = and i32 %18, 15
421  %20 = mul nuw nsw i32 %19, 5
422  %21 = add nuw nsw i32 %20, 5
423  %22 = getelementptr inbounds i32, ptr %glob, i32 %21
424  %23 = mul nuw nsw i32 %12, 5
425  br label %24
426
42724:                                               ; preds = %11, %78
428  %25 = phi i32 [ 0, %11 ], [ %79, %78 ]
429  %26 = add nuw nsw i32 %25, %23
430  %27 = getelementptr inbounds [101 x i32], ptr %2, i32 0, i32 %26
431  store i32 0, ptr %27, align 4
432  %28 = getelementptr inbounds i32, ptr %22, i32 %25
433  %29 = load i32, ptr %28, align 4
434  %30 = and i32 %29, 1
435  %31 = icmp eq i32 %30, 0
436  %32 = and i32 %29, 2
437  %33 = icmp eq i32 %32, 0
438  %34 = and i32 %29, 4
439  %35 = icmp eq i32 %34, 0
440  %36 = and i32 %29, 8
441  %37 = icmp eq i32 %36, 0
442  %38 = and i32 %29, 16
443  %39 = icmp eq i32 %38, 0
444  %40 = and i32 %29, 32
445  %41 = icmp eq i32 %40, 0
446  %42 = and i32 %29, 64
447  %43 = icmp eq i32 %42, 0
448  %44 = and i32 %29, 128
449  %45 = icmp eq i32 %44, 0
450  %46 = and i32 %29, 254
451  %47 = icmp eq i32 %46, 0
452  br i1 %31, label %48, label %62
453
45448:                                               ; preds = %24
455  %49 = select i1 %33, i32 0, i32 129
456  %50 = or i32 %49, 258
457  %51 = select i1 %35, i32 %49, i32 %50
458  %52 = or i32 %51, 516
459  %53 = select i1 %37, i32 %51, i32 %52
460  %54 = or i32 %53, 1032
461  %55 = select i1 %39, i32 %53, i32 %54
462  %56 = or i32 %55, 2064
463  %57 = select i1 %41, i32 %55, i32 %56
464  %58 = or i32 %57, 4128
465  %59 = select i1 %43, i32 %57, i32 %58
466  %60 = or i32 %59, 8256
467  %61 = select i1 %45, i32 %59, i32 %60
468  br i1 %47, label %78, label %76
469
47062:                                               ; preds = %24
471  %63 = select i1 %33, i32 0, i32 516
472  %64 = or i32 %63, 1032
473  %65 = select i1 %35, i32 %63, i32 %64
474  %66 = or i32 %65, 2064
475  %67 = select i1 %37, i32 %65, i32 %66
476  %68 = or i32 %67, 4128
477  %69 = select i1 %39, i32 %67, i32 %68
478  %70 = or i32 %69, 8256
479  %71 = select i1 %41, i32 %69, i32 %70
480  %72 = or i32 %71, 16512
481  %73 = select i1 %43, i32 %71, i32 %72
482  %74 = or i32 %73, 33024
483  %75 = select i1 %45, i32 %73, i32 %74
484  br i1 %47, label %78, label %76
485
48676:                                               ; preds = %62, %48
487  %77 = phi i32 [ %61, %48 ], [ %75, %62 ]
488  store i32 %77, ptr %27, align 4
489  br label %78
490
49178:                                               ; preds = %76, %62, %48
492  %79 = add nuw nsw i32 %25, 1
493  %80 = icmp eq i32 %79, 5
494  br i1 %80, label %81, label %24
495
49681:                                               ; preds = %78
497  br label %82
498
49982:                                               ; preds = %81, %149
500  %83 = phi i32 [ %150, %149 ], [ 0, %81 ]
501  %84 = add nuw nsw i32 %83, %23
502  %85 = getelementptr inbounds [101 x i32], ptr %2, i32 0, i32 %84
503  %86 = load i32, ptr %85, align 4
504  %87 = shl i32 %86, 30
505  %88 = and i32 %87, 1073741824
506  %89 = and i32 %86, 2
507  %90 = icmp eq i32 %89, 0
508  %91 = select i1 %90, i32 %88, i32 1073741824
509  %92 = shl i32 %86, 27
510  %93 = and i32 %92, 536870912
511  %94 = or i32 %91, %93
512  %95 = shl i32 %86, 25
513  %96 = and i32 %95, 268435456
514  %97 = or i32 %94, %96
515  %98 = shl i32 %86, 23
516  %99 = and i32 %98, 134217728
517  %100 = or i32 %97, %99
518  %101 = or i32 %100, %86
519  %102 = and i32 %86, 31
520  %103 = and i32 %101, 32
521  %104 = shl nuw nsw i32 %103, 21
522  %105 = or i32 %102, %103
523  %106 = and i32 %101, 64
524  %107 = shl nuw nsw i32 %106, 19
525  %108 = or i32 %104, %107
526  %109 = or i32 %105, %106
527  %110 = and i32 %101, 128
528  %111 = shl nuw nsw i32 %110, 17
529  %112 = or i32 %108, %111
530  %113 = or i32 %109, %110
531  %114 = and i32 %101, 256
532  %115 = shl nuw nsw i32 %114, 15
533  %116 = or i32 %112, %115
534  %117 = or i32 %113, %114
535  %118 = and i32 %101, 512
536  %119 = shl nuw nsw i32 %118, 13
537  %120 = or i32 %116, %119
538  %121 = or i32 %120, %101
539  %122 = or i32 %117, %118
540  %123 = and i32 %121, 1024
541  %124 = shl nuw nsw i32 %123, 11
542  %125 = or i32 %122, %123
543  %126 = and i32 %121, 2048
544  %127 = shl nuw nsw i32 %126, 9
545  %128 = or i32 %124, %127
546  %129 = or i32 %125, %126
547  %130 = and i32 %121, 4096
548  %131 = shl nuw nsw i32 %130, 7
549  %132 = or i32 %128, %131
550  %133 = or i32 %129, %130
551  %134 = and i32 %121, 8192
552  %135 = shl nuw nsw i32 %134, 5
553  %136 = or i32 %132, %135
554  %137 = or i32 %136, %121
555  %138 = or i32 %133, %134
556  %139 = and i32 %137, 16384
557  %140 = or i32 %138, %139
558  %141 = and i32 %137, 32768
559  %142 = or i32 %140, %141
560  %143 = icmp eq i32 %142, 0
561  br i1 %143, label %149, label %144
562
563144:                                              ; preds = %82
564  %145 = shl nuw nsw i32 %139, 3
565  %146 = shl nuw nsw i32 %141, 1
566  %147 = or i32 %145, %146
567  %148 = or i32 %147, %137
568  store i32 %148, ptr %85, align 4
569  br label %149
570
571149:                                              ; preds = %82, %144
572  %150 = add nuw nsw i32 %83, 1
573  %151 = icmp eq i32 %150, 5
574  br i1 %151, label %152, label %82
575
576152:                                              ; preds = %149
577  %153 = add nuw nsw i32 %12, 1
578  %154 = icmp eq i32 %153, 20
579  br i1 %154, label %155, label %11
580
581155:                                              ; preds = %152
582  %156 = add nuw nsw i32 %9, 1
583  %157 = icmp eq i32 %156, %0
584  br i1 %157, label %158, label %7
585
586158:                                              ; preds = %155
587  br label %159
588
589159:                                              ; preds = %158, %1
590  call void @llvm.lifetime.end.p0(i64 84, ptr nonnull %3)
591  call void @llvm.lifetime.end.p0(i64 404, ptr nonnull %2)
592  ret i32 0
593}
594
595; This has a maximum trip count of 4. The codegen is currently much better with <8 x half> vectorization.
596; CHECK-LABEL: arm_q15_to_f16_remainder
597; CHECK: LV: Selecting VF: 8
598define void @arm_q15_to_f16_remainder(ptr nocapture noundef readonly %pSrc, ptr nocapture noundef writeonly noalias %pDst, i32 noundef %blockSize) #0 {
599entry:
600  %rem = and i32 %blockSize, 3
601  %cmp.not5 = icmp eq i32 %rem, 0
602  br i1 %cmp.not5, label %while.end, label %while.body.preheader
603
604while.body.preheader:                             ; preds = %entry
605  br label %while.body
606
607while.body:                                       ; preds = %while.body.preheader, %while.body
608  %blkCnt.08 = phi i32 [ %dec, %while.body ], [ %rem, %while.body.preheader ]
609  %pIn.07 = phi ptr [ %incdec.ptr, %while.body ], [ %pSrc, %while.body.preheader ]
610  %pDst.addr.06 = phi ptr [ %incdec.ptr2, %while.body ], [ %pDst, %while.body.preheader ]
611  %incdec.ptr = getelementptr inbounds i8, ptr %pIn.07, i32 2
612  %0 = load i16, ptr %pIn.07, align 2
613  %conv1 = sitofp i16 %0 to half
614  %1 = fmul fast half %conv1, 0xH0200
615  %incdec.ptr2 = getelementptr inbounds i8, ptr %pDst.addr.06, i32 2
616  store half %1, ptr %pDst.addr.06, align 2
617  %dec = add nsw i32 %blkCnt.08, -1
618  %cmp.not = icmp eq i32 %dec, 0
619  br i1 %cmp.not, label %while.end.loopexit, label %while.body
620
621while.end.loopexit:                               ; preds = %while.body
622  br label %while.end
623
624while.end:                                        ; preds = %while.end.loopexit, %entry
625  ret void
626}
627
628
629declare void @llvm.lifetime.start.p0(i64, ptr)
630declare void @llvm.lifetime.end.p0(i64, ptr)
631
632attributes #0 = { "target-features"="+mve.fp" }
633