[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-gather-increment.ll
blob93cab25c2cb72e6a5b27aa08e0e2e452d003099b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst %s -o - | FileCheck %s
4 define arm_aapcs_vfpcc <4 x i32> @gather_inc_mini_4i32(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, <4 x i32> %offs) {
5 ; CHECK-LABEL: gather_inc_mini_4i32:
6 ; CHECK:       @ %bb.0:
7 ; CHECK-NEXT:    movs r1, #4
8 ; CHECK-NEXT:    vadd.i32 q1, q0, r1
9 ; CHECK-NEXT:    vldrw.u32 q0, [r0, q1, uxtw #2]
10 ; CHECK-NEXT:    bx lr
11   %1 = add <4 x i32> %offs, <i32 4, i32 4, i32 4, i32 4>
12   %2 = getelementptr inbounds i32, ptr %data, <4 x i32> %1
13   %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %2, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)
14   ret <4 x i32> %wide.masked.gather
17 define arm_aapcs_vfpcc <4 x i32> @gather_inc_minipred_4i32(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, <4 x i32> %offs) {
18 ; CHECK-LABEL: gather_inc_minipred_4i32:
19 ; CHECK:       @ %bb.0:
20 ; CHECK-NEXT:    movs r1, #4
21 ; CHECK-NEXT:    movw r2, #3855
22 ; CHECK-NEXT:    vadd.i32 q1, q0, r1
23 ; CHECK-NEXT:    vmsr p0, r2
24 ; CHECK-NEXT:    vpst
25 ; CHECK-NEXT:    vldrwt.u32 q0, [r0, q1, uxtw #2]
26 ; CHECK-NEXT:    bx lr
27   %1 = add <4 x i32> %offs, <i32 4, i32 4, i32 4, i32 4>
28   %2 = getelementptr inbounds i32, ptr %data, <4 x i32> %1
29   %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %2, i32 4, <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> undef)
30   ret <4 x i32> %wide.masked.gather
33 define arm_aapcs_vfpcc <8 x i16> @gather_inc_mini_8i16(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, <8 x i32> %offs) {
34 ; CHECK-LABEL: gather_inc_mini_8i16:
35 ; CHECK:       @ %bb.0:
36 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
37 ; CHECK-NEXT:    push {r4, r5, r6, lr}
38 ; CHECK-NEXT:    vshl.i32 q1, q1, #1
39 ; CHECK-NEXT:    mov.w r12, #16
40 ; CHECK-NEXT:    vadd.i32 q1, q1, r0
41 ; CHECK-NEXT:    vshl.i32 q0, q0, #1
42 ; CHECK-NEXT:    vadd.i32 q1, q1, r12
43 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
44 ; CHECK-NEXT:    vmov r1, lr, d3
45 ; CHECK-NEXT:    vadd.i32 q0, q0, r12
46 ; CHECK-NEXT:    vmov r0, r3, d1
47 ; CHECK-NEXT:    vmov r2, r4, d2
48 ; CHECK-NEXT:    ldrh r6, [r1]
49 ; CHECK-NEXT:    vmov r1, r5, d0
50 ; CHECK-NEXT:    ldrh r0, [r0]
51 ; CHECK-NEXT:    ldrh r3, [r3]
52 ; CHECK-NEXT:    ldrh r2, [r2]
53 ; CHECK-NEXT:    ldrh r4, [r4]
54 ; CHECK-NEXT:    ldrh.w r12, [lr]
55 ; CHECK-NEXT:    ldrh r1, [r1]
56 ; CHECK-NEXT:    ldrh r5, [r5]
57 ; CHECK-NEXT:    vmov.16 q0[0], r1
58 ; CHECK-NEXT:    vmov.16 q0[1], r5
59 ; CHECK-NEXT:    vmov.16 q0[2], r0
60 ; CHECK-NEXT:    vmov.16 q0[3], r3
61 ; CHECK-NEXT:    vmov.16 q0[4], r2
62 ; CHECK-NEXT:    vmov.16 q0[5], r4
63 ; CHECK-NEXT:    vmov.16 q0[6], r6
64 ; CHECK-NEXT:    vmov.16 q0[7], r12
65 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
66   %1 = add <8 x i32> %offs, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
67   %2 = getelementptr inbounds i16, ptr %data, <8 x i32> %1
68   %wide.masked.gather = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %2, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)
69   ret <8 x i16> %wide.masked.gather
72 define arm_aapcs_vfpcc <8 x i16> @gather_inc_minipred_8i16(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, <8 x i32> %offs) {
73 ; CHECK-LABEL: gather_inc_minipred_8i16:
74 ; CHECK:       @ %bb.0:
75 ; CHECK-NEXT:    vshl.i32 q0, q0, #1
76 ; CHECK-NEXT:    movs r1, #16
77 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
78 ; CHECK-NEXT:    vshl.i32 q1, q1, #1
79 ; CHECK-NEXT:    vadd.i32 q0, q0, r1
80 ; CHECK-NEXT:    vadd.i32 q1, q1, r0
81 ; CHECK-NEXT:    vmov r2, s0
82 ; CHECK-NEXT:    vadd.i32 q1, q1, r1
83 ; CHECK-NEXT:    vmov r3, s2
84 ; CHECK-NEXT:    vmov r0, s4
85 ; CHECK-NEXT:    vmov r1, s6
86 ; CHECK-NEXT:    ldrh r2, [r2]
87 ; CHECK-NEXT:    ldrh r3, [r3]
88 ; CHECK-NEXT:    vmov.16 q0[0], r2
89 ; CHECK-NEXT:    ldrh r0, [r0]
90 ; CHECK-NEXT:    vmov.16 q0[2], r3
91 ; CHECK-NEXT:    ldrh r1, [r1]
92 ; CHECK-NEXT:    vmov.16 q0[4], r0
93 ; CHECK-NEXT:    vmov.16 q0[6], r1
94 ; CHECK-NEXT:    bx lr
95   %1 = add <8 x i32> %offs, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
96   %2 = getelementptr inbounds i16, ptr %data, <8 x i32> %1
97   %wide.masked.gather = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %2, i32 4, <8 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <8 x i16> undef)
98   ret <8 x i16> %wide.masked.gather
101 define arm_aapcs_vfpcc <16 x i8> @gather_inc_mini_16i8(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, <16 x i32> %offs) {
102 ; CHECK-LABEL: gather_inc_mini_16i8:
103 ; CHECK:       @ %bb.0:
104 ; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
105 ; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
106 ; CHECK-NEXT:    movs r5, #16
107 ; CHECK-NEXT:    vadd.i32 q3, q3, r0
108 ; CHECK-NEXT:    vadd.i32 q3, q3, r5
109 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
110 ; CHECK-NEXT:    vmov r1, r2, d7
111 ; CHECK-NEXT:    vadd.i32 q1, q1, r0
112 ; CHECK-NEXT:    vmov r3, r4, d6
113 ; CHECK-NEXT:    vadd.i32 q3, q0, r5
114 ; CHECK-NEXT:    vadd.i32 q0, q2, r0
115 ; CHECK-NEXT:    vadd.i32 q1, q1, r5
116 ; CHECK-NEXT:    vadd.i32 q2, q0, r5
117 ; CHECK-NEXT:    ldrb.w r12, [r1]
118 ; CHECK-NEXT:    ldrb r1, [r3]
119 ; CHECK-NEXT:    ldrb.w lr, [r2]
120 ; CHECK-NEXT:    ldrb r3, [r4]
121 ; CHECK-NEXT:    vmov r2, r4, d6
122 ; CHECK-NEXT:    ldrb r2, [r2]
123 ; CHECK-NEXT:    ldrb r4, [r4]
124 ; CHECK-NEXT:    vmov.8 q0[0], r2
125 ; CHECK-NEXT:    vmov r2, r6, d5
126 ; CHECK-NEXT:    vmov.8 q0[1], r4
127 ; CHECK-NEXT:    ldrb r4, [r2]
128 ; CHECK-NEXT:    ldrb r2, [r6]
129 ; CHECK-NEXT:    vmov r6, r7, d7
130 ; CHECK-NEXT:    ldrb r0, [r6]
131 ; CHECK-NEXT:    ldrb r7, [r7]
132 ; CHECK-NEXT:    vmov.8 q0[2], r0
133 ; CHECK-NEXT:    vmov r0, r5, d2
134 ; CHECK-NEXT:    vmov.8 q0[3], r7
135 ; CHECK-NEXT:    ldrb r0, [r0]
136 ; CHECK-NEXT:    ldrb r5, [r5]
137 ; CHECK-NEXT:    vmov.8 q0[4], r0
138 ; CHECK-NEXT:    vmov.8 q0[5], r5
139 ; CHECK-NEXT:    vmov r0, r5, d3
140 ; CHECK-NEXT:    ldrb r0, [r0]
141 ; CHECK-NEXT:    ldrb r5, [r5]
142 ; CHECK-NEXT:    vmov.8 q0[6], r0
143 ; CHECK-NEXT:    vmov.8 q0[7], r5
144 ; CHECK-NEXT:    vmov r0, r5, d4
145 ; CHECK-NEXT:    ldrb r0, [r0]
146 ; CHECK-NEXT:    ldrb r5, [r5]
147 ; CHECK-NEXT:    vmov.8 q0[8], r0
148 ; CHECK-NEXT:    vmov.8 q0[9], r5
149 ; CHECK-NEXT:    vmov.8 q0[10], r4
150 ; CHECK-NEXT:    vmov.8 q0[11], r2
151 ; CHECK-NEXT:    vmov.8 q0[12], r1
152 ; CHECK-NEXT:    vmov.8 q0[13], r3
153 ; CHECK-NEXT:    vmov.8 q0[14], r12
154 ; CHECK-NEXT:    vmov.8 q0[15], lr
155 ; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
156   %1 = add <16 x i32> %offs, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
157   %2 = getelementptr inbounds i8, ptr %data, <16 x i32> %1
158   %wide.masked.gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %2, i32 2, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)
159   ret <16 x i8> %wide.masked.gather
162 define arm_aapcs_vfpcc <16 x i8> @gather_inc_minipred_16i8(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, <16 x i32> %offs) {
163 ; CHECK-LABEL: gather_inc_minipred_16i8:
164 ; CHECK:       @ %bb.0:
165 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
166 ; CHECK-NEXT:    push {r4, r5, r7, lr}
167 ; CHECK-NEXT:    movs r1, #16
168 ; CHECK-NEXT:    vadd.i32 q1, q1, r0
169 ; CHECK-NEXT:    vadd.i32 q1, q1, r1
170 ; CHECK-NEXT:    vadd.i32 q2, q2, r0
171 ; CHECK-NEXT:    vmov r2, s4
172 ; CHECK-NEXT:    vadd.i32 q2, q2, r1
173 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
174 ; CHECK-NEXT:    vmov r3, s10
175 ; CHECK-NEXT:    vadd.i32 q0, q0, r1
176 ; CHECK-NEXT:    vmov r4, s0
177 ; CHECK-NEXT:    vmov r5, s2
178 ; CHECK-NEXT:    ldrb.w r12, [r2]
179 ; CHECK-NEXT:    vmov r2, s8
180 ; CHECK-NEXT:    ldrb r3, [r3]
181 ; CHECK-NEXT:    ldrb r4, [r4]
182 ; CHECK-NEXT:    ldrb r5, [r5]
183 ; CHECK-NEXT:    vmov.8 q0[0], r4
184 ; CHECK-NEXT:    vmov.8 q0[2], r5
185 ; CHECK-NEXT:    vmov.8 q0[4], r12
186 ; CHECK-NEXT:    ldrb.w lr, [r2]
187 ; CHECK-NEXT:    vmov r2, s6
188 ; CHECK-NEXT:    vadd.i32 q1, q3, r0
189 ; CHECK-NEXT:    vadd.i32 q1, q1, r1
190 ; CHECK-NEXT:    vmov r0, s4
191 ; CHECK-NEXT:    vmov r1, s6
192 ; CHECK-NEXT:    ldrb r2, [r2]
193 ; CHECK-NEXT:    vmov.8 q0[6], r2
194 ; CHECK-NEXT:    vmov.8 q0[8], lr
195 ; CHECK-NEXT:    ldrb r0, [r0]
196 ; CHECK-NEXT:    vmov.8 q0[10], r3
197 ; CHECK-NEXT:    ldrb r1, [r1]
198 ; CHECK-NEXT:    vmov.8 q0[12], r0
199 ; CHECK-NEXT:    vmov.8 q0[14], r1
200 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
201   %1 = add <16 x i32> %offs, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
202   %2 = getelementptr inbounds i8, ptr %data, <16 x i32> %1
203   %wide.masked.gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %2, i32 2, <16 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <16 x i8> undef)
204   ret <16 x i8> %wide.masked.gather
207 define arm_aapcs_vfpcc void @gather_pre_inc(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n.vec) {
208 ; CHECK-LABEL: gather_pre_inc:
209 ; CHECK:       @ %bb.0: @ %vector.ph
210 ; CHECK-NEXT:    adr r3, .LCPI6_0
211 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
212 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
213 ; CHECK-NEXT:  .LBB6_1: @ %vector.body
214 ; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1
215 ; CHECK-NEXT:    vldrw.u32 q1, [q0, #96]!
216 ; CHECK-NEXT:    subs r2, #4
217 ; CHECK-NEXT:    vstrb.8 q1, [r1], #16
218 ; CHECK-NEXT:    bne .LBB6_1
219 ; CHECK-NEXT:  @ %bb.2: @ %end
220 ; CHECK-NEXT:    bx lr
221 ; CHECK-NEXT:    .p2align 4
222 ; CHECK-NEXT:  @ %bb.3:
223 ; CHECK-NEXT:  .LCPI6_0:
224 ; CHECK-NEXT:    .long 4294967224 @ 0xffffffb8
225 ; CHECK-NEXT:    .long 4294967248 @ 0xffffffd0
226 ; CHECK-NEXT:    .long 4294967272 @ 0xffffffe8
227 ; CHECK-NEXT:    .long 0 @ 0x0
228 vector.ph:                                        ; preds = %for.body.preheader
229   br label %vector.body
231 vector.body:                                      ; preds = %vector.body, %vector.ph
232   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
233   %vec.ind = phi <4 x i32> [ <i32 0, i32 2, i32 4, i32 6>, %vector.ph ], [ %vec.ind.next, %vector.body ]
234   %0 = mul <4 x i32> %vec.ind, <i32 3, i32 3, i32 3, i32 3>
235   %1 = add <4 x i32> %0, <i32 6, i32 6, i32 6, i32 6>
236   %2 = getelementptr inbounds i32, ptr %data, <4 x i32> %1
237   %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %2, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)
238   %3 = getelementptr inbounds i32, ptr %dst, i32 %index
239   store <4 x i32> %wide.masked.gather, ptr %3, align 4
240   %index.next = add i32 %index, 4
241   %vec.ind.next = add <4 x i32> %vec.ind, <i32 8, i32 8, i32 8, i32 8>
242   %4 = icmp eq i32 %index.next, %n.vec
243   br i1 %4, label %end, label %vector.body
245 end:
246   ret void;
249 define arm_aapcs_vfpcc void @gather_post_inc(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n.vec43) {
250 ; CHECK-LABEL: gather_post_inc:
251 ; CHECK:       @ %bb.0: @ %vector.ph41
252 ; CHECK-NEXT:    adr r3, .LCPI7_0
253 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
254 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
255 ; CHECK-NEXT:  .LBB7_1: @ %vector.body39
256 ; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1
257 ; CHECK-NEXT:    vldrw.u32 q1, [q0, #96]!
258 ; CHECK-NEXT:    subs r2, #4
259 ; CHECK-NEXT:    vstrb.8 q1, [r1], #16
260 ; CHECK-NEXT:    bne .LBB7_1
261 ; CHECK-NEXT:  @ %bb.2: @ %end
262 ; CHECK-NEXT:    bx lr
263 ; CHECK-NEXT:    .p2align 4
264 ; CHECK-NEXT:  @ %bb.3:
265 ; CHECK-NEXT:  .LCPI7_0:
266 ; CHECK-NEXT:    .long 4294967200 @ 0xffffffa0
267 ; CHECK-NEXT:    .long 4294967224 @ 0xffffffb8
268 ; CHECK-NEXT:    .long 4294967248 @ 0xffffffd0
269 ; CHECK-NEXT:    .long 4294967272 @ 0xffffffe8
270 vector.ph41:                                      ; preds = %for.body6.preheader
271   br label %vector.body39
273 vector.body39:                                    ; preds = %vector.body39, %vector.ph41
274   %index44 = phi i32 [ 0, %vector.ph41 ], [ %index.next45, %vector.body39 ]
275   %vec.ind50 = phi <4 x i32> [ <i32 0, i32 2, i32 4, i32 6>, %vector.ph41 ], [ %vec.ind.next51, %vector.body39 ]
276   %0 = mul nuw nsw <4 x i32> %vec.ind50, <i32 3, i32 3, i32 3, i32 3>
277   %1 = getelementptr inbounds i32, ptr %data, <4 x i32> %0
278   %wide.masked.gather55 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %1, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)
279   %2 = getelementptr inbounds i32, ptr %dst, i32 %index44
280   store <4 x i32> %wide.masked.gather55, ptr %2, align 4
281   %index.next45 = add i32 %index44, 4
282   %vec.ind.next51 = add <4 x i32> %vec.ind50, <i32 8, i32 8, i32 8, i32 8>
283   %3 = icmp eq i32 %index.next45, %n.vec43
284   br i1 %3, label %end, label %vector.body39
286 end:
287   ret void;
290 define arm_aapcs_vfpcc void @gather_inc_v4i32_simple(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n) {
291 ; CHECK-LABEL: gather_inc_v4i32_simple:
292 ; CHECK:       @ %bb.0: @ %entry
293 ; CHECK-NEXT:    cmp r2, #1
294 ; CHECK-NEXT:    it lt
295 ; CHECK-NEXT:    bxlt lr
296 ; CHECK-NEXT:  .LBB8_1: @ %vector.ph.preheader
297 ; CHECK-NEXT:    .save {r4, lr}
298 ; CHECK-NEXT:    push {r4, lr}
299 ; CHECK-NEXT:    bic r12, r2, #3
300 ; CHECK-NEXT:    movs r3, #1
301 ; CHECK-NEXT:    sub.w lr, r12, #4
302 ; CHECK-NEXT:    add.w r4, r3, lr, lsr #2
303 ; CHECK-NEXT:    adr r3, .LCPI8_0
304 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
305 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
306 ; CHECK-NEXT:  .LBB8_2: @ %vector.ph
307 ; CHECK-NEXT:    @ =>This Loop Header: Depth=1
308 ; CHECK-NEXT:    @ Child Loop BB8_3 Depth 2
309 ; CHECK-NEXT:    dls lr, r4
310 ; CHECK-NEXT:    mov r0, r1
311 ; CHECK-NEXT:    vmov q1, q0
312 ; CHECK-NEXT:  .LBB8_3: @ %vector.body
313 ; CHECK-NEXT:    @ Parent Loop BB8_2 Depth=1
314 ; CHECK-NEXT:    @ => This Inner Loop Header: Depth=2
315 ; CHECK-NEXT:    vldrw.u32 q2, [q1, #16]!
316 ; CHECK-NEXT:    vstrb.8 q2, [r0], #16
317 ; CHECK-NEXT:    le lr, .LBB8_3
318 ; CHECK-NEXT:  @ %bb.4: @ %middle.block
319 ; CHECK-NEXT:    @ in Loop: Header=BB8_2 Depth=1
320 ; CHECK-NEXT:    cmp r12, r2
321 ; CHECK-NEXT:    bne .LBB8_2
322 ; CHECK-NEXT:  @ %bb.5:
323 ; CHECK-NEXT:    pop.w {r4, lr}
324 ; CHECK-NEXT:    bx lr
325 ; CHECK-NEXT:    .p2align 4
326 ; CHECK-NEXT:  @ %bb.6:
327 ; CHECK-NEXT:  .LCPI8_0:
328 ; CHECK-NEXT:    .long 4294967280 @ 0xfffffff0
329 ; CHECK-NEXT:    .long 4294967284 @ 0xfffffff4
330 ; CHECK-NEXT:    .long 4294967288 @ 0xfffffff8
331 ; CHECK-NEXT:    .long 4294967292 @ 0xfffffffc
332 entry:
333   %cmp22 = icmp sgt i32 %n, 0
334   br i1 %cmp22, label %vector.ph, label %for.cond.cleanup
336 vector.ph:                                        ; preds = %for.body.preheader
337   %n.vec = and i32 %n, -4
338   br label %vector.body
340 vector.body:                                      ; preds = %vector.body, %vector.ph
341   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
342   %vec.ind = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %vector.ph ], [ %vec.ind.next, %vector.body ]
343   %0 = getelementptr inbounds i32, ptr %data, <4 x i32> %vec.ind
344   %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %0, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)
345   %1 = getelementptr inbounds i32, ptr %dst, i32 %index
346   store <4 x i32> %wide.masked.gather, ptr %1, align 4
347   %index.next = add i32 %index, 4
348   %vec.ind.next = add <4 x i32> %vec.ind, <i32 4, i32 4, i32 4, i32 4>
349   %2 = icmp eq i32 %index.next, %n.vec
350   br i1 %2, label %middle.block, label %vector.body
352 middle.block:                                     ; preds = %vector.body
353   %cmp.n = icmp eq i32 %n.vec, %n
354   br i1 %cmp.n, label %for.cond.cleanup, label %vector.ph
356 for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry
357   ret void
360 define arm_aapcs_vfpcc void @gather_inc_v4i32_complex(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n) {
361 ; CHECK-LABEL: gather_inc_v4i32_complex:
362 ; CHECK:       @ %bb.0: @ %entry
363 ; CHECK-NEXT:    cmp r2, #1
364 ; CHECK-NEXT:    it lt
365 ; CHECK-NEXT:    bxlt lr
366 ; CHECK-NEXT:  .LBB9_1: @ %vector.ph.preheader
367 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
368 ; CHECK-NEXT:    push {r4, r5, r7, lr}
369 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
370 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
371 ; CHECK-NEXT:    bic r12, r2, #3
372 ; CHECK-NEXT:    movs r3, #1
373 ; CHECK-NEXT:    sub.w lr, r12, #4
374 ; CHECK-NEXT:    adr r4, .LCPI9_1
375 ; CHECK-NEXT:    adr r5, .LCPI9_2
376 ; CHECK-NEXT:    vldrw.u32 q1, [r4]
377 ; CHECK-NEXT:    add.w r3, r3, lr, lsr #2
378 ; CHECK-NEXT:    adr.w lr, .LCPI9_0
379 ; CHECK-NEXT:    vldrw.u32 q0, [r5]
380 ; CHECK-NEXT:    vldrw.u32 q2, [lr]
381 ; CHECK-NEXT:    vadd.i32 q1, q1, r0
382 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
383 ; CHECK-NEXT:    vadd.i32 q2, q2, r0
384 ; CHECK-NEXT:  .LBB9_2: @ %vector.ph
385 ; CHECK-NEXT:    @ =>This Loop Header: Depth=1
386 ; CHECK-NEXT:    @ Child Loop BB9_3 Depth 2
387 ; CHECK-NEXT:    dls lr, r3
388 ; CHECK-NEXT:    mov r0, r1
389 ; CHECK-NEXT:    vmov q3, q1
390 ; CHECK-NEXT:    vmov q4, q0
391 ; CHECK-NEXT:    vmov q5, q2
392 ; CHECK-NEXT:  .LBB9_3: @ %vector.body
393 ; CHECK-NEXT:    @ Parent Loop BB9_2 Depth=1
394 ; CHECK-NEXT:    @ => This Inner Loop Header: Depth=2
395 ; CHECK-NEXT:    vldrw.u32 q6, [q5, #48]!
396 ; CHECK-NEXT:    vldrw.u32 q7, [q3, #48]!
397 ; CHECK-NEXT:    vadd.i32 q6, q7, q6
398 ; CHECK-NEXT:    vldrw.u32 q7, [q4, #48]!
399 ; CHECK-NEXT:    vadd.i32 q6, q6, q7
400 ; CHECK-NEXT:    vstrb.8 q6, [r0], #16
401 ; CHECK-NEXT:    le lr, .LBB9_3
402 ; CHECK-NEXT:  @ %bb.4: @ %middle.block
403 ; CHECK-NEXT:    @ in Loop: Header=BB9_2 Depth=1
404 ; CHECK-NEXT:    cmp r12, r2
405 ; CHECK-NEXT:    bne .LBB9_2
406 ; CHECK-NEXT:  @ %bb.5:
407 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
408 ; CHECK-NEXT:    pop.w {r4, r5, r7, lr}
409 ; CHECK-NEXT:    bx lr
410 ; CHECK-NEXT:    .p2align 4
411 ; CHECK-NEXT:  @ %bb.6:
412 ; CHECK-NEXT:  .LCPI9_0:
413 ; CHECK-NEXT:    .long 4294967248 @ 0xffffffd0
414 ; CHECK-NEXT:    .long 4294967260 @ 0xffffffdc
415 ; CHECK-NEXT:    .long 4294967272 @ 0xffffffe8
416 ; CHECK-NEXT:    .long 4294967284 @ 0xfffffff4
417 ; CHECK-NEXT:  .LCPI9_1:
418 ; CHECK-NEXT:    .long 4294967252 @ 0xffffffd4
419 ; CHECK-NEXT:    .long 4294967264 @ 0xffffffe0
420 ; CHECK-NEXT:    .long 4294967276 @ 0xffffffec
421 ; CHECK-NEXT:    .long 4294967288 @ 0xfffffff8
422 ; CHECK-NEXT:  .LCPI9_2:
423 ; CHECK-NEXT:    .long 4294967256 @ 0xffffffd8
424 ; CHECK-NEXT:    .long 4294967268 @ 0xffffffe4
425 ; CHECK-NEXT:    .long 4294967280 @ 0xfffffff0
426 ; CHECK-NEXT:    .long 4294967292 @ 0xfffffffc
427 entry:
428   %cmp22 = icmp sgt i32 %n, 0
429   br i1 %cmp22, label %vector.ph, label %for.cond.cleanup
431 vector.ph:                                        ; preds = %for.body.preheader
432   %n.vec = and i32 %n, -4
433   br label %vector.body
435 vector.body:                                      ; preds = %vector.body, %vector.ph
436   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
437   %vec.ind = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %vector.ph ], [ %vec.ind.next, %vector.body ]
438   %0 = mul nuw nsw <4 x i32> %vec.ind, <i32 3, i32 3, i32 3, i32 3>
439   %1 = getelementptr inbounds i32, ptr %data, <4 x i32> %0
440   %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %1, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)
441   %2 = add nuw nsw <4 x i32> %0, <i32 1, i32 1, i32 1, i32 1>
442   %3 = getelementptr inbounds i32, ptr %data, <4 x i32> %2
443   %wide.masked.gather24 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %3, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)
444   %4 = add nuw nsw <4 x i32> %0, <i32 2, i32 2, i32 2, i32 2>
445   %5 = getelementptr inbounds i32, ptr %data, <4 x i32> %4
446   %wide.masked.gather25 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %5, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)
447   %6 = add nsw <4 x i32> %wide.masked.gather24, %wide.masked.gather
448   %7 = add nsw <4 x i32> %6, %wide.masked.gather25
449   %8 = getelementptr inbounds i32, ptr %dst, i32 %index
450   store <4 x i32> %7, ptr %8, align 4
451   %index.next = add i32 %index, 4
452   %vec.ind.next = add <4 x i32> %vec.ind, <i32 4, i32 4, i32 4, i32 4>
453   %9 = icmp eq i32 %index.next, %n.vec
454   br i1 %9, label %middle.block, label %vector.body
456 middle.block:                                     ; preds = %vector.body
457   %cmp.n = icmp eq i32 %n.vec, %n
458   br i1 %cmp.n, label %for.cond.cleanup, label %vector.ph
460 for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry
461   ret void
464 define arm_aapcs_vfpcc void @gather_inc_v4i32_large(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n) {
465 ; CHECK-LABEL: gather_inc_v4i32_large:
466 ; CHECK:       @ %bb.0: @ %entry
467 ; CHECK-NEXT:    cmp r2, #1
468 ; CHECK-NEXT:    it lt
469 ; CHECK-NEXT:    bxlt lr
470 ; CHECK-NEXT:  .LBB10_1: @ %vector.ph.preheader
471 ; CHECK-NEXT:    .save {r4, lr}
472 ; CHECK-NEXT:    push {r4, lr}
473 ; CHECK-NEXT:    bic r12, r2, #3
474 ; CHECK-NEXT:    movs r3, #1
475 ; CHECK-NEXT:    sub.w lr, r12, #4
476 ; CHECK-NEXT:    add.w r4, r3, lr, lsr #2
477 ; CHECK-NEXT:    adr r3, .LCPI10_0
478 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
479 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
480 ; CHECK-NEXT:  .LBB10_2: @ %vector.ph
481 ; CHECK-NEXT:    @ =>This Loop Header: Depth=1
482 ; CHECK-NEXT:    @ Child Loop BB10_3 Depth 2
483 ; CHECK-NEXT:    dls lr, r4
484 ; CHECK-NEXT:    mov r0, r1
485 ; CHECK-NEXT:    vmov q1, q0
486 ; CHECK-NEXT:  .LBB10_3: @ %vector.body
487 ; CHECK-NEXT:    @ Parent Loop BB10_2 Depth=1
488 ; CHECK-NEXT:    @ => This Inner Loop Header: Depth=2
489 ; CHECK-NEXT:    vldrw.u32 q2, [q1, #508]!
490 ; CHECK-NEXT:    vstrb.8 q2, [r0], #16
491 ; CHECK-NEXT:    le lr, .LBB10_3
492 ; CHECK-NEXT:  @ %bb.4: @ %middle.block
493 ; CHECK-NEXT:    @ in Loop: Header=BB10_2 Depth=1
494 ; CHECK-NEXT:    cmp r12, r2
495 ; CHECK-NEXT:    bne .LBB10_2
496 ; CHECK-NEXT:  @ %bb.5:
497 ; CHECK-NEXT:    pop.w {r4, lr}
498 ; CHECK-NEXT:    bx lr
499 ; CHECK-NEXT:    .p2align 4
500 ; CHECK-NEXT:  @ %bb.6:
501 ; CHECK-NEXT:  .LCPI10_0:
502 ; CHECK-NEXT:    .long 4294966788 @ 0xfffffe04
503 ; CHECK-NEXT:    .long 4294966792 @ 0xfffffe08
504 ; CHECK-NEXT:    .long 4294966796 @ 0xfffffe0c
505 ; CHECK-NEXT:    .long 4294966800 @ 0xfffffe10
506 entry:
507   %cmp22 = icmp sgt i32 %n, 0
508   br i1 %cmp22, label %vector.ph, label %for.cond.cleanup
510 vector.ph:                                        ; preds = %for.body.preheader
511   %n.vec = and i32 %n, -4
512   br label %vector.body
514 vector.body:                                      ; preds = %vector.body, %vector.ph
515   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
516   %vec.ind = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %vector.ph ], [ %vec.ind.next, %vector.body ]
517   %0 = getelementptr inbounds i32, ptr %data, <4 x i32> %vec.ind
518   %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %0, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)
519   %1 = getelementptr inbounds i32, ptr %dst, i32 %index
520   store <4 x i32> %wide.masked.gather, ptr %1, align 4
521   %index.next = add i32 %index, 4
522   %vec.ind.next = add <4 x i32> %vec.ind, <i32 127, i32 127, i32 127, i32 127>
523   %2 = icmp eq i32 %index.next, %n.vec
524   br i1 %2, label %middle.block, label %vector.body
526 middle.block:                                     ; preds = %vector.body
527   %cmp.n = icmp eq i32 %n.vec, %n
528   br i1 %cmp.n, label %for.cond.cleanup, label %vector.ph
530 for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry
531   ret void
534 ; TODO: uneven - I think it's not possible to create such an example, because vec.ind will always be increased by a vector with 4 elements (=> x*4 = even)
536 ; TODO: What is sxth?
537 define arm_aapcs_vfpcc void @gather_inc_v8i16_simple(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n) {
538 ; CHECK-LABEL: gather_inc_v8i16_simple:
539 ; CHECK:       @ %bb.0: @ %entry
540 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
541 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
542 ; CHECK-NEXT:    .pad #28
543 ; CHECK-NEXT:    sub sp, #28
544 ; CHECK-NEXT:    cmp r2, #1
545 ; CHECK-NEXT:    strd r1, r2, [sp, #4] @ 8-byte Folded Spill
546 ; CHECK-NEXT:    blt .LBB11_5
547 ; CHECK-NEXT:  @ %bb.1: @ %vector.ph.preheader
548 ; CHECK-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload
549 ; CHECK-NEXT:    movs r6, #1
550 ; CHECK-NEXT:    add r2, sp, #12
551 ; CHECK-NEXT:    mov.w r9, #8
552 ; CHECK-NEXT:    bic r1, r1, #7
553 ; CHECK-NEXT:    str r1, [sp] @ 4-byte Spill
554 ; CHECK-NEXT:    sub.w r3, r1, #8
555 ; CHECK-NEXT:    add.w r8, r6, r3, lsr #3
556 ; CHECK-NEXT:    adr r3, .LCPI11_0
557 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
558 ; CHECK-NEXT:  .LBB11_2: @ %vector.ph
559 ; CHECK-NEXT:    @ =>This Loop Header: Depth=1
560 ; CHECK-NEXT:    @ Child Loop BB11_3 Depth 2
561 ; CHECK-NEXT:    dls lr, r8
562 ; CHECK-NEXT:    vmov q1, q0
563 ; CHECK-NEXT:    ldr r6, [sp, #4] @ 4-byte Reload
564 ; CHECK-NEXT:  .LBB11_3: @ %vector.body
565 ; CHECK-NEXT:    @ Parent Loop BB11_2 Depth=1
566 ; CHECK-NEXT:    @ => This Inner Loop Header: Depth=2
567 ; CHECK-NEXT:    vstrw.32 q1, [r2]
568 ; CHECK-NEXT:    mov r12, r2
569 ; CHECK-NEXT:    vldrh.s32 q2, [r2, #8]
570 ; CHECK-NEXT:    vadd.i16 q1, q1, r9
571 ; CHECK-NEXT:    vshl.i32 q2, q2, #1
572 ; CHECK-NEXT:    vadd.i32 q2, q2, r0
573 ; CHECK-NEXT:    vmov r7, r5, d5
574 ; CHECK-NEXT:    vmov r3, r4, d4
575 ; CHECK-NEXT:    vldrh.s32 q2, [r2]
576 ; CHECK-NEXT:    vshl.i32 q2, q2, #1
577 ; CHECK-NEXT:    vadd.i32 q2, q2, r0
578 ; CHECK-NEXT:    vmov r1, r10, d5
579 ; CHECK-NEXT:    ldrh r7, [r7]
580 ; CHECK-NEXT:    ldrh r4, [r4]
581 ; CHECK-NEXT:    ldrh r5, [r5]
582 ; CHECK-NEXT:    ldrh.w r2, [r10]
583 ; CHECK-NEXT:    ldrh.w r10, [r3]
584 ; CHECK-NEXT:    vmov r3, r11, d4
585 ; CHECK-NEXT:    ldrh r1, [r1]
586 ; CHECK-NEXT:    ldrh r3, [r3]
587 ; CHECK-NEXT:    ldrh.w r11, [r11]
588 ; CHECK-NEXT:    vmov.16 q2[0], r3
589 ; CHECK-NEXT:    vmov.16 q2[1], r11
590 ; CHECK-NEXT:    vmov.16 q2[2], r1
591 ; CHECK-NEXT:    vmov.16 q2[3], r2
592 ; CHECK-NEXT:    mov r2, r12
593 ; CHECK-NEXT:    vmov.16 q2[4], r10
594 ; CHECK-NEXT:    vmov.16 q2[5], r4
595 ; CHECK-NEXT:    vmov.16 q2[6], r7
596 ; CHECK-NEXT:    vmov.16 q2[7], r5
597 ; CHECK-NEXT:    vstrb.8 q2, [r6], #16
598 ; CHECK-NEXT:    le lr, .LBB11_3
599 ; CHECK-NEXT:  @ %bb.4: @ %middle.block
600 ; CHECK-NEXT:    @ in Loop: Header=BB11_2 Depth=1
601 ; CHECK-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload
602 ; CHECK-NEXT:    ldr r3, [sp] @ 4-byte Reload
603 ; CHECK-NEXT:    cmp r3, r1
604 ; CHECK-NEXT:    bne .LBB11_2
605 ; CHECK-NEXT:  .LBB11_5: @ %for.cond.cleanup
606 ; CHECK-NEXT:    add sp, #28
607 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
608 ; CHECK-NEXT:    .p2align 4
609 ; CHECK-NEXT:  @ %bb.6:
610 ; CHECK-NEXT:  .LCPI11_0:
611 ; CHECK-NEXT:    .short 0 @ 0x0
612 ; CHECK-NEXT:    .short 1 @ 0x1
613 ; CHECK-NEXT:    .short 2 @ 0x2
614 ; CHECK-NEXT:    .short 3 @ 0x3
615 ; CHECK-NEXT:    .short 4 @ 0x4
616 ; CHECK-NEXT:    .short 5 @ 0x5
617 ; CHECK-NEXT:    .short 6 @ 0x6
618 ; CHECK-NEXT:    .short 7 @ 0x7
621 entry:
622   %cmp22 = icmp sgt i32 %n, 0
623   br i1 %cmp22, label %vector.ph, label %for.cond.cleanup
625 vector.ph:                                        ; preds = %for.body.preheader
626   %n.vec = and i32 %n, -8
627   br label %vector.body
629 vector.body:                                      ; preds = %vector.body, %vector.ph
630   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
631   %vec.ind = phi <8 x i16> [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, %vector.ph ], [ %vec.ind.next, %vector.body ]
632   %0 = getelementptr inbounds i16, ptr %data, <8 x i16> %vec.ind
633   %wide.masked.gather = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %0, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)
634   %1 = getelementptr inbounds i16, ptr %dst, i32 %index
635   store <8 x i16> %wide.masked.gather, ptr %1, align 2
636   %index.next = add i32 %index, 8
637   %vec.ind.next = add <8 x i16> %vec.ind, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
638   %2 = icmp eq i32 %index.next, %n.vec
639   br i1 %2, label %middle.block, label %vector.body
641 middle.block:                                     ; preds = %vector.body
642   %cmp.n = icmp eq i32 %n.vec, %n
643   br i1 %cmp.n, label %for.cond.cleanup, label %vector.ph
645 for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry
646   ret void
649 ; TODO: This looks absolutely terrifying :(
650 define arm_aapcs_vfpcc void @gather_inc_v8i16_complex(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n) {
651 ; CHECK-LABEL: gather_inc_v8i16_complex:
652 ; CHECK:       @ %bb.0: @ %entry
653 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
654 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
655 ; CHECK-NEXT:    .pad #4
656 ; CHECK-NEXT:    sub sp, #4
657 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
658 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
659 ; CHECK-NEXT:    .pad #136
660 ; CHECK-NEXT:    sub sp, #136
661 ; CHECK-NEXT:    cmp r2, #1
662 ; CHECK-NEXT:    strd r1, r2, [sp, #64] @ 8-byte Folded Spill
663 ; CHECK-NEXT:    blt.w .LBB12_5
664 ; CHECK-NEXT:  @ %bb.1: @ %vector.ph.preheader
665 ; CHECK-NEXT:    ldr r1, [sp, #68] @ 4-byte Reload
666 ; CHECK-NEXT:    adr r3, .LCPI12_2
667 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
668 ; CHECK-NEXT:    movs r2, #1
669 ; CHECK-NEXT:    bic r1, r1, #7
670 ; CHECK-NEXT:    str r1, [sp, #4] @ 4-byte Spill
671 ; CHECK-NEXT:    subs r1, #8
672 ; CHECK-NEXT:    vstrw.32 q0, [sp, #40] @ 16-byte Spill
673 ; CHECK-NEXT:    vmov.i16 q2, #0x18
674 ; CHECK-NEXT:    add.w r1, r2, r1, lsr #3
675 ; CHECK-NEXT:    str r1, [sp, #60] @ 4-byte Spill
676 ; CHECK-NEXT:    adr r1, .LCPI12_0
677 ; CHECK-NEXT:    adr r2, .LCPI12_1
678 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
679 ; CHECK-NEXT:    vstrw.32 q2, [sp, #72] @ 16-byte Spill
680 ; CHECK-NEXT:    vstrw.32 q0, [sp, #24] @ 16-byte Spill
681 ; CHECK-NEXT:    vldrw.u32 q0, [r2]
682 ; CHECK-NEXT:    add r2, sp, #120
683 ; CHECK-NEXT:    vstrw.32 q0, [sp, #8] @ 16-byte Spill
684 ; CHECK-NEXT:  .LBB12_2: @ %vector.ph
685 ; CHECK-NEXT:    @ =>This Loop Header: Depth=1
686 ; CHECK-NEXT:    @ Child Loop BB12_3 Depth 2
687 ; CHECK-NEXT:    ldr r1, [sp, #60] @ 4-byte Reload
688 ; CHECK-NEXT:    add.w r10, sp, #104
689 ; CHECK-NEXT:    dls lr, r1
690 ; CHECK-NEXT:    ldr r7, [sp, #64] @ 4-byte Reload
691 ; CHECK-NEXT:    vldrw.u32 q4, [sp, #24] @ 16-byte Reload
692 ; CHECK-NEXT:    vldrw.u32 q5, [sp, #40] @ 16-byte Reload
693 ; CHECK-NEXT:    vldrw.u32 q6, [sp, #8] @ 16-byte Reload
694 ; CHECK-NEXT:  .LBB12_3: @ %vector.body
695 ; CHECK-NEXT:    @ Parent Loop BB12_2 Depth=1
696 ; CHECK-NEXT:    @ => This Inner Loop Header: Depth=2
697 ; CHECK-NEXT:    vstrw.32 q5, [r2]
698 ; CHECK-NEXT:    mov r8, r2
699 ; CHECK-NEXT:    vldrh.s32 q0, [r2, #8]
700 ; CHECK-NEXT:    vshl.i32 q0, q0, #1
701 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
702 ; CHECK-NEXT:    vmov r1, r3, d0
703 ; CHECK-NEXT:    vmov r4, r5, d1
704 ; CHECK-NEXT:    vldrh.s32 q0, [r2]
705 ; CHECK-NEXT:    vshl.i32 q0, q0, #1
706 ; CHECK-NEXT:    vadd.i32 q2, q0, r0
707 ; CHECK-NEXT:    vmov r6, r2, d4
708 ; CHECK-NEXT:    ldrh r1, [r1]
709 ; CHECK-NEXT:    ldrh.w r12, [r4]
710 ; CHECK-NEXT:    add r4, sp, #88
711 ; CHECK-NEXT:    ldrh.w r11, [r5]
712 ; CHECK-NEXT:    ldrh r3, [r3]
713 ; CHECK-NEXT:    ldrh r5, [r6]
714 ; CHECK-NEXT:    ldrh r2, [r2]
715 ; CHECK-NEXT:    vstrw.32 q6, [r4]
716 ; CHECK-NEXT:    vldrh.s32 q0, [r4]
717 ; CHECK-NEXT:    vmov.16 q7[0], r5
718 ; CHECK-NEXT:    vmov.16 q7[1], r2
719 ; CHECK-NEXT:    vshl.i32 q0, q0, #1
720 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
721 ; CHECK-NEXT:    vmov r6, r9, d0
722 ; CHECK-NEXT:    vmov r2, r5, d1
723 ; CHECK-NEXT:    vldrh.s32 q0, [r4, #8]
724 ; CHECK-NEXT:    vshl.i32 q0, q0, #1
725 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
726 ; CHECK-NEXT:    ldrh r6, [r6]
727 ; CHECK-NEXT:    ldrh r2, [r2]
728 ; CHECK-NEXT:    vmov.16 q1[0], r6
729 ; CHECK-NEXT:    ldrh.w r6, [r9]
730 ; CHECK-NEXT:    ldrh r5, [r5]
731 ; CHECK-NEXT:    vmov.16 q1[1], r6
732 ; CHECK-NEXT:    vmov.16 q1[2], r2
733 ; CHECK-NEXT:    vmov r2, r6, d0
734 ; CHECK-NEXT:    vmov.16 q1[3], r5
735 ; CHECK-NEXT:    ldrh r2, [r2]
736 ; CHECK-NEXT:    ldrh r6, [r6]
737 ; CHECK-NEXT:    vmov.16 q1[4], r2
738 ; CHECK-NEXT:    vmov r2, r5, d1
739 ; CHECK-NEXT:    vmov.16 q1[5], r6
740 ; CHECK-NEXT:    mov r6, r10
741 ; CHECK-NEXT:    ldrh r2, [r2]
742 ; CHECK-NEXT:    ldrh r5, [r5]
743 ; CHECK-NEXT:    vstrw.32 q4, [r10]
744 ; CHECK-NEXT:    vldrh.s32 q0, [r6]
745 ; CHECK-NEXT:    vmov.16 q1[6], r2
746 ; CHECK-NEXT:    vmov.16 q1[7], r5
747 ; CHECK-NEXT:    vshl.i32 q0, q0, #1
748 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
749 ; CHECK-NEXT:    vmov r2, r5, d0
750 ; CHECK-NEXT:    ldrh r2, [r2]
751 ; CHECK-NEXT:    ldrh r5, [r5]
752 ; CHECK-NEXT:    vmov.16 q3[0], r2
753 ; CHECK-NEXT:    vmov.16 q3[1], r5
754 ; CHECK-NEXT:    vmov r2, r5, d5
755 ; CHECK-NEXT:    vldrw.u32 q2, [sp, #72] @ 16-byte Reload
756 ; CHECK-NEXT:    vadd.i16 q6, q6, q2
757 ; CHECK-NEXT:    vadd.i16 q5, q5, q2
758 ; CHECK-NEXT:    vadd.i16 q4, q4, q2
759 ; CHECK-NEXT:    ldrh.w r9, [r2]
760 ; CHECK-NEXT:    vmov r2, r4, d1
761 ; CHECK-NEXT:    vldrh.s32 q0, [r6, #8]
762 ; CHECK-NEXT:    ldrh r5, [r5]
763 ; CHECK-NEXT:    vmov.16 q7[2], r9
764 ; CHECK-NEXT:    vshl.i32 q0, q0, #1
765 ; CHECK-NEXT:    vmov.16 q7[3], r5
766 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
767 ; CHECK-NEXT:    vmov.16 q7[4], r1
768 ; CHECK-NEXT:    vmov.16 q7[5], r3
769 ; CHECK-NEXT:    vmov.16 q7[6], r12
770 ; CHECK-NEXT:    vmov.16 q7[7], r11
771 ; CHECK-NEXT:    ldrh r2, [r2]
772 ; CHECK-NEXT:    ldrh r4, [r4]
773 ; CHECK-NEXT:    vmov.16 q3[2], r2
774 ; CHECK-NEXT:    vmov.16 q3[3], r4
775 ; CHECK-NEXT:    vmov r2, r4, d0
776 ; CHECK-NEXT:    ldrh r2, [r2]
777 ; CHECK-NEXT:    ldrh r4, [r4]
778 ; CHECK-NEXT:    vmov.16 q3[4], r2
779 ; CHECK-NEXT:    vmov.16 q3[5], r4
780 ; CHECK-NEXT:    vmov r2, r4, d1
781 ; CHECK-NEXT:    ldrh r2, [r2]
782 ; CHECK-NEXT:    ldrh r4, [r4]
783 ; CHECK-NEXT:    vmov.16 q3[6], r2
784 ; CHECK-NEXT:    mov r2, r8
785 ; CHECK-NEXT:    vmov.16 q3[7], r4
786 ; CHECK-NEXT:    vadd.i16 q0, q3, q1
787 ; CHECK-NEXT:    vadd.i16 q0, q0, q7
788 ; CHECK-NEXT:    vstrb.8 q0, [r7], #16
789 ; CHECK-NEXT:    le lr, .LBB12_3
790 ; CHECK-NEXT:  @ %bb.4: @ %middle.block
791 ; CHECK-NEXT:    @ in Loop: Header=BB12_2 Depth=1
792 ; CHECK-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
793 ; CHECK-NEXT:    ldr r3, [sp, #68] @ 4-byte Reload
794 ; CHECK-NEXT:    cmp r1, r3
795 ; CHECK-NEXT:    bne.w .LBB12_2
796 ; CHECK-NEXT:  .LBB12_5: @ %for.cond.cleanup
797 ; CHECK-NEXT:    add sp, #136
798 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
799 ; CHECK-NEXT:    add sp, #4
800 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
801 ; CHECK-NEXT:    .p2align 4
802 ; CHECK-NEXT:  @ %bb.6:
803 ; CHECK-NEXT:  .LCPI12_0:
804 ; CHECK-NEXT:    .short 1 @ 0x1
805 ; CHECK-NEXT:    .short 4 @ 0x4
806 ; CHECK-NEXT:    .short 7 @ 0x7
807 ; CHECK-NEXT:    .short 10 @ 0xa
808 ; CHECK-NEXT:    .short 13 @ 0xd
809 ; CHECK-NEXT:    .short 16 @ 0x10
810 ; CHECK-NEXT:    .short 19 @ 0x13
811 ; CHECK-NEXT:    .short 22 @ 0x16
812 ; CHECK-NEXT:  .LCPI12_1:
813 ; CHECK-NEXT:    .short 0 @ 0x0
814 ; CHECK-NEXT:    .short 3 @ 0x3
815 ; CHECK-NEXT:    .short 6 @ 0x6
816 ; CHECK-NEXT:    .short 9 @ 0x9
817 ; CHECK-NEXT:    .short 12 @ 0xc
818 ; CHECK-NEXT:    .short 15 @ 0xf
819 ; CHECK-NEXT:    .short 18 @ 0x12
820 ; CHECK-NEXT:    .short 21 @ 0x15
821 ; CHECK-NEXT:  .LCPI12_2:
822 ; CHECK-NEXT:    .short 2 @ 0x2
823 ; CHECK-NEXT:    .short 5 @ 0x5
824 ; CHECK-NEXT:    .short 8 @ 0x8
825 ; CHECK-NEXT:    .short 11 @ 0xb
826 ; CHECK-NEXT:    .short 14 @ 0xe
827 ; CHECK-NEXT:    .short 17 @ 0x11
828 ; CHECK-NEXT:    .short 20 @ 0x14
829 ; CHECK-NEXT:    .short 23 @ 0x17
832 entry:
833   %cmp22 = icmp sgt i32 %n, 0
834   br i1 %cmp22, label %vector.ph, label %for.cond.cleanup
836 vector.ph:                                        ; preds = %for.body.preheader
837   %n.vec = and i32 %n, -8
838   br label %vector.body
840 vector.body:                                      ; preds = %vector.body, %vector.ph
841   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
842   %vec.ind = phi <8 x i16> [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, %vector.ph ], [ %vec.ind.next, %vector.body ]
843   %0 = mul nuw nsw <8 x i16> %vec.ind, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
844   %1 = getelementptr inbounds i16, ptr %data, <8 x i16> %0
845   %wide.masked.gather = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %1, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)
846   %2 = add nuw nsw <8 x i16> %0, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
847   %3 = getelementptr inbounds i16, ptr %data, <8 x i16> %2
848   %wide.masked.gather24 = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %3, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)
849   %4 = add nuw nsw <8 x i16> %0, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
850   %5 = getelementptr inbounds i16, ptr %data, <8 x i16> %4
851   %wide.masked.gather25 = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %5, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)
852   %6 = add nsw <8 x i16> %wide.masked.gather24, %wide.masked.gather
853   %7 = add nsw <8 x i16> %6, %wide.masked.gather25
854   %8 = getelementptr inbounds i16, ptr %dst, i32 %index
855   store <8 x i16> %7, ptr %8, align 2
856   %index.next = add i32 %index, 8
857   %vec.ind.next = add <8 x i16> %vec.ind, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
858   %9 = icmp eq i32 %index.next, %n.vec
859   br i1 %9, label %middle.block, label %vector.body
861 middle.block:                                     ; preds = %vector.body
862   %cmp.n = icmp eq i32 %n.vec, %n
863   br i1 %cmp.n, label %for.cond.cleanup, label %vector.ph
865 for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry
866   ret void
870 define arm_aapcs_vfpcc void @gather_inc_v16i8_complex(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n) {
871 ; CHECK-LABEL: gather_inc_v16i8_complex:
872 ; CHECK:       @ %bb.0: @ %entry
873 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
874 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
875 ; CHECK-NEXT:    .pad #4
876 ; CHECK-NEXT:    sub sp, #4
877 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
878 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
879 ; CHECK-NEXT:    .pad #312
880 ; CHECK-NEXT:    sub sp, #312
881 ; CHECK-NEXT:    cmp r2, #1
882 ; CHECK-NEXT:    str r1, [sp, #116] @ 4-byte Spill
883 ; CHECK-NEXT:    blt.w .LBB13_5
884 ; CHECK-NEXT:  @ %bb.1: @ %vector.ph.preheader
885 ; CHECK-NEXT:    adr r1, .LCPI13_0
886 ; CHECK-NEXT:    adr r6, .LCPI13_8
887 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
888 ; CHECK-NEXT:    adr r1, .LCPI13_1
889 ; CHECK-NEXT:    adr r7, .LCPI13_7
890 ; CHECK-NEXT:    adr r3, .LCPI13_6
891 ; CHECK-NEXT:    vstrw.32 q0, [sp, #96] @ 16-byte Spill
892 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
893 ; CHECK-NEXT:    adr r1, .LCPI13_5
894 ; CHECK-NEXT:    bic r10, r2, #7
895 ; CHECK-NEXT:    vstrw.32 q0, [sp, #80] @ 16-byte Spill
896 ; CHECK-NEXT:    vldrw.u32 q0, [r6]
897 ; CHECK-NEXT:    adr r6, .LCPI13_9
898 ; CHECK-NEXT:    vmov.i32 q2, #0x30
899 ; CHECK-NEXT:    vstrw.32 q0, [sp, #64] @ 16-byte Spill
900 ; CHECK-NEXT:    vldrw.u32 q0, [r7]
901 ; CHECK-NEXT:    vstrw.32 q0, [sp, #48] @ 16-byte Spill
902 ; CHECK-NEXT:    vldrw.u32 q0, [r6]
903 ; CHECK-NEXT:    vstrw.32 q0, [sp, #32] @ 16-byte Spill
904 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
905 ; CHECK-NEXT:    vstrw.32 q0, [sp, #16] @ 16-byte Spill
906 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
907 ; CHECK-NEXT:    vstrw.32 q0, [sp] @ 16-byte Spill
908 ; CHECK-NEXT:  .LBB13_2: @ %vector.ph
909 ; CHECK-NEXT:    @ =>This Loop Header: Depth=1
910 ; CHECK-NEXT:    @ Child Loop BB13_3 Depth 2
911 ; CHECK-NEXT:    adr r1, .LCPI13_3
912 ; CHECK-NEXT:    vldrw.u32 q6, [sp, #16] @ 16-byte Reload
913 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
914 ; CHECK-NEXT:    adr r1, .LCPI13_4
915 ; CHECK-NEXT:    vldrw.u32 q5, [r1]
916 ; CHECK-NEXT:    adr r1, .LCPI13_2
917 ; CHECK-NEXT:    vldrw.u32 q3, [r1]
918 ; CHECK-NEXT:    adr r1, .LCPI13_10
919 ; CHECK-NEXT:    vstrw.32 q6, [sp, #280] @ 16-byte Spill
920 ; CHECK-NEXT:    vldrw.u32 q6, [sp, #32] @ 16-byte Reload
921 ; CHECK-NEXT:    vstrw.32 q3, [sp, #296] @ 16-byte Spill
922 ; CHECK-NEXT:    vldrw.u32 q3, [r1]
923 ; CHECK-NEXT:    adr r1, .LCPI13_11
924 ; CHECK-NEXT:    ldr.w r8, [sp, #116] @ 4-byte Reload
925 ; CHECK-NEXT:    vstrw.32 q3, [sp, #248] @ 16-byte Spill
926 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #80] @ 16-byte Reload
927 ; CHECK-NEXT:    vstrw.32 q6, [sp, #264] @ 16-byte Spill
928 ; CHECK-NEXT:    vldrw.u32 q6, [sp, #48] @ 16-byte Reload
929 ; CHECK-NEXT:    vstrw.32 q3, [sp, #216] @ 16-byte Spill
930 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #64] @ 16-byte Reload
931 ; CHECK-NEXT:    vldrw.u32 q7, [r1]
932 ; CHECK-NEXT:    vldrw.u32 q1, [sp] @ 16-byte Reload
933 ; CHECK-NEXT:    vstrw.32 q3, [sp, #200] @ 16-byte Spill
934 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #96] @ 16-byte Reload
935 ; CHECK-NEXT:    mov r11, r10
936 ; CHECK-NEXT:    vstrw.32 q6, [sp, #232] @ 16-byte Spill
937 ; CHECK-NEXT:    vstrw.32 q3, [sp, #184] @ 16-byte Spill
938 ; CHECK-NEXT:  .LBB13_3: @ %vector.body
939 ; CHECK-NEXT:    @ Parent Loop BB13_2 Depth=1
940 ; CHECK-NEXT:    @ => This Inner Loop Header: Depth=2
941 ; CHECK-NEXT:    vadd.i32 q4, q1, r0
942 ; CHECK-NEXT:    vstrw.32 q7, [sp, #136] @ 16-byte Spill
943 ; CHECK-NEXT:    vmov r1, lr, d8
944 ; CHECK-NEXT:    vadd.i32 q7, q7, r0
945 ; CHECK-NEXT:    vmov r5, r4, d15
946 ; CHECK-NEXT:    vadd.i32 q6, q0, r0
947 ; CHECK-NEXT:    vmov r6, r7, d13
948 ; CHECK-NEXT:    vstrw.32 q1, [sp, #152] @ 16-byte Spill
949 ; CHECK-NEXT:    vldrw.u32 q1, [sp, #296] @ 16-byte Reload
950 ; CHECK-NEXT:    vstrw.32 q0, [sp, #168] @ 16-byte Spill
951 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #248] @ 16-byte Reload
952 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #216] @ 16-byte Reload
953 ; CHECK-NEXT:    vadd.i32 q1, q1, r0
954 ; CHECK-NEXT:    vstrw.32 q5, [sp, #120] @ 16-byte Spill
955 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
956 ; CHECK-NEXT:    subs.w r11, r11, #16
957 ; CHECK-NEXT:    ldrb.w r9, [r1]
958 ; CHECK-NEXT:    vmov r1, r3, d14
959 ; CHECK-NEXT:    ldrb r5, [r5]
960 ; CHECK-NEXT:    ldrb r7, [r7]
961 ; CHECK-NEXT:    ldrb r1, [r1]
962 ; CHECK-NEXT:    vmov.8 q7[0], r1
963 ; CHECK-NEXT:    ldrb r1, [r3]
964 ; CHECK-NEXT:    vmov.8 q7[1], r1
965 ; CHECK-NEXT:    vmov r1, r3, d12
966 ; CHECK-NEXT:    vmov.8 q7[2], r5
967 ; CHECK-NEXT:    ldrb r5, [r6]
968 ; CHECK-NEXT:    ldrb r6, [r4]
969 ; CHECK-NEXT:    vmov.8 q7[3], r6
970 ; CHECK-NEXT:    ldrb r1, [r1]
971 ; CHECK-NEXT:    ldrb r3, [r3]
972 ; CHECK-NEXT:    vmov.8 q6[0], r1
973 ; CHECK-NEXT:    vmov r6, r1, d2
974 ; CHECK-NEXT:    vmov.8 q6[1], r3
975 ; CHECK-NEXT:    vmov.8 q6[2], r5
976 ; CHECK-NEXT:    vmov.8 q6[3], r7
977 ; CHECK-NEXT:    ldrb.w r7, [lr]
978 ; CHECK-NEXT:    vmov.8 q6[4], r9
979 ; CHECK-NEXT:    vmov.8 q6[5], r7
980 ; CHECK-NEXT:    ldrb r4, [r1]
981 ; CHECK-NEXT:    vmov r1, r5, d3
982 ; CHECK-NEXT:    vldrw.u32 q1, [sp, #232] @ 16-byte Reload
983 ; CHECK-NEXT:    ldrb.w r12, [r1]
984 ; CHECK-NEXT:    vmov r1, r3, d9
985 ; CHECK-NEXT:    ldrb r5, [r5]
986 ; CHECK-NEXT:    vldrw.u32 q4, [sp, #184] @ 16-byte Reload
987 ; CHECK-NEXT:    ldrb r1, [r1]
988 ; CHECK-NEXT:    ldrb r3, [r3]
989 ; CHECK-NEXT:    vmov.8 q6[6], r1
990 ; CHECK-NEXT:    vmov r1, r7, d0
991 ; CHECK-NEXT:    vmov.8 q6[7], r3
992 ; CHECK-NEXT:    ldrb r1, [r1]
993 ; CHECK-NEXT:    ldrb r7, [r7]
994 ; CHECK-NEXT:    vmov.8 q7[4], r1
995 ; CHECK-NEXT:    vmov r1, r3, d1
996 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #264] @ 16-byte Reload
997 ; CHECK-NEXT:    vmov.8 q7[5], r7
998 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
999 ; CHECK-NEXT:    ldrb r1, [r1]
1000 ; CHECK-NEXT:    ldrb r3, [r3]
1001 ; CHECK-NEXT:    vmov.8 q7[6], r1
1002 ; CHECK-NEXT:    ldrb r1, [r6]
1003 ; CHECK-NEXT:    vmov r7, r6, d0
1004 ; CHECK-NEXT:    vmov.8 q7[7], r3
1005 ; CHECK-NEXT:    vmov r3, lr, d1
1006 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #280] @ 16-byte Reload
1007 ; CHECK-NEXT:    vmov.8 q7[8], r1
1008 ; CHECK-NEXT:    vadd.i32 q0, q0, r0
1009 ; CHECK-NEXT:    vmov.8 q7[9], r4
1010 ; CHECK-NEXT:    vmov r4, r1, d0
1011 ; CHECK-NEXT:    vmov.8 q7[10], r12
1012 ; CHECK-NEXT:    vmov.8 q7[11], r5
1013 ; CHECK-NEXT:    ldrb r7, [r7]
1014 ; CHECK-NEXT:    ldrb r6, [r6]
1015 ; CHECK-NEXT:    ldrb r3, [r3]
1016 ; CHECK-NEXT:    ldrb r4, [r4]
1017 ; CHECK-NEXT:    ldrb r1, [r1]
1018 ; CHECK-NEXT:    vmov.8 q6[8], r4
1019 ; CHECK-NEXT:    vmov r5, r4, d1
1020 ; CHECK-NEXT:    vmov.8 q6[9], r1
1021 ; CHECK-NEXT:    vadd.i32 q0, q5, r0
1022 ; CHECK-NEXT:    vldrw.u32 q5, [sp, #200] @ 16-byte Reload
1023 ; CHECK-NEXT:    ldrb r5, [r5]
1024 ; CHECK-NEXT:    ldrb r4, [r4]
1025 ; CHECK-NEXT:    vmov.8 q6[10], r5
1026 ; CHECK-NEXT:    vmov.8 q6[11], r4
1027 ; CHECK-NEXT:    vmov.8 q6[12], r7
1028 ; CHECK-NEXT:    vmov.8 q6[13], r6
1029 ; CHECK-NEXT:    vmov.8 q6[14], r3
1030 ; CHECK-NEXT:    vmov r1, r3, d0
1031 ; CHECK-NEXT:    ldrb r1, [r1]
1032 ; CHECK-NEXT:    vmov.8 q7[12], r1
1033 ; CHECK-NEXT:    ldrb r1, [r3]
1034 ; CHECK-NEXT:    vmov.8 q7[13], r1
1035 ; CHECK-NEXT:    vmov r1, r3, d1
1036 ; CHECK-NEXT:    vadd.i32 q0, q1, r0
1037 ; CHECK-NEXT:    vadd.i32 q1, q1, q2
1038 ; CHECK-NEXT:    vstrw.32 q1, [sp, #232] @ 16-byte Spill
1039 ; CHECK-NEXT:    vldrw.u32 q1, [sp, #248] @ 16-byte Reload
1040 ; CHECK-NEXT:    vadd.i32 q1, q1, q2
1041 ; CHECK-NEXT:    vstrw.32 q1, [sp, #248] @ 16-byte Spill
1042 ; CHECK-NEXT:    vldrw.u32 q1, [sp, #152] @ 16-byte Reload
1043 ; CHECK-NEXT:    vadd.i32 q1, q1, q2
1044 ; CHECK-NEXT:    ldrb r1, [r1]
1045 ; CHECK-NEXT:    vmov.8 q7[14], r1
1046 ; CHECK-NEXT:    ldrb r1, [r3]
1047 ; CHECK-NEXT:    vmov.8 q7[15], r1
1048 ; CHECK-NEXT:    ldrb.w r1, [lr]
1049 ; CHECK-NEXT:    vmov.8 q6[15], r1
1050 ; CHECK-NEXT:    vmov r1, r3, d0
1051 ; CHECK-NEXT:    vadd.i8 q6, q6, q7
1052 ; CHECK-NEXT:    ldrb r1, [r1]
1053 ; CHECK-NEXT:    ldrb r3, [r3]
1054 ; CHECK-NEXT:    vmov.8 q7[0], r1
1055 ; CHECK-NEXT:    vmov.8 q7[1], r3
1056 ; CHECK-NEXT:    vmov r1, r3, d1
1057 ; CHECK-NEXT:    vadd.i32 q0, q3, r0
1058 ; CHECK-NEXT:    vadd.i32 q3, q3, q2
1059 ; CHECK-NEXT:    vstrw.32 q3, [sp, #216] @ 16-byte Spill
1060 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #296] @ 16-byte Reload
1061 ; CHECK-NEXT:    vadd.i32 q3, q3, q2
1062 ; CHECK-NEXT:    vstrw.32 q3, [sp, #296] @ 16-byte Spill
1063 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #280] @ 16-byte Reload
1064 ; CHECK-NEXT:    vadd.i32 q3, q3, q2
1065 ; CHECK-NEXT:    vstrw.32 q3, [sp, #280] @ 16-byte Spill
1066 ; CHECK-NEXT:    vldrw.u32 q3, [sp, #264] @ 16-byte Reload
1067 ; CHECK-NEXT:    vadd.i32 q3, q3, q2
1068 ; CHECK-NEXT:    vstrw.32 q3, [sp, #264] @ 16-byte Spill
1069 ; CHECK-NEXT:    ldrb r1, [r1]
1070 ; CHECK-NEXT:    vmov.8 q7[2], r1
1071 ; CHECK-NEXT:    ldrb r1, [r3]
1072 ; CHECK-NEXT:    vmov.8 q7[3], r1
1073 ; CHECK-NEXT:    vmov r1, r3, d0
1074 ; CHECK-NEXT:    ldrb r1, [r1]
1075 ; CHECK-NEXT:    vmov.8 q7[4], r1
1076 ; CHECK-NEXT:    ldrb r1, [r3]
1077 ; CHECK-NEXT:    vmov.8 q7[5], r1
1078 ; CHECK-NEXT:    vmov r1, r3, d1
1079 ; CHECK-NEXT:    vadd.i32 q0, q5, r0
1080 ; CHECK-NEXT:    vadd.i32 q5, q5, q2
1081 ; CHECK-NEXT:    vstrw.32 q5, [sp, #200] @ 16-byte Spill
1082 ; CHECK-NEXT:    vldrw.u32 q5, [sp, #120] @ 16-byte Reload
1083 ; CHECK-NEXT:    vadd.i32 q5, q5, q2
1084 ; CHECK-NEXT:    ldrb r1, [r1]
1085 ; CHECK-NEXT:    vmov.8 q7[6], r1
1086 ; CHECK-NEXT:    ldrb r1, [r3]
1087 ; CHECK-NEXT:    vmov.8 q7[7], r1
1088 ; CHECK-NEXT:    vmov r1, r3, d0
1089 ; CHECK-NEXT:    ldrb r1, [r1]
1090 ; CHECK-NEXT:    vmov.8 q7[8], r1
1091 ; CHECK-NEXT:    ldrb r1, [r3]
1092 ; CHECK-NEXT:    vmov.8 q7[9], r1
1093 ; CHECK-NEXT:    vmov r1, r3, d1
1094 ; CHECK-NEXT:    vadd.i32 q0, q4, r0
1095 ; CHECK-NEXT:    vadd.i32 q4, q4, q2
1096 ; CHECK-NEXT:    vstrw.32 q4, [sp, #184] @ 16-byte Spill
1097 ; CHECK-NEXT:    ldrb r1, [r1]
1098 ; CHECK-NEXT:    vmov.8 q7[10], r1
1099 ; CHECK-NEXT:    ldrb r1, [r3]
1100 ; CHECK-NEXT:    vmov.8 q7[11], r1
1101 ; CHECK-NEXT:    vmov r1, r3, d0
1102 ; CHECK-NEXT:    ldrb r1, [r1]
1103 ; CHECK-NEXT:    vmov.8 q7[12], r1
1104 ; CHECK-NEXT:    ldrb r1, [r3]
1105 ; CHECK-NEXT:    vmov.8 q7[13], r1
1106 ; CHECK-NEXT:    vmov r1, r3, d1
1107 ; CHECK-NEXT:    ldrb r1, [r1]
1108 ; CHECK-NEXT:    vmov.8 q7[14], r1
1109 ; CHECK-NEXT:    ldrb r1, [r3]
1110 ; CHECK-NEXT:    vmov.8 q7[15], r1
1111 ; CHECK-NEXT:    vadd.i8 q0, q6, q7
1112 ; CHECK-NEXT:    vldrw.u32 q7, [sp, #136] @ 16-byte Reload
1113 ; CHECK-NEXT:    vstrb.8 q0, [r8], #16
1114 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #168] @ 16-byte Reload
1115 ; CHECK-NEXT:    vadd.i32 q7, q7, q2
1116 ; CHECK-NEXT:    vadd.i32 q0, q0, q2
1117 ; CHECK-NEXT:    bne.w .LBB13_3
1118 ; CHECK-NEXT:  @ %bb.4: @ %middle.block
1119 ; CHECK-NEXT:    @ in Loop: Header=BB13_2 Depth=1
1120 ; CHECK-NEXT:    cmp r10, r2
1121 ; CHECK-NEXT:    bne.w .LBB13_2
1122 ; CHECK-NEXT:  .LBB13_5: @ %for.cond.cleanup
1123 ; CHECK-NEXT:    add sp, #312
1124 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
1125 ; CHECK-NEXT:    add sp, #4
1126 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
1127 ; CHECK-NEXT:    .p2align 4
1128 ; CHECK-NEXT:  @ %bb.6:
1129 ; CHECK-NEXT:  .LCPI13_0:
1130 ; CHECK-NEXT:    .long 38 @ 0x26
1131 ; CHECK-NEXT:    .long 41 @ 0x29
1132 ; CHECK-NEXT:    .long 44 @ 0x2c
1133 ; CHECK-NEXT:    .long 47 @ 0x2f
1134 ; CHECK-NEXT:  .LCPI13_1:
1135 ; CHECK-NEXT:    .long 14 @ 0xe
1136 ; CHECK-NEXT:    .long 17 @ 0x11
1137 ; CHECK-NEXT:    .long 20 @ 0x14
1138 ; CHECK-NEXT:    .long 23 @ 0x17
1139 ; CHECK-NEXT:  .LCPI13_2:
1140 ; CHECK-NEXT:    .long 24 @ 0x18
1141 ; CHECK-NEXT:    .long 27 @ 0x1b
1142 ; CHECK-NEXT:    .long 30 @ 0x1e
1143 ; CHECK-NEXT:    .long 33 @ 0x21
1144 ; CHECK-NEXT:  .LCPI13_3:
1145 ; CHECK-NEXT:    .long 1 @ 0x1
1146 ; CHECK-NEXT:    .long 4 @ 0x4
1147 ; CHECK-NEXT:    .long 7 @ 0x7
1148 ; CHECK-NEXT:    .long 10 @ 0xa
1149 ; CHECK-NEXT:  .LCPI13_4:
1150 ; CHECK-NEXT:    .long 36 @ 0x24
1151 ; CHECK-NEXT:    .long 39 @ 0x27
1152 ; CHECK-NEXT:    .long 42 @ 0x2a
1153 ; CHECK-NEXT:    .long 45 @ 0x2d
1154 ; CHECK-NEXT:  .LCPI13_5:
1155 ; CHECK-NEXT:    .long 25 @ 0x19
1156 ; CHECK-NEXT:    .long 28 @ 0x1c
1157 ; CHECK-NEXT:    .long 31 @ 0x1f
1158 ; CHECK-NEXT:    .long 34 @ 0x22
1159 ; CHECK-NEXT:  .LCPI13_6:
1160 ; CHECK-NEXT:    .long 13 @ 0xd
1161 ; CHECK-NEXT:    .long 16 @ 0x10
1162 ; CHECK-NEXT:    .long 19 @ 0x13
1163 ; CHECK-NEXT:    .long 22 @ 0x16
1164 ; CHECK-NEXT:  .LCPI13_7:
1165 ; CHECK-NEXT:    .long 2 @ 0x2
1166 ; CHECK-NEXT:    .long 5 @ 0x5
1167 ; CHECK-NEXT:    .long 8 @ 0x8
1168 ; CHECK-NEXT:    .long 11 @ 0xb
1169 ; CHECK-NEXT:  .LCPI13_8:
1170 ; CHECK-NEXT:    .long 26 @ 0x1a
1171 ; CHECK-NEXT:    .long 29 @ 0x1d
1172 ; CHECK-NEXT:    .long 32 @ 0x20
1173 ; CHECK-NEXT:    .long 35 @ 0x23
1174 ; CHECK-NEXT:  .LCPI13_9:
1175 ; CHECK-NEXT:    .long 37 @ 0x25
1176 ; CHECK-NEXT:    .long 40 @ 0x28
1177 ; CHECK-NEXT:    .long 43 @ 0x2b
1178 ; CHECK-NEXT:    .long 46 @ 0x2e
1179 ; CHECK-NEXT:  .LCPI13_10:
1180 ; CHECK-NEXT:    .long 12 @ 0xc
1181 ; CHECK-NEXT:    .long 15 @ 0xf
1182 ; CHECK-NEXT:    .long 18 @ 0x12
1183 ; CHECK-NEXT:    .long 21 @ 0x15
1184 ; CHECK-NEXT:  .LCPI13_11:
1185 ; CHECK-NEXT:    .long 0 @ 0x0
1186 ; CHECK-NEXT:    .long 3 @ 0x3
1187 ; CHECK-NEXT:    .long 6 @ 0x6
1188 ; CHECK-NEXT:    .long 9 @ 0x9
1191 entry:
1192   %cmp22 = icmp sgt i32 %n, 0
1193   br i1 %cmp22, label %vector.ph, label %for.cond.cleanup
1195 vector.ph:                                        ; preds = %for.body.preheader
1196   %n.vec = and i32 %n, -8
1197   br label %vector.body
1199 vector.body:                                      ; preds = %vector.body, %vector.ph
1200   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
1201   %vec.ind = phi <16 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>, %vector.ph ], [ %vec.ind.next, %vector.body ]
1202   %0 = mul nuw nsw <16 x i32> %vec.ind, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
1203   %1 = getelementptr inbounds i8, ptr %data, <16 x i32> %0
1204   %wide.masked.gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %1, i32 2, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)
1205   %2 = add nuw nsw <16 x i32> %0, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
1206   %3 = getelementptr inbounds i8, ptr %data, <16 x i32> %2
1207   %wide.masked.gather24 = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %3, i32 2, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)
1208   %4 = add nuw nsw <16 x i32> %0, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
1209   %5 = getelementptr inbounds i8, ptr %data, <16 x i32> %4
1210   %wide.masked.gather25 = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %5, i32 2, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)
1211   %6 = add nsw <16 x i8> %wide.masked.gather24, %wide.masked.gather
1212   %7 = add nsw <16 x i8> %6, %wide.masked.gather25
1213   %8 = getelementptr inbounds i8, ptr %dst, i32 %index
1214   store <16 x i8> %7, ptr %8, align 2
1215   %index.next = add i32 %index, 16
1216   %vec.ind.next = add <16 x i32> %vec.ind, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
1217   %9 = icmp eq i32 %index.next, %n.vec
1218   br i1 %9, label %middle.block, label %vector.body
1220 middle.block:                                     ; preds = %vector.body
1221   %cmp.n = icmp eq i32 %n.vec, %n
1222   br i1 %cmp.n, label %for.cond.cleanup, label %vector.ph
1224 for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry
1225   ret void
1228 define arm_aapcs_vfpcc void @gather_inc_v16i8_simple(ptr noalias nocapture readonly %data, ptr noalias nocapture %dst, i32 %n) {
1229 ; CHECK-LABEL: gather_inc_v16i8_simple:
1230 ; CHECK:       @ %bb.0: @ %entry
1231 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
1232 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
1233 ; CHECK-NEXT:    .pad #4
1234 ; CHECK-NEXT:    sub sp, #4
1235 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}
1236 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}
1237 ; CHECK-NEXT:    .pad #64
1238 ; CHECK-NEXT:    sub sp, #64
1239 ; CHECK-NEXT:    cmp r2, #1
1240 ; CHECK-NEXT:    strd r1, r2, [sp, #56] @ 8-byte Folded Spill
1241 ; CHECK-NEXT:    blt.w .LBB14_5
1242 ; CHECK-NEXT:  @ %bb.1: @ %vector.ph.preheader
1243 ; CHECK-NEXT:    adr r5, .LCPI14_3
1244 ; CHECK-NEXT:    adr r7, .LCPI14_1
1245 ; CHECK-NEXT:    vldrw.u32 q0, [r5]
1246 ; CHECK-NEXT:    ldr r1, [sp, #60] @ 4-byte Reload
1247 ; CHECK-NEXT:    adr r3, .LCPI14_0
1248 ; CHECK-NEXT:    adr r6, .LCPI14_2
1249 ; CHECK-NEXT:    vstrw.32 q0, [sp, #32] @ 16-byte Spill
1250 ; CHECK-NEXT:    vldrw.u32 q0, [r7]
1251 ; CHECK-NEXT:    bic r9, r1, #7
1252 ; CHECK-NEXT:    vldrw.u32 q3, [r3]
1253 ; CHECK-NEXT:    vstrw.32 q0, [sp, #16] @ 16-byte Spill
1254 ; CHECK-NEXT:    vldrw.u32 q0, [r6]
1255 ; CHECK-NEXT:    mov.w lr, #16
1256 ; CHECK-NEXT:    str.w r9, [sp, #52] @ 4-byte Spill
1257 ; CHECK-NEXT:    vstrw.32 q0, [sp] @ 16-byte Spill
1258 ; CHECK-NEXT:  .LBB14_2: @ %vector.ph
1259 ; CHECK-NEXT:    @ =>This Loop Header: Depth=1
1260 ; CHECK-NEXT:    @ Child Loop BB14_3 Depth 2
1261 ; CHECK-NEXT:    ldr.w r8, [sp, #56] @ 4-byte Reload
1262 ; CHECK-NEXT:    vldrw.u32 q5, [sp] @ 16-byte Reload
1263 ; CHECK-NEXT:    vldrw.u32 q0, [sp, #16] @ 16-byte Reload
1264 ; CHECK-NEXT:    vldrw.u32 q7, [sp, #32] @ 16-byte Reload
1265 ; CHECK-NEXT:    vmov q4, q3
1266 ; CHECK-NEXT:  .LBB14_3: @ %vector.body
1267 ; CHECK-NEXT:    @ Parent Loop BB14_2 Depth=1
1268 ; CHECK-NEXT:    @ => This Inner Loop Header: Depth=2
1269 ; CHECK-NEXT:    vadd.i32 q1, q5, r0
1270 ; CHECK-NEXT:    vadd.i32 q2, q4, r0
1271 ; CHECK-NEXT:    vmov r7, r3, d3
1272 ; CHECK-NEXT:    vadd.i32 q6, q0, lr
1273 ; CHECK-NEXT:    vmov r5, r6, d5
1274 ; CHECK-NEXT:    subs.w r9, r9, #16
1275 ; CHECK-NEXT:    vmov r4, r10, d2
1276 ; CHECK-NEXT:    vadd.i32 q1, q7, lr
1277 ; CHECK-NEXT:    vadd.i32 q4, q4, lr
1278 ; CHECK-NEXT:    vadd.i32 q5, q5, lr
1279 ; CHECK-NEXT:    ldrb.w r11, [r3]
1280 ; CHECK-NEXT:    ldrb r3, [r7]
1281 ; CHECK-NEXT:    vmov r7, r12, d4
1282 ; CHECK-NEXT:    vadd.i32 q2, q7, r0
1283 ; CHECK-NEXT:    vadd.i32 q7, q0, r0
1284 ; CHECK-NEXT:    ldrb r5, [r5]
1285 ; CHECK-NEXT:    ldrb r6, [r6]
1286 ; CHECK-NEXT:    ldrb r4, [r4]
1287 ; CHECK-NEXT:    ldrb.w r10, [r10]
1288 ; CHECK-NEXT:    ldrb r7, [r7]
1289 ; CHECK-NEXT:    ldrb.w r1, [r12]
1290 ; CHECK-NEXT:    vmov.8 q0[0], r7
1291 ; CHECK-NEXT:    vmov.8 q0[1], r1
1292 ; CHECK-NEXT:    vmov r1, r7, d15
1293 ; CHECK-NEXT:    vmov.8 q0[2], r5
1294 ; CHECK-NEXT:    vmov.8 q0[3], r6
1295 ; CHECK-NEXT:    vmov.8 q0[4], r4
1296 ; CHECK-NEXT:    vmov r4, r2, d4
1297 ; CHECK-NEXT:    vmov.8 q0[5], r10
1298 ; CHECK-NEXT:    vmov.8 q0[6], r3
1299 ; CHECK-NEXT:    vmov.8 q0[7], r11
1300 ; CHECK-NEXT:    ldrb r6, [r7]
1301 ; CHECK-NEXT:    vmov r5, r7, d5
1302 ; CHECK-NEXT:    ldrb r1, [r1]
1303 ; CHECK-NEXT:    ldrb r2, [r2]
1304 ; CHECK-NEXT:    ldrb r3, [r5]
1305 ; CHECK-NEXT:    ldrb.w r12, [r7]
1306 ; CHECK-NEXT:    ldrb r5, [r4]
1307 ; CHECK-NEXT:    vmov r4, r7, d14
1308 ; CHECK-NEXT:    vmov q7, q1
1309 ; CHECK-NEXT:    ldrb r4, [r4]
1310 ; CHECK-NEXT:    ldrb r7, [r7]
1311 ; CHECK-NEXT:    vmov.8 q0[8], r4
1312 ; CHECK-NEXT:    vmov.8 q0[9], r7
1313 ; CHECK-NEXT:    vmov.8 q0[10], r1
1314 ; CHECK-NEXT:    vmov.8 q0[11], r6
1315 ; CHECK-NEXT:    vmov.8 q0[12], r5
1316 ; CHECK-NEXT:    vmov.8 q0[13], r2
1317 ; CHECK-NEXT:    vmov.8 q0[14], r3
1318 ; CHECK-NEXT:    vmov.8 q0[15], r12
1319 ; CHECK-NEXT:    vstrb.8 q0, [r8], #16
1320 ; CHECK-NEXT:    vmov q0, q6
1321 ; CHECK-NEXT:    bne .LBB14_3
1322 ; CHECK-NEXT:  @ %bb.4: @ %middle.block
1323 ; CHECK-NEXT:    @ in Loop: Header=BB14_2 Depth=1
1324 ; CHECK-NEXT:    ldr r1, [sp, #60] @ 4-byte Reload
1325 ; CHECK-NEXT:    ldr.w r9, [sp, #52] @ 4-byte Reload
1326 ; CHECK-NEXT:    cmp r9, r1
1327 ; CHECK-NEXT:    bne .LBB14_2
1328 ; CHECK-NEXT:  .LBB14_5: @ %for.cond.cleanup
1329 ; CHECK-NEXT:    add sp, #64
1330 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}
1331 ; CHECK-NEXT:    add sp, #4
1332 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
1333 ; CHECK-NEXT:    .p2align 4
1334 ; CHECK-NEXT:  @ %bb.6:
1335 ; CHECK-NEXT:  .LCPI14_0:
1336 ; CHECK-NEXT:    .long 0 @ 0x0
1337 ; CHECK-NEXT:    .long 1 @ 0x1
1338 ; CHECK-NEXT:    .long 2 @ 0x2
1339 ; CHECK-NEXT:    .long 3 @ 0x3
1340 ; CHECK-NEXT:  .LCPI14_1:
1341 ; CHECK-NEXT:    .long 8 @ 0x8
1342 ; CHECK-NEXT:    .long 9 @ 0x9
1343 ; CHECK-NEXT:    .long 10 @ 0xa
1344 ; CHECK-NEXT:    .long 11 @ 0xb
1345 ; CHECK-NEXT:  .LCPI14_2:
1346 ; CHECK-NEXT:    .long 4 @ 0x4
1347 ; CHECK-NEXT:    .long 5 @ 0x5
1348 ; CHECK-NEXT:    .long 6 @ 0x6
1349 ; CHECK-NEXT:    .long 7 @ 0x7
1350 ; CHECK-NEXT:  .LCPI14_3:
1351 ; CHECK-NEXT:    .long 12 @ 0xc
1352 ; CHECK-NEXT:    .long 13 @ 0xd
1353 ; CHECK-NEXT:    .long 14 @ 0xe
1354 ; CHECK-NEXT:    .long 15 @ 0xf
1357 entry:
1358   %cmp22 = icmp sgt i32 %n, 0
1359   br i1 %cmp22, label %vector.ph, label %for.cond.cleanup
1361 vector.ph:                                        ; preds = %for.body.preheader
1362   %n.vec = and i32 %n, -8
1363   br label %vector.body
1365 vector.body:                                      ; preds = %vector.body, %vector.ph
1366   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
1367   %vec.ind = phi <16 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>, %vector.ph ], [ %vec.ind.next, %vector.body ]
1368   %0 = getelementptr inbounds i8, ptr %data, <16 x i32> %vec.ind
1369   %wide.masked.gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %0, i32 2, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)
1370   %1 = getelementptr inbounds i8, ptr %dst, i32 %index
1371   store <16 x i8> %wide.masked.gather, ptr %1, align 2
1372   %index.next = add i32 %index, 16
1373   %vec.ind.next = add <16 x i32> %vec.ind, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
1374   %2 = icmp eq i32 %index.next, %n.vec
1375   br i1 %2, label %middle.block, label %vector.body
1377 middle.block:                                     ; preds = %vector.body
1378   %cmp.n = icmp eq i32 %n.vec, %n
1379   br i1 %cmp.n, label %for.cond.cleanup, label %vector.ph
1381 for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry
1382   ret void
1385 define void @shl(ptr nocapture %x, ptr noalias nocapture readonly %y, i32 %n) {
1386 ; CHECK-LABEL: shl:
1387 ; CHECK:       @ %bb.0: @ %entry
1388 ; CHECK-NEXT:    .save {r7, lr}
1389 ; CHECK-NEXT:    push {r7, lr}
1390 ; CHECK-NEXT:    cmp r2, #1
1391 ; CHECK-NEXT:    it lt
1392 ; CHECK-NEXT:    poplt {r7, pc}
1393 ; CHECK-NEXT:  .LBB15_1: @ %vector.ph
1394 ; CHECK-NEXT:    adr r3, .LCPI15_0
1395 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
1396 ; CHECK-NEXT:    vadd.i32 q0, q0, r1
1397 ; CHECK-NEXT:    dlstp.32 lr, r2
1398 ; CHECK-NEXT:  .LBB15_2: @ %vector.body
1399 ; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1
1400 ; CHECK-NEXT:    vldrw.u32 q1, [q0, #64]!
1401 ; CHECK-NEXT:    vstrw.32 q1, [r0], #16
1402 ; CHECK-NEXT:    letp lr, .LBB15_2
1403 ; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup
1404 ; CHECK-NEXT:    pop {r7, pc}
1405 ; CHECK-NEXT:    .p2align 4
1406 ; CHECK-NEXT:  @ %bb.4:
1407 ; CHECK-NEXT:  .LCPI15_0:
1408 ; CHECK-NEXT:    .long 4294967232 @ 0xffffffc0
1409 ; CHECK-NEXT:    .long 4294967248 @ 0xffffffd0
1410 ; CHECK-NEXT:    .long 4294967264 @ 0xffffffe0
1411 ; CHECK-NEXT:    .long 4294967280 @ 0xfffffff0
1412 entry:
1413   %cmp6 = icmp sgt i32 %n, 0
1414   br i1 %cmp6, label %vector.ph, label %for.cond.cleanup
1416 vector.ph:                                        ; preds = %entry
1417   %n.rnd.up = add i32 %n, 3
1418   %n.vec = and i32 %n.rnd.up, -4
1419   br label %vector.body
1421 vector.body:                                      ; preds = %vector.body, %vector.ph
1422   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
1423   %vec.ind = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %vector.ph ], [ %vec.ind.next, %vector.body ]
1424   %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)
1425   %0 = shl nsw <4 x i32> %vec.ind, <i32 2, i32 2, i32 2, i32 2>
1426   %1 = getelementptr inbounds i32, ptr %y, <4 x i32> %0
1427   %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %1, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)
1428   %2 = getelementptr inbounds i32, ptr %x, i32 %index
1429   call void @llvm.masked.store.v4i32.p0(<4 x i32> %wide.masked.gather, ptr %2, i32 4, <4 x i1> %active.lane.mask)
1430   %index.next = add i32 %index, 4
1431   %vec.ind.next = add <4 x i32> %vec.ind, <i32 4, i32 4, i32 4, i32 4>
1432   %3 = icmp eq i32 %index.next, %n.vec
1433   br i1 %3, label %for.cond.cleanup, label %vector.body
1435 for.cond.cleanup:                                 ; preds = %vector.body, %entry
1436   ret void
1439 define void @shlor(ptr nocapture %x, ptr noalias nocapture readonly %y, i32 %n) {
1440 ; CHECK-LABEL: shlor:
1441 ; CHECK:       @ %bb.0: @ %entry
1442 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
1443 ; CHECK-NEXT:    push {r4, r5, r6, lr}
1444 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13}
1445 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13}
1446 ; CHECK-NEXT:    cmp r2, #1
1447 ; CHECK-NEXT:    blt .LBB16_3
1448 ; CHECK-NEXT:  @ %bb.1: @ %vector.ph
1449 ; CHECK-NEXT:    adr.w lr, .LCPI16_0
1450 ; CHECK-NEXT:    adr r4, .LCPI16_1
1451 ; CHECK-NEXT:    adr r5, .LCPI16_2
1452 ; CHECK-NEXT:    adr r6, .LCPI16_3
1453 ; CHECK-NEXT:    vldrw.u32 q0, [r6]
1454 ; CHECK-NEXT:    vldrw.u32 q1, [r5]
1455 ; CHECK-NEXT:    vldrw.u32 q2, [r4]
1456 ; CHECK-NEXT:    vldrw.u32 q3, [lr]
1457 ; CHECK-NEXT:    vadd.i32 q0, q0, r1
1458 ; CHECK-NEXT:    vadd.i32 q1, q1, r1
1459 ; CHECK-NEXT:    vadd.i32 q2, q2, r1
1460 ; CHECK-NEXT:    vadd.i32 q3, q3, r1
1461 ; CHECK-NEXT:    dlstp.32 lr, r2
1462 ; CHECK-NEXT:  .LBB16_2: @ %vector.body
1463 ; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1
1464 ; CHECK-NEXT:    vldrw.u32 q4, [q3, #128]!
1465 ; CHECK-NEXT:    vldrw.u32 q5, [q2, #128]!
1466 ; CHECK-NEXT:    vldrw.u32 q6, [q0, #128]!
1467 ; CHECK-NEXT:    vadd.i32 q4, q5, q4
1468 ; CHECK-NEXT:    vldrw.u32 q5, [q1, #128]!
1469 ; CHECK-NEXT:    vadd.i32 q4, q4, q5
1470 ; CHECK-NEXT:    vadd.i32 q4, q4, q6
1471 ; CHECK-NEXT:    vstrw.32 q4, [r0], #16
1472 ; CHECK-NEXT:    letp lr, .LBB16_2
1473 ; CHECK-NEXT:  .LBB16_3: @ %for.cond.cleanup
1474 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13}
1475 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
1476 ; CHECK-NEXT:    .p2align 4
1477 ; CHECK-NEXT:  @ %bb.4:
1478 ; CHECK-NEXT:  .LCPI16_0:
1479 ; CHECK-NEXT:    .long 4294967168 @ 0xffffff80
1480 ; CHECK-NEXT:    .long 4294967200 @ 0xffffffa0
1481 ; CHECK-NEXT:    .long 4294967232 @ 0xffffffc0
1482 ; CHECK-NEXT:    .long 4294967264 @ 0xffffffe0
1483 ; CHECK-NEXT:  .LCPI16_1:
1484 ; CHECK-NEXT:    .long 4294967176 @ 0xffffff88
1485 ; CHECK-NEXT:    .long 4294967208 @ 0xffffffa8
1486 ; CHECK-NEXT:    .long 4294967240 @ 0xffffffc8
1487 ; CHECK-NEXT:    .long 4294967272 @ 0xffffffe8
1488 ; CHECK-NEXT:  .LCPI16_2:
1489 ; CHECK-NEXT:    .long 4294967184 @ 0xffffff90
1490 ; CHECK-NEXT:    .long 4294967216 @ 0xffffffb0
1491 ; CHECK-NEXT:    .long 4294967248 @ 0xffffffd0
1492 ; CHECK-NEXT:    .long 4294967280 @ 0xfffffff0
1493 ; CHECK-NEXT:  .LCPI16_3:
1494 ; CHECK-NEXT:    .long 4294967192 @ 0xffffff98
1495 ; CHECK-NEXT:    .long 4294967224 @ 0xffffffb8
1496 ; CHECK-NEXT:    .long 4294967256 @ 0xffffffd8
1497 ; CHECK-NEXT:    .long 4294967288 @ 0xfffffff8
1498 entry:
1499   %cmp23 = icmp sgt i32 %n, 0
1500   br i1 %cmp23, label %vector.ph, label %for.cond.cleanup
1502 vector.ph:                                        ; preds = %entry
1503   %n.rnd.up = add i32 %n, 3
1504   %n.vec = and i32 %n.rnd.up, -4
1505   br label %vector.body
1507 vector.body:                                      ; preds = %vector.body, %vector.ph
1508   %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]
1509   %vec.ind = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %vector.ph ], [ %vec.ind.next, %vector.body ]
1510   %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)
1511   %0 = shl nsw <4 x i32> %vec.ind, <i32 3, i32 3, i32 3, i32 3>
1512   %1 = getelementptr inbounds i32, ptr %y, <4 x i32> %0
1513   %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %1, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)
1514   %2 = or <4 x i32> %0, <i32 2, i32 2, i32 2, i32 2>
1515   %3 = getelementptr inbounds i32, ptr %y, <4 x i32> %2
1516   %wide.masked.gather25 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %3, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)
1517   %4 = add nsw <4 x i32> %wide.masked.gather25, %wide.masked.gather
1518   %5 = or <4 x i32> %0, <i32 4, i32 4, i32 4, i32 4>
1519   %6 = getelementptr inbounds i32, ptr %y, <4 x i32> %5
1520   %wide.masked.gather26 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %6, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)
1521   %7 = add nsw <4 x i32> %4, %wide.masked.gather26
1522   %8 = or <4 x i32> %0, <i32 6, i32 6, i32 6, i32 6>
1523   %9 = getelementptr inbounds i32, ptr %y, <4 x i32> %8
1524   %wide.masked.gather27 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %9, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)
1525   %10 = add nsw <4 x i32> %7, %wide.masked.gather27
1526   %11 = getelementptr inbounds i32, ptr %x, i32 %index
1527   call void @llvm.masked.store.v4i32.p0(<4 x i32> %10, ptr %11, i32 4, <4 x i1> %active.lane.mask)
1528   %index.next = add i32 %index, 4
1529   %vec.ind.next = add <4 x i32> %vec.ind, <i32 4, i32 4, i32 4, i32 4>
1530   %12 = icmp eq i32 %index.next, %n.vec
1531   br i1 %12, label %for.cond.cleanup, label %vector.body
1533 for.cond.cleanup:                                 ; preds = %vector.body, %entry
1534   ret void
1538 declare <2 x i32> @llvm.masked.gather.v2i32.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x i32>)
1539 declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i32>)
1540 declare <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x i32>)
1541 declare <16 x i32> @llvm.masked.gather.v16i32.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x i32>)
1542 declare <2 x float> @llvm.masked.gather.v2f32.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x float>)
1543 declare <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x float>)
1544 declare <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x float>)
1545 declare <2 x i16> @llvm.masked.gather.v2i16.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x i16>)
1546 declare <4 x i16> @llvm.masked.gather.v4i16.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i16>)
1547 declare <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x i16>)
1548 declare <16 x i16> @llvm.masked.gather.v16i16.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x i16>)
1549 declare <4 x half> @llvm.masked.gather.v4f16.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x half>)
1550 declare <8 x half> @llvm.masked.gather.v8f16.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x half>)
1551 declare <16 x half> @llvm.masked.gather.v16f16.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x half>)
1552 declare <4 x i8> @llvm.masked.gather.v4i8.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i8>)
1553 declare <8 x i8> @llvm.masked.gather.v8i8.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x i8>)
1554 declare <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x i8>)
1555 declare <32 x i8> @llvm.masked.gather.v32i8.v32p0(<32 x ptr>, i32, <32 x i1>, <32 x i8>)
1556 declare void @llvm.masked.store.v4i32.p0(<4 x i32>, ptr, i32, <4 x i1>)
1557 declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32, i32)