1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -verify-machineinstrs -mattr=+mve %s -o - | FileCheck %s
4 @var_36 = hidden local_unnamed_addr global i8 0, align 1
5 @arr_61 = hidden local_unnamed_addr global [1 x i32] zeroinitializer, align 4
7 define i32 @test(i8 zeroext %var_2, i16 signext %var_15, [18 x [22 x i8]]* %arr_60) {
9 ; CHECK: @ %bb.0: @ %entry
10 ; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
11 ; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
12 ; CHECK-NEXT: cmp r0, #0
13 ; CHECK-NEXT: beq.w .LBB0_10
14 ; CHECK-NEXT: @ %bb.1: @ %for.cond1.preheader
15 ; CHECK-NEXT: cmp r2, #0
16 ; CHECK-NEXT: beq.w .LBB0_11
17 ; CHECK-NEXT: @ %bb.2: @ %for.cond1.preheader1
18 ; CHECK-NEXT: movw r8, :lower16:var_36
19 ; CHECK-NEXT: movw r0, #27476
20 ; CHECK-NEXT: addw r10, r2, #397
21 ; CHECK-NEXT: mov.w r9, #11
22 ; CHECK-NEXT: movt r8, :upper16:var_36
23 ; CHECK-NEXT: sdiv r1, r0, r1
24 ; CHECK-NEXT: mov.w r11, #0
25 ; CHECK-NEXT: .LBB0_3: @ %for.cond6.preheader
26 ; CHECK-NEXT: @ =>This Loop Header: Depth=1
27 ; CHECK-NEXT: @ Child Loop BB0_4 Depth 2
28 ; CHECK-NEXT: @ Child Loop BB0_6 Depth 2
29 ; CHECK-NEXT: @ Child Loop BB0_8 Depth 2
30 ; CHECK-NEXT: movs r0, #22
31 ; CHECK-NEXT: dls lr, r9
32 ; CHECK-NEXT: mla r7, r11, r0, r10
33 ; CHECK-NEXT: movw r0, :lower16:arr_61
34 ; CHECK-NEXT: movt r0, :upper16:arr_61
35 ; CHECK-NEXT: adds r0, #4
36 ; CHECK-NEXT: mov r3, r2
37 ; CHECK-NEXT: mov r6, r0
38 ; CHECK-NEXT: .LBB0_4: @ %for.body10
39 ; CHECK-NEXT: @ Parent Loop BB0_3 Depth=1
40 ; CHECK-NEXT: @ => This Inner Loop Header: Depth=2
41 ; CHECK-NEXT: str r3, [r6, #-4]
42 ; CHECK-NEXT: add.w r12, r3, #396
43 ; CHECK-NEXT: ldrb r5, [r7, #-1]
44 ; CHECK-NEXT: add.w r3, r3, #792
45 ; CHECK-NEXT: cmp r5, #0
47 ; CHECK-NEXT: sxthne r5, r1
48 ; CHECK-NEXT: moveq r5, #0
49 ; CHECK-NEXT: cmp r5, #0
50 ; CHECK-NEXT: str.w r12, [r6]
51 ; CHECK-NEXT: cset r5, ne
52 ; CHECK-NEXT: adds r6, #8
53 ; CHECK-NEXT: strb.w r5, [r8]
54 ; CHECK-NEXT: ldrb r5, [r7]
55 ; CHECK-NEXT: adds r7, #2
56 ; CHECK-NEXT: cmp r5, #0
58 ; CHECK-NEXT: sxthne r5, r1
59 ; CHECK-NEXT: moveq r5, #0
60 ; CHECK-NEXT: cmp r5, #0
61 ; CHECK-NEXT: cset r5, ne
62 ; CHECK-NEXT: strb.w r5, [r8]
63 ; CHECK-NEXT: le lr, .LBB0_4
64 ; CHECK-NEXT: @ %bb.5: @ %for.cond.cleanup9
65 ; CHECK-NEXT: @ in Loop: Header=BB0_3 Depth=1
66 ; CHECK-NEXT: add.w r3, r11, #1
67 ; CHECK-NEXT: movs r7, #22
68 ; CHECK-NEXT: dls lr, r9
69 ; CHECK-NEXT: mov r6, r0
70 ; CHECK-NEXT: uxtb r3, r3
71 ; CHECK-NEXT: smlabb r7, r3, r7, r10
72 ; CHECK-NEXT: mov r3, r2
73 ; CHECK-NEXT: .LBB0_6: @ %for.body10.1
74 ; CHECK-NEXT: @ Parent Loop BB0_3 Depth=1
75 ; CHECK-NEXT: @ => This Inner Loop Header: Depth=2
76 ; CHECK-NEXT: str r3, [r6, #-4]
77 ; CHECK-NEXT: add.w r4, r3, #396
78 ; CHECK-NEXT: ldrb r5, [r7, #-1]
79 ; CHECK-NEXT: add.w r3, r3, #792
80 ; CHECK-NEXT: cmp r5, #0
82 ; CHECK-NEXT: sxthne r5, r1
83 ; CHECK-NEXT: moveq r5, #0
84 ; CHECK-NEXT: cmp r5, #0
85 ; CHECK-NEXT: str r4, [r6]
86 ; CHECK-NEXT: cset r5, ne
87 ; CHECK-NEXT: adds r6, #8
88 ; CHECK-NEXT: strb.w r5, [r8]
89 ; CHECK-NEXT: ldrb r5, [r7]
90 ; CHECK-NEXT: adds r7, #2
91 ; CHECK-NEXT: cmp r5, #0
93 ; CHECK-NEXT: sxthne r5, r1
94 ; CHECK-NEXT: moveq r5, #0
95 ; CHECK-NEXT: cmp r5, #0
96 ; CHECK-NEXT: cset r5, ne
97 ; CHECK-NEXT: strb.w r5, [r8]
98 ; CHECK-NEXT: le lr, .LBB0_6
99 ; CHECK-NEXT: @ %bb.7: @ %for.cond.cleanup9.1
100 ; CHECK-NEXT: @ in Loop: Header=BB0_3 Depth=1
101 ; CHECK-NEXT: add.w r3, r11, #2
102 ; CHECK-NEXT: movs r7, #22
103 ; CHECK-NEXT: dls lr, r9
104 ; CHECK-NEXT: uxtb r3, r3
105 ; CHECK-NEXT: smlabb r7, r3, r7, r10
106 ; CHECK-NEXT: mov r3, r2
107 ; CHECK-NEXT: .LBB0_8: @ %for.body10.2
108 ; CHECK-NEXT: @ Parent Loop BB0_3 Depth=1
109 ; CHECK-NEXT: @ => This Inner Loop Header: Depth=2
110 ; CHECK-NEXT: str r3, [r0, #-4]
111 ; CHECK-NEXT: ldrb r6, [r7, #-1]
112 ; CHECK-NEXT: cmp r6, #0
114 ; CHECK-NEXT: sxthne r5, r1
115 ; CHECK-NEXT: moveq r5, #0
116 ; CHECK-NEXT: add.w r6, r3, #396
117 ; CHECK-NEXT: cmp r5, #0
118 ; CHECK-NEXT: str r6, [r0]
119 ; CHECK-NEXT: cset r6, ne
120 ; CHECK-NEXT: strb.w r6, [r8]
121 ; CHECK-NEXT: add.w r3, r3, #792
122 ; CHECK-NEXT: ldrb r6, [r7]
123 ; CHECK-NEXT: adds r0, #8
124 ; CHECK-NEXT: adds r7, #2
125 ; CHECK-NEXT: cmp r6, #0
127 ; CHECK-NEXT: sxthne r5, r1
128 ; CHECK-NEXT: moveq r5, #0
129 ; CHECK-NEXT: cmp r5, #0
130 ; CHECK-NEXT: cset r6, ne
131 ; CHECK-NEXT: strb.w r6, [r8]
132 ; CHECK-NEXT: le lr, .LBB0_8
133 ; CHECK-NEXT: @ %bb.9: @ %for.cond.cleanup9.2
134 ; CHECK-NEXT: @ in Loop: Header=BB0_3 Depth=1
135 ; CHECK-NEXT: add.w r0, r11, #3
136 ; CHECK-NEXT: uxtb.w r11, r0
137 ; CHECK-NEXT: cmp.w r11, #18
139 ; CHECK-NEXT: movhs.w r11, #0
140 ; CHECK-NEXT: b .LBB0_3
141 ; CHECK-NEXT: .LBB0_10: @ %for.cond.cleanup
142 ; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
143 ; CHECK-NEXT: .LBB0_11: @ %for.cond1.us.preheader
144 ; CHECK-NEXT: movw r0, :lower16:arr_61
145 ; CHECK-NEXT: movs r1, #0
146 ; CHECK-NEXT: movt r0, :upper16:arr_61
147 ; CHECK-NEXT: str r1, [r0, #84]
148 ; CHECK-NEXT: .inst.n 0xdefe
150 %tobool.not = icmp eq i8 %var_2, 0
151 br i1 %tobool.not, label %for.cond.cleanup, label %for.cond1.preheader
153 for.cond1.preheader: ; preds = %entry
154 %cmp11.not = icmp eq [18 x [22 x i8]]* %arr_60, null
155 br i1 %cmp11.not, label %for.cond1.us.preheader, label %for.cond1
157 for.cond1.us.preheader: ; preds = %for.cond1.preheader
158 store i32 0, i32* getelementptr ([1 x i32], [1 x i32]* @arr_61, i32 21, i32 0), align 4
159 call void @llvm.trap()
162 for.cond.cleanup: ; preds = %entry
165 for.cond1: ; preds = %for.cond.cleanup9.2, %for.cond1.preheader
166 br label %for.cond6.preheader
168 for.cond6.preheader: ; preds = %for.cond.cleanup9.2, %for.cond1
169 %conv45 = phi i32 [ 0, %for.cond1 ], [ %conv.2, %for.cond.cleanup9.2 ]
172 for.cond.cleanup9: ; preds = %cond.end22.1
173 %add27 = add nuw nsw i32 %conv45, 1
174 %conv = and i32 %add27, 255
175 br label %for.body10.1
177 for.body10: ; preds = %cond.end22.1, %for.cond6.preheader
178 %i_15.044 = phi i32 [ 0, %for.cond6.preheader ], [ %add.1, %cond.end22.1 ]
179 %arraydecay = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 %i_15.044, i32 0
180 %0 = ptrtoint [22 x i8]* %arraydecay to i32
181 %arrayidx13 = getelementptr inbounds [1 x i32], [1 x i32]* @arr_61, i32 0, i32 %i_15.044
182 store i32 %0, i32* %arrayidx13, align 4
183 %arrayidx16 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 1, i32 %conv45, i32 %i_15.044
184 %1 = load i8, i8* %arrayidx16, align 1
185 %tobool18.not = icmp eq i8 %1, 0
186 br i1 %tobool18.not, label %cond.end22, label %cond.true19
188 cond.true19: ; preds = %for.body10
189 %div43 = sdiv i16 27476, %var_15
190 %div.sext = sext i16 %div43 to i32
193 cond.end22: ; preds = %for.body10, %cond.true19
194 %cond23 = phi i32 [ %div.sext, %cond.true19 ], [ 0, %for.body10 ]
195 %tobool24 = icmp ne i32 %cond23, 0
196 %frombool = zext i1 %tobool24 to i8
197 store i8 %frombool, i8* @var_36, align 1
198 %add = or i32 %i_15.044, 1
199 %arraydecay.1 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 %add, i32 0
200 %2 = ptrtoint [22 x i8]* %arraydecay.1 to i32
201 %arrayidx13.1 = getelementptr inbounds [1 x i32], [1 x i32]* @arr_61, i32 0, i32 %add
202 store i32 %2, i32* %arrayidx13.1, align 4
203 %arrayidx16.1 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 1, i32 %conv45, i32 %add
204 %3 = load i8, i8* %arrayidx16.1, align 1
205 %tobool18.not.1 = icmp eq i8 %3, 0
206 br i1 %tobool18.not.1, label %cond.end22.1, label %cond.true19.1
208 cond.true19.1: ; preds = %cond.end22
209 %div43.1 = sdiv i16 27476, %var_15
210 %div.sext.1 = sext i16 %div43.1 to i32
211 br label %cond.end22.1
213 cond.end22.1: ; preds = %cond.true19.1, %cond.end22
214 %cond23.1 = phi i32 [ %div.sext.1, %cond.true19.1 ], [ 0, %cond.end22 ]
215 %tobool24.1 = icmp ne i32 %cond23.1, 0
216 %frombool.1 = zext i1 %tobool24.1 to i8
217 store i8 %frombool.1, i8* @var_36, align 1
218 %add.1 = add nuw nsw i32 %i_15.044, 2
219 %exitcond105.not.1 = icmp eq i32 %add.1, 22
220 br i1 %exitcond105.not.1, label %for.cond.cleanup9, label %for.body10
222 for.body10.1: ; preds = %cond.end22.1.1, %for.cond.cleanup9
223 %i_15.044.1 = phi i32 [ 0, %for.cond.cleanup9 ], [ %add.1.1, %cond.end22.1.1 ]
224 %arraydecay.1108 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 %i_15.044.1, i32 0
225 %4 = ptrtoint [22 x i8]* %arraydecay.1108 to i32
226 %arrayidx13.1109 = getelementptr inbounds [1 x i32], [1 x i32]* @arr_61, i32 0, i32 %i_15.044.1
227 store i32 %4, i32* %arrayidx13.1109, align 4
228 %arrayidx16.1110 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 1, i32 %conv, i32 %i_15.044.1
229 %5 = load i8, i8* %arrayidx16.1110, align 1
230 %tobool18.not.1111 = icmp eq i8 %5, 0
231 br i1 %tobool18.not.1111, label %cond.end22.1119, label %cond.true19.1114
233 cond.true19.1114: ; preds = %for.body10.1
234 %div43.1112 = sdiv i16 27476, %var_15
235 %div.sext.1113 = sext i16 %div43.1112 to i32
236 br label %cond.end22.1119
238 cond.end22.1119: ; preds = %cond.true19.1114, %for.body10.1
239 %cond23.1115 = phi i32 [ %div.sext.1113, %cond.true19.1114 ], [ 0, %for.body10.1 ]
240 %tobool24.1116 = icmp ne i32 %cond23.1115, 0
241 %frombool.1117 = zext i1 %tobool24.1116 to i8
242 store i8 %frombool.1117, i8* @var_36, align 1
243 %add.1118 = or i32 %i_15.044.1, 1
244 %arraydecay.1.1 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 %add.1118, i32 0
245 %6 = ptrtoint [22 x i8]* %arraydecay.1.1 to i32
246 %arrayidx13.1.1 = getelementptr inbounds [1 x i32], [1 x i32]* @arr_61, i32 0, i32 %add.1118
247 store i32 %6, i32* %arrayidx13.1.1, align 4
248 %arrayidx16.1.1 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 1, i32 %conv, i32 %add.1118
249 %7 = load i8, i8* %arrayidx16.1.1, align 1
250 %tobool18.not.1.1 = icmp eq i8 %7, 0
251 br i1 %tobool18.not.1.1, label %cond.end22.1.1, label %cond.true19.1.1
253 cond.true19.1.1: ; preds = %cond.end22.1119
254 %div43.1.1 = sdiv i16 27476, %var_15
255 %div.sext.1.1 = sext i16 %div43.1.1 to i32
256 br label %cond.end22.1.1
258 cond.end22.1.1: ; preds = %cond.true19.1.1, %cond.end22.1119
259 %cond23.1.1 = phi i32 [ %div.sext.1.1, %cond.true19.1.1 ], [ 0, %cond.end22.1119 ]
260 %tobool24.1.1 = icmp ne i32 %cond23.1.1, 0
261 %frombool.1.1 = zext i1 %tobool24.1.1 to i8
262 store i8 %frombool.1.1, i8* @var_36, align 1
263 %add.1.1 = add nuw nsw i32 %i_15.044.1, 2
264 %exitcond105.not.1.1 = icmp eq i32 %add.1.1, 22
265 br i1 %exitcond105.not.1.1, label %for.cond.cleanup9.1, label %for.body10.1
267 for.cond.cleanup9.1: ; preds = %cond.end22.1.1
268 %add27.1 = add nuw nsw i32 %conv45, 2
269 %conv.1 = and i32 %add27.1, 255
270 br label %for.body10.2
272 for.body10.2: ; preds = %cond.end22.1.2, %for.cond.cleanup9.1
273 %i_15.044.2 = phi i32 [ 0, %for.cond.cleanup9.1 ], [ %add.1.2, %cond.end22.1.2 ]
274 %arraydecay.2 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 %i_15.044.2, i32 0
275 %8 = ptrtoint [22 x i8]* %arraydecay.2 to i32
276 %arrayidx13.2 = getelementptr inbounds [1 x i32], [1 x i32]* @arr_61, i32 0, i32 %i_15.044.2
277 store i32 %8, i32* %arrayidx13.2, align 4
278 %arrayidx16.2 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 1, i32 %conv.1, i32 %i_15.044.2
279 %9 = load i8, i8* %arrayidx16.2, align 1
280 %tobool18.not.2 = icmp eq i8 %9, 0
281 br i1 %tobool18.not.2, label %cond.end22.2, label %cond.true19.2
283 cond.true19.2: ; preds = %for.body10.2
284 %div43.2 = sdiv i16 27476, %var_15
285 %div.sext.2 = sext i16 %div43.2 to i32
286 br label %cond.end22.2
288 cond.end22.2: ; preds = %cond.true19.2, %for.body10.2
289 %cond23.2 = phi i32 [ %div.sext.2, %cond.true19.2 ], [ 0, %for.body10.2 ]
290 %tobool24.2 = icmp ne i32 %cond23.2, 0
291 %frombool.2 = zext i1 %tobool24.2 to i8
292 store i8 %frombool.2, i8* @var_36, align 1
293 %add.2 = or i32 %i_15.044.2, 1
294 %arraydecay.1.2 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 %add.2, i32 0
295 %10 = ptrtoint [22 x i8]* %arraydecay.1.2 to i32
296 %arrayidx13.1.2 = getelementptr inbounds [1 x i32], [1 x i32]* @arr_61, i32 0, i32 %add.2
297 store i32 %10, i32* %arrayidx13.1.2, align 4
298 %arrayidx16.1.2 = getelementptr inbounds [18 x [22 x i8]], [18 x [22 x i8]]* %arr_60, i32 1, i32 %conv.1, i32 %add.2
299 %11 = load i8, i8* %arrayidx16.1.2, align 1
300 %tobool18.not.1.2 = icmp eq i8 %11, 0
301 br i1 %tobool18.not.1.2, label %cond.end22.1.2, label %cond.true19.1.2
303 cond.true19.1.2: ; preds = %cond.end22.2
304 %div43.1.2 = sdiv i16 27476, %var_15
305 %div.sext.1.2 = sext i16 %div43.1.2 to i32
306 br label %cond.end22.1.2
308 cond.end22.1.2: ; preds = %cond.true19.1.2, %cond.end22.2
309 %cond23.1.2 = phi i32 [ %div.sext.1.2, %cond.true19.1.2 ], [ 0, %cond.end22.2 ]
310 %tobool24.1.2 = icmp ne i32 %cond23.1.2, 0
311 %frombool.1.2 = zext i1 %tobool24.1.2 to i8
312 store i8 %frombool.1.2, i8* @var_36, align 1
313 %add.1.2 = add nuw nsw i32 %i_15.044.2, 2
314 %exitcond105.not.1.2 = icmp eq i32 %add.1.2, 22
315 br i1 %exitcond105.not.1.2, label %for.cond.cleanup9.2, label %for.body10.2
317 for.cond.cleanup9.2: ; preds = %cond.end22.1.2
318 %add27.2 = add nuw nsw i32 %conv45, 3
319 %conv.2 = and i32 %add27.2, 255
320 %cmp.2 = icmp ult i32 %conv.2, 18
321 br i1 %cmp.2, label %for.cond6.preheader, label %for.cond1
324 declare void @llvm.trap() #1
327 @b = hidden local_unnamed_addr global i32 0, align 4
328 @a = hidden local_unnamed_addr global i32 0, align 4
329 @c = hidden local_unnamed_addr global [1 x i32] zeroinitializer, align 4
331 define i32 @d(i64 %e, i32 %f, i64 %g, i32 %h) {
333 ; CHECK: @ %bb.0: @ %entry
334 ; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
335 ; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
336 ; CHECK-NEXT: .pad #4
337 ; CHECK-NEXT: sub sp, #4
338 ; CHECK-NEXT: .vsave {d8, d9, d10, d11, d12, d13}
339 ; CHECK-NEXT: vpush {d8, d9, d10, d11, d12, d13}
340 ; CHECK-NEXT: .pad #16
341 ; CHECK-NEXT: sub sp, #16
342 ; CHECK-NEXT: mov r12, r1
343 ; CHECK-NEXT: subs r1, r0, #1
344 ; CHECK-NEXT: sbcs r1, r12, #0
345 ; CHECK-NEXT: blt.w .LBB1_28
346 ; CHECK-NEXT: @ %bb.1: @ %for.cond2.preheader.lr.ph
347 ; CHECK-NEXT: movs r7, #1
348 ; CHECK-NEXT: cmp r2, #1
349 ; CHECK-NEXT: csel r3, r2, r7, lt
350 ; CHECK-NEXT: movw r6, #43691
351 ; CHECK-NEXT: mov r1, r3
352 ; CHECK-NEXT: cmp r3, #3
354 ; CHECK-NEXT: movls r1, #3
355 ; CHECK-NEXT: movt r6, #43690
356 ; CHECK-NEXT: subs r1, r1, r3
357 ; CHECK-NEXT: ldr r4, [sp, #112]
358 ; CHECK-NEXT: adds r1, #2
359 ; CHECK-NEXT: movw r10, :lower16:c
360 ; CHECK-NEXT: movt r10, :upper16:c
361 ; CHECK-NEXT: vmov.i32 q5, #0xc
362 ; CHECK-NEXT: umull r1, r5, r1, r6
363 ; CHECK-NEXT: vmov.i32 q6, #0xc
364 ; CHECK-NEXT: @ implicit-def: $r11
365 ; CHECK-NEXT: @ implicit-def: $r9
366 ; CHECK-NEXT: str r3, [sp, #12] @ 4-byte Spill
367 ; CHECK-NEXT: str r0, [sp, #8] @ 4-byte Spill
368 ; CHECK-NEXT: strd r2, r12, [sp] @ 8-byte Folded Spill
369 ; CHECK-NEXT: add.w r6, r7, r5, lsr #1
370 ; CHECK-NEXT: @ implicit-def: $r5
371 ; CHECK-NEXT: adr r1, .LCPI1_0
372 ; CHECK-NEXT: vldrw.u32 q0, [r1]
373 ; CHECK-NEXT: vadd.i32 q4, q0, r3
374 ; CHECK-NEXT: b .LBB1_4
375 ; CHECK-NEXT: .LBB1_2: @ %for.body6.preheader
376 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
377 ; CHECK-NEXT: mov r0, r9
378 ; CHECK-NEXT: cmn.w r9, #4
380 ; CHECK-NEXT: mvnle r0, #3
381 ; CHECK-NEXT: movw r2, #18725
382 ; CHECK-NEXT: adds r0, #6
383 ; CHECK-NEXT: movt r2, #9362
384 ; CHECK-NEXT: sub.w r1, r0, r9
385 ; CHECK-NEXT: movs r5, #0
386 ; CHECK-NEXT: umull r2, r3, r1, r2
387 ; CHECK-NEXT: subs r2, r1, r3
388 ; CHECK-NEXT: add.w r2, r3, r2, lsr #1
389 ; CHECK-NEXT: lsrs r3, r2, #2
390 ; CHECK-NEXT: lsls r3, r3, #3
391 ; CHECK-NEXT: sub.w r2, r3, r2, lsr #2
392 ; CHECK-NEXT: subs r1, r2, r1
393 ; CHECK-NEXT: add r0, r1
394 ; CHECK-NEXT: add.w r9, r0, #7
395 ; CHECK-NEXT: ldrd r12, r0, [sp, #4] @ 8-byte Folded Reload
396 ; CHECK-NEXT: .LBB1_3: @ %for.cond.cleanup5
397 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
398 ; CHECK-NEXT: add.w r11, r11, #2
399 ; CHECK-NEXT: subs.w r1, r11, r0
400 ; CHECK-NEXT: asr.w r7, r11, #31
401 ; CHECK-NEXT: sbcs.w r1, r7, r12
402 ; CHECK-NEXT: bge.w .LBB1_28
403 ; CHECK-NEXT: .LBB1_4: @ %for.cond2.preheader
404 ; CHECK-NEXT: @ =>This Loop Header: Depth=1
405 ; CHECK-NEXT: @ Child Loop BB1_17 Depth 2
406 ; CHECK-NEXT: @ Child Loop BB1_8 Depth 2
407 ; CHECK-NEXT: @ Child Loop BB1_10 Depth 3
408 ; CHECK-NEXT: @ Child Loop BB1_12 Depth 3
409 ; CHECK-NEXT: cmp.w r9, #2
410 ; CHECK-NEXT: bgt .LBB1_3
411 ; CHECK-NEXT: @ %bb.5: @ %for.body6.lr.ph
412 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
413 ; CHECK-NEXT: ldr r0, [sp, #12] @ 4-byte Reload
414 ; CHECK-NEXT: cmp r0, #5
415 ; CHECK-NEXT: bhi .LBB1_15
416 ; CHECK-NEXT: @ %bb.6: @ %for.body6.us.preheader
417 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
418 ; CHECK-NEXT: ldrd r2, r3, [sp, #104]
419 ; CHECK-NEXT: movs r0, #32
420 ; CHECK-NEXT: movs r1, #0
421 ; CHECK-NEXT: bl __aeabi_ldivmod
422 ; CHECK-NEXT: vdup.32 q0, r2
423 ; CHECK-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
424 ; CHECK-NEXT: ldrd r2, r12, [sp] @ 8-byte Folded Reload
425 ; CHECK-NEXT: mov r7, r9
426 ; CHECK-NEXT: b .LBB1_8
427 ; CHECK-NEXT: .LBB1_7: @ %for.cond.cleanup17.us
428 ; CHECK-NEXT: @ in Loop: Header=BB1_8 Depth=2
429 ; CHECK-NEXT: add.w r9, r7, #7
430 ; CHECK-NEXT: cmn.w r7, #4
431 ; CHECK-NEXT: mov.w r5, #0
432 ; CHECK-NEXT: mov r7, r9
433 ; CHECK-NEXT: bge .LBB1_3
434 ; CHECK-NEXT: .LBB1_8: @ %for.body6.us
435 ; CHECK-NEXT: @ Parent Loop BB1_4 Depth=1
436 ; CHECK-NEXT: @ => This Loop Header: Depth=2
437 ; CHECK-NEXT: @ Child Loop BB1_10 Depth 3
438 ; CHECK-NEXT: @ Child Loop BB1_12 Depth 3
439 ; CHECK-NEXT: cbz r2, .LBB1_11
440 ; CHECK-NEXT: @ %bb.9: @ %for.body13.us51.preheader
441 ; CHECK-NEXT: @ in Loop: Header=BB1_8 Depth=2
442 ; CHECK-NEXT: movw r3, :lower16:a
443 ; CHECK-NEXT: movs r1, #0
444 ; CHECK-NEXT: movt r3, :upper16:a
445 ; CHECK-NEXT: vmov q1, q4
446 ; CHECK-NEXT: str r1, [r3]
447 ; CHECK-NEXT: movw r3, :lower16:b
448 ; CHECK-NEXT: movt r3, :upper16:b
449 ; CHECK-NEXT: str r1, [r3]
450 ; CHECK-NEXT: dlstp.32 lr, r6
451 ; CHECK-NEXT: .LBB1_10: @ %vector.body111
452 ; CHECK-NEXT: @ Parent Loop BB1_4 Depth=1
453 ; CHECK-NEXT: @ Parent Loop BB1_8 Depth=2
454 ; CHECK-NEXT: @ => This Inner Loop Header: Depth=3
455 ; CHECK-NEXT: vshl.i32 q2, q1, #2
456 ; CHECK-NEXT: vadd.i32 q1, q1, q6
457 ; CHECK-NEXT: vadd.i32 q2, q2, r10
458 ; CHECK-NEXT: vstrw.32 q0, [q2]
459 ; CHECK-NEXT: letp lr, .LBB1_10
460 ; CHECK-NEXT: b .LBB1_13
461 ; CHECK-NEXT: .LBB1_11: @ %vector.body.preheader
462 ; CHECK-NEXT: @ in Loop: Header=BB1_8 Depth=2
463 ; CHECK-NEXT: vmov q1, q4
464 ; CHECK-NEXT: dlstp.32 lr, r6
465 ; CHECK-NEXT: .LBB1_12: @ %vector.body
466 ; CHECK-NEXT: @ Parent Loop BB1_4 Depth=1
467 ; CHECK-NEXT: @ Parent Loop BB1_8 Depth=2
468 ; CHECK-NEXT: @ => This Inner Loop Header: Depth=3
469 ; CHECK-NEXT: vshl.i32 q2, q1, #2
470 ; CHECK-NEXT: vadd.i32 q1, q1, q5
471 ; CHECK-NEXT: vadd.i32 q2, q2, r10
472 ; CHECK-NEXT: vstrw.32 q0, [q2]
473 ; CHECK-NEXT: letp lr, .LBB1_12
474 ; CHECK-NEXT: .LBB1_13: @ %for.cond9.for.cond15.preheader_crit_edge.us
475 ; CHECK-NEXT: @ in Loop: Header=BB1_8 Depth=2
476 ; CHECK-NEXT: cmp r4, #0
477 ; CHECK-NEXT: beq .LBB1_7
478 ; CHECK-NEXT: @ %bb.14: @ %for.cond9.for.cond15.preheader_crit_edge.us
479 ; CHECK-NEXT: @ in Loop: Header=BB1_8 Depth=2
480 ; CHECK-NEXT: eor r1, r5, #1
481 ; CHECK-NEXT: lsls r1, r1, #31
482 ; CHECK-NEXT: bne .LBB1_7
483 ; CHECK-NEXT: b .LBB1_26
484 ; CHECK-NEXT: .LBB1_15: @ %for.body6.lr.ph.split
485 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
486 ; CHECK-NEXT: cmp r4, #0
487 ; CHECK-NEXT: beq.w .LBB1_2
488 ; CHECK-NEXT: @ %bb.16: @ in Loop: Header=BB1_4 Depth=1
489 ; CHECK-NEXT: ldrd r12, r0, [sp, #4] @ 8-byte Folded Reload
490 ; CHECK-NEXT: mov r7, r9
491 ; CHECK-NEXT: .LBB1_17: @ %for.body6.us60
492 ; CHECK-NEXT: @ Parent Loop BB1_4 Depth=1
493 ; CHECK-NEXT: @ => This Inner Loop Header: Depth=2
494 ; CHECK-NEXT: lsls r1, r5, #31
495 ; CHECK-NEXT: bne .LBB1_27
496 ; CHECK-NEXT: @ %bb.18: @ %for.cond.cleanup17.us63
497 ; CHECK-NEXT: @ in Loop: Header=BB1_17 Depth=2
498 ; CHECK-NEXT: cmn.w r7, #4
499 ; CHECK-NEXT: bge .LBB1_22
500 ; CHECK-NEXT: @ %bb.19: @ %for.cond.cleanup17.us63.1
501 ; CHECK-NEXT: @ in Loop: Header=BB1_17 Depth=2
502 ; CHECK-NEXT: cmn.w r7, #12
503 ; CHECK-NEXT: bgt .LBB1_23
504 ; CHECK-NEXT: @ %bb.20: @ %for.cond.cleanup17.us63.2
505 ; CHECK-NEXT: @ in Loop: Header=BB1_17 Depth=2
506 ; CHECK-NEXT: cmn.w r7, #19
507 ; CHECK-NEXT: bgt .LBB1_24
508 ; CHECK-NEXT: @ %bb.21: @ %for.cond.cleanup17.us63.3
509 ; CHECK-NEXT: @ in Loop: Header=BB1_17 Depth=2
510 ; CHECK-NEXT: add.w r9, r7, #28
511 ; CHECK-NEXT: cmn.w r7, #25
512 ; CHECK-NEXT: mov.w r5, #0
513 ; CHECK-NEXT: mov r7, r9
514 ; CHECK-NEXT: blt .LBB1_17
515 ; CHECK-NEXT: b .LBB1_3
516 ; CHECK-NEXT: .LBB1_22: @ %for.cond.cleanup5.loopexit134.split.loop.exit139
517 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
518 ; CHECK-NEXT: add.w r9, r7, #7
519 ; CHECK-NEXT: b .LBB1_25
520 ; CHECK-NEXT: .LBB1_23: @ %for.cond.cleanup5.loopexit134.split.loop.exit137
521 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
522 ; CHECK-NEXT: add.w r9, r7, #14
523 ; CHECK-NEXT: b .LBB1_25
524 ; CHECK-NEXT: .LBB1_24: @ %for.cond.cleanup5.loopexit134.split.loop.exit135
525 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
526 ; CHECK-NEXT: add.w r9, r7, #21
527 ; CHECK-NEXT: .LBB1_25: @ %for.cond.cleanup5
528 ; CHECK-NEXT: @ in Loop: Header=BB1_4 Depth=1
529 ; CHECK-NEXT: movs r5, #0
530 ; CHECK-NEXT: b .LBB1_3
531 ; CHECK-NEXT: .LBB1_26: @ %for.inc19.us
532 ; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1
533 ; CHECK-NEXT: b .LBB1_26
534 ; CHECK-NEXT: .LBB1_27: @ %for.inc19.us66
535 ; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1
536 ; CHECK-NEXT: b .LBB1_27
537 ; CHECK-NEXT: .LBB1_28: @ %for.cond.cleanup
538 ; CHECK-NEXT: add sp, #16
539 ; CHECK-NEXT: vpop {d8, d9, d10, d11, d12, d13}
540 ; CHECK-NEXT: add sp, #4
541 ; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
542 ; CHECK-NEXT: .p2align 4
543 ; CHECK-NEXT: @ %bb.29:
544 ; CHECK-NEXT: .LCPI1_0:
545 ; CHECK-NEXT: .long 0 @ 0x0
546 ; CHECK-NEXT: .long 3 @ 0x3
547 ; CHECK-NEXT: .long 6 @ 0x6
548 ; CHECK-NEXT: .long 9 @ 0x9
550 %cmp47 = icmp sgt i64 %e, 0
551 br i1 %cmp47, label %for.cond2.preheader.lr.ph, label %for.cond.cleanup
553 for.cond2.preheader.lr.ph: ; preds = %entry
554 %cmp7.inv = icmp slt i32 %f, 1
555 %spec.select = select i1 %cmp7.inv, i32 %f, i32 1
556 %cmp1041 = icmp ult i32 %spec.select, 6
557 %tobool.not = icmp eq i32 %f, 0
558 %tobool20.not97 = icmp eq i32 %h, 0
559 %0 = icmp ugt i32 %spec.select, 3
560 %umax = select i1 %0, i32 %spec.select, i32 3
561 %1 = add i32 %umax, 2
562 %2 = sub i32 %1, %spec.select
564 %4 = add nuw nsw i32 %3, 1
565 %5 = icmp ugt i32 %spec.select, 3
566 %umax112 = select i1 %5, i32 %spec.select, i32 3
567 %6 = add i32 %umax112, 2
568 %7 = sub i32 %6, %spec.select
570 %9 = add nuw nsw i32 %8, 1
571 %n.rnd.up114 = add nuw nsw i32 %8, 4
572 %n.vec116 = and i32 %n.rnd.up114, 2147483644
573 %.splatinsert121 = insertelement <4 x i32> poison, i32 %spec.select, i32 0
574 %.splat122 = shufflevector <4 x i32> %.splatinsert121, <4 x i32> poison, <4 x i32> zeroinitializer
575 %induction123 = add <4 x i32> %.splat122, <i32 0, i32 3, i32 6, i32 9>
576 %n.rnd.up = add nuw nsw i32 %3, 4
577 %n.vec = and i32 %n.rnd.up, 2147483644
578 %.splatinsert = insertelement <4 x i32> poison, i32 %spec.select, i32 0
579 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer
580 %induction = add <4 x i32> %.splat, <i32 0, i32 3, i32 6, i32 9>
581 br label %for.cond2.preheader
583 for.cond2.preheader: ; preds = %for.cond2.preheader.lr.ph, %for.cond.cleanup5
584 %l.0.off050 = phi i1 [ undef, %for.cond2.preheader.lr.ph ], [ %l.1.off0.lcssa, %for.cond.cleanup5 ]
585 %i.049 = phi i32 [ undef, %for.cond2.preheader.lr.ph ], [ %add26, %for.cond.cleanup5 ]
586 %j.048 = phi i32 [ undef, %for.cond2.preheader.lr.ph ], [ %j.1.lcssa, %for.cond.cleanup5 ]
587 %cmp343 = icmp slt i32 %j.048, 3
588 br i1 %cmp343, label %for.body6.lr.ph, label %for.cond.cleanup5
590 for.body6.lr.ph: ; preds = %for.cond2.preheader
591 br i1 %cmp1041, label %for.body6.us.preheader, label %for.body6.lr.ph.split
593 for.body6.us.preheader: ; preds = %for.body6.lr.ph
594 %rem.us = srem i64 32, %g
595 %conv14.us = trunc i64 %rem.us to i32
596 %broadcast.splatinsert131 = insertelement <4 x i32> poison, i32 %conv14.us, i32 0
597 %broadcast.splat132 = shufflevector <4 x i32> %broadcast.splatinsert131, <4 x i32> poison, <4 x i32> zeroinitializer
598 %broadcast.splatinsert107 = insertelement <4 x i32> poison, i32 %conv14.us, i32 0
599 %broadcast.splat108 = shufflevector <4 x i32> %broadcast.splatinsert107, <4 x i32> poison, <4 x i32> zeroinitializer
600 br label %for.body6.us
602 for.body6.us: ; preds = %for.body6.us.preheader, %for.cond.cleanup17.us
603 %l.1.off045.us = phi i1 [ false, %for.cond.cleanup17.us ], [ %l.0.off050, %for.body6.us.preheader ]
604 %j.144.us = phi i32 [ %add23.us, %for.cond.cleanup17.us ], [ %j.048, %for.body6.us.preheader ]
605 br i1 %tobool.not, label %vector.body, label %for.body13.us51.preheader
607 vector.body: ; preds = %for.body6.us, %vector.body
608 %index = phi i32 [ %index.next, %vector.body ], [ 0, %for.body6.us ]
609 %vec.ind = phi <4 x i32> [ %vec.ind.next, %vector.body ], [ %induction, %for.body6.us ]
610 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %4)
611 %10 = getelementptr inbounds [1 x i32], [1 x i32]* @c, i32 0, <4 x i32> %vec.ind
612 call void @llvm.masked.scatter.v4i32.v4p0i32(<4 x i32> %broadcast.splat108, <4 x i32*> %10, i32 4, <4 x i1> %active.lane.mask)
613 %index.next = add i32 %index, 4
614 %vec.ind.next = add <4 x i32> %vec.ind, <i32 12, i32 12, i32 12, i32 12>
615 %11 = icmp eq i32 %index.next, %n.vec
616 br i1 %11, label %for.cond9.for.cond15.preheader_crit_edge.us, label %vector.body
618 for.body13.us51.preheader: ; preds = %for.body6.us
619 store i32 0, i32* @b, align 4
620 store i32 0, i32* @a, align 4
621 br label %vector.body111
623 vector.body111: ; preds = %vector.body111, %for.body13.us51.preheader
624 %index117 = phi i32 [ 0, %for.body13.us51.preheader ], [ %index.next118, %vector.body111 ]
625 %vec.ind124 = phi <4 x i32> [ %induction123, %for.body13.us51.preheader ], [ %vec.ind.next125, %vector.body111 ]
626 %active.lane.mask130 = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index117, i32 %9)
627 %12 = getelementptr inbounds [1 x i32], [1 x i32]* @c, i32 0, <4 x i32> %vec.ind124
628 call void @llvm.masked.scatter.v4i32.v4p0i32(<4 x i32> %broadcast.splat132, <4 x i32*> %12, i32 4, <4 x i1> %active.lane.mask130)
629 %index.next118 = add i32 %index117, 4
630 %vec.ind.next125 = add <4 x i32> %vec.ind124, <i32 12, i32 12, i32 12, i32 12>
631 %13 = icmp eq i32 %index.next118, %n.vec116
632 br i1 %13, label %for.cond9.for.cond15.preheader_crit_edge.us, label %vector.body111
634 for.cond.cleanup17.us: ; preds = %for.cond9.for.cond15.preheader_crit_edge.us
635 %add23.us = add nsw i32 %j.144.us, 7
636 %cmp3.us = icmp slt i32 %j.144.us, -4
637 br i1 %cmp3.us, label %for.body6.us, label %for.cond.cleanup5
639 for.inc19.us: ; preds = %for.cond9.for.cond15.preheader_crit_edge.us, %for.inc19.us
640 br label %for.inc19.us
642 for.cond9.for.cond15.preheader_crit_edge.us: ; preds = %vector.body111, %vector.body
643 %l.1.off045.us.not = xor i1 %l.1.off045.us, true
644 %brmerge = or i1 %tobool20.not97, %l.1.off045.us.not
645 br i1 %brmerge, label %for.cond.cleanup17.us, label %for.inc19.us
647 for.body6.lr.ph.split: ; preds = %for.body6.lr.ph
648 br i1 %tobool20.not97, label %for.body6.preheader, label %for.body6.us60
650 for.body6.preheader: ; preds = %for.body6.lr.ph.split
651 %14 = icmp sgt i32 %j.048, -4
652 %smax = select i1 %14, i32 %j.048, i32 -4
653 %15 = add nsw i32 %smax, 6
654 %16 = sub i32 %15, %j.048
655 %17 = urem i32 %16, 7
656 %18 = sub i32 %16, %17
657 %19 = add nsw i32 %j.048, 7
658 %20 = add i32 %19, %18
659 br label %for.cond.cleanup5
661 for.body6.us60: ; preds = %for.body6.lr.ph.split, %for.cond.cleanup17.us63.3
662 %l.1.off045.us61 = phi i1 [ false, %for.cond.cleanup17.us63.3 ], [ %l.0.off050, %for.body6.lr.ph.split ]
663 %j.144.us62 = phi i32 [ %add23.us64.3, %for.cond.cleanup17.us63.3 ], [ %j.048, %for.body6.lr.ph.split ]
664 br i1 %l.1.off045.us61, label %for.inc19.us66, label %for.cond.cleanup17.us63
666 for.cond.cleanup17.us63: ; preds = %for.body6.us60
667 %cmp3.us65 = icmp slt i32 %j.144.us62, -4
668 br i1 %cmp3.us65, label %for.cond.cleanup17.us63.1, label %for.cond.cleanup5.loopexit134.split.loop.exit139
670 for.inc19.us66: ; preds = %for.body6.us60, %for.inc19.us66
671 br label %for.inc19.us66
673 for.cond.cleanup: ; preds = %for.cond.cleanup5, %entry
676 for.cond.cleanup5.loopexit134.split.loop.exit135: ; preds = %for.cond.cleanup17.us63.2
677 %add23.us64.2.le = add nsw i32 %j.144.us62, 21
678 br label %for.cond.cleanup5
680 for.cond.cleanup5.loopexit134.split.loop.exit137: ; preds = %for.cond.cleanup17.us63.1
681 %add23.us64.1.le = add nsw i32 %j.144.us62, 14
682 br label %for.cond.cleanup5
684 for.cond.cleanup5.loopexit134.split.loop.exit139: ; preds = %for.cond.cleanup17.us63
685 %add23.us64.le = add nsw i32 %j.144.us62, 7
686 br label %for.cond.cleanup5
688 for.cond.cleanup5: ; preds = %for.cond.cleanup5.loopexit134.split.loop.exit135, %for.cond.cleanup5.loopexit134.split.loop.exit137, %for.cond.cleanup5.loopexit134.split.loop.exit139, %for.cond.cleanup17.us63.3, %for.cond.cleanup17.us, %for.body6.preheader, %for.cond2.preheader
689 %j.1.lcssa = phi i32 [ %j.048, %for.cond2.preheader ], [ %20, %for.body6.preheader ], [ %add23.us, %for.cond.cleanup17.us ], [ %add23.us64.2.le, %for.cond.cleanup5.loopexit134.split.loop.exit135 ], [ %add23.us64.1.le, %for.cond.cleanup5.loopexit134.split.loop.exit137 ], [ %add23.us64.le, %for.cond.cleanup5.loopexit134.split.loop.exit139 ], [ %add23.us64.3, %for.cond.cleanup17.us63.3 ]
690 %l.1.off0.lcssa = phi i1 [ %l.0.off050, %for.cond2.preheader ], [ false, %for.body6.preheader ], [ false, %for.cond.cleanup17.us ], [ false, %for.cond.cleanup17.us63.3 ], [ false, %for.cond.cleanup5.loopexit134.split.loop.exit139 ], [ false, %for.cond.cleanup5.loopexit134.split.loop.exit137 ], [ false, %for.cond.cleanup5.loopexit134.split.loop.exit135 ]
691 %add26 = add nsw i32 %i.049, 2
692 %conv = sext i32 %add26 to i64
693 %cmp = icmp slt i64 %conv, %e
694 br i1 %cmp, label %for.cond2.preheader, label %for.cond.cleanup
696 for.cond.cleanup17.us63.1: ; preds = %for.cond.cleanup17.us63
697 %cmp3.us65.1 = icmp slt i32 %j.144.us62, -11
698 br i1 %cmp3.us65.1, label %for.cond.cleanup17.us63.2, label %for.cond.cleanup5.loopexit134.split.loop.exit137
700 for.cond.cleanup17.us63.2: ; preds = %for.cond.cleanup17.us63.1
701 %cmp3.us65.2 = icmp slt i32 %j.144.us62, -18
702 br i1 %cmp3.us65.2, label %for.cond.cleanup17.us63.3, label %for.cond.cleanup5.loopexit134.split.loop.exit135
704 for.cond.cleanup17.us63.3: ; preds = %for.cond.cleanup17.us63.2
705 %add23.us64.3 = add nsw i32 %j.144.us62, 28
706 %cmp3.us65.3 = icmp slt i32 %j.144.us62, -25
707 br i1 %cmp3.us65.3, label %for.body6.us60, label %for.cond.cleanup5
710 declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32, i32) #1
711 declare void @llvm.masked.scatter.v4i32.v4p0i32(<4 x i32>, <4 x i32*>, i32 immarg, <4 x i1>) #2