1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve -run-pass=arm-low-overhead-loops %s -o - --verify-machineinstrs | FileCheck %s
5 define dso_local arm_aapcs_vfpcc void @test1(i32* noalias nocapture %a, i32* nocapture readonly %b, i32* nocapture readonly %c, i32 %N) local_unnamed_addr {
7 %cmp30 = icmp eq i32 %N, 0
10 %2 = shl nuw i32 %1, 2
13 %5 = add nuw nsw i32 %4, 1
14 br i1 %cmp30, label %for.cond.cleanup6, label %vector.ph
16 vector.ph: ; preds = %entry
17 %start1 = call i32 @llvm.start.loop.iterations.i32(i32 %5)
20 vector.body: ; preds = %vector.body, %vector.ph
21 %lsr.iv68 = phi i32* [ %scevgep69, %vector.body ], [ %a, %vector.ph ]
22 %lsr.iv65 = phi i32* [ %scevgep66, %vector.body ], [ %c, %vector.ph ]
23 %lsr.iv62 = phi i32* [ %scevgep63, %vector.body ], [ %b, %vector.ph ]
24 %6 = phi i32 [ %start1, %vector.ph ], [ %11, %vector.body ]
25 %7 = phi i32 [ %N, %vector.ph ], [ %9, %vector.body ]
26 %lsr.iv6870 = bitcast i32* %lsr.iv68 to <4 x i32>*
27 %lsr.iv6567 = bitcast i32* %lsr.iv65 to <4 x i32>*
28 %lsr.iv6264 = bitcast i32* %lsr.iv62 to <4 x i32>*
29 %8 = call <4 x i1> @llvm.arm.mve.vctp32(i32 %7)
31 %wide.masked.load = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv6264, i32 4, <4 x i1> %8, <4 x i32> undef)
32 %wide.masked.load35 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv6567, i32 4, <4 x i1> %8, <4 x i32> undef)
33 %10 = mul nsw <4 x i32> %wide.masked.load35, %wide.masked.load
34 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %10, <4 x i32>* %lsr.iv6870, i32 4, <4 x i1> %8)
35 %scevgep63 = getelementptr i32, i32* %lsr.iv62, i32 4
36 %scevgep66 = getelementptr i32, i32* %lsr.iv65, i32 4
37 %scevgep69 = getelementptr i32, i32* %lsr.iv68, i32 4
38 %11 = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %6, i32 1)
39 %12 = icmp ne i32 %11, 0
40 br i1 %12, label %vector.body, label %for.cond4.preheader
42 for.cond4.preheader: ; preds = %vector.body
43 %13 = icmp eq i32 %N, 0
46 %16 = shl nuw i32 %15, 2
49 %19 = add nuw nsw i32 %18, 1
50 br i1 %13, label %for.cond.cleanup6, label %vector.ph39
52 vector.ph39: ; preds = %for.cond4.preheader
53 %start2 = call i32 @llvm.start.loop.iterations.i32(i32 %19)
54 br label %vector.body38
56 vector.body38: ; preds = %vector.body38, %vector.ph39
57 %lsr.iv59 = phi i32* [ %scevgep60, %vector.body38 ], [ %a, %vector.ph39 ]
58 %lsr.iv56 = phi i32* [ %scevgep57, %vector.body38 ], [ %c, %vector.ph39 ]
59 %lsr.iv = phi i32* [ %scevgep, %vector.body38 ], [ %b, %vector.ph39 ]
60 %20 = phi i32 [ %start2, %vector.ph39 ], [ %26, %vector.body38 ]
61 %21 = phi i32 [ %N, %vector.ph39 ], [ %23, %vector.body38 ]
62 %lsr.iv5961 = bitcast i32* %lsr.iv59 to <4 x i32>*
63 %lsr.iv5658 = bitcast i32* %lsr.iv56 to <4 x i32>*
64 %lsr.iv55 = bitcast i32* %lsr.iv to <4 x i32>*
65 %22 = call <4 x i1> @llvm.arm.mve.vctp32(i32 %21)
67 %wide.masked.load52 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv55, i32 4, <4 x i1> %22, <4 x i32> undef)
68 %wide.masked.load53 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv5658, i32 4, <4 x i1> %22, <4 x i32> undef)
69 %24 = xor <4 x i32> %wide.masked.load53, %wide.masked.load52
70 %wide.masked.load54 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv5961, i32 4, <4 x i1> %22, <4 x i32> undef)
71 %25 = add nsw <4 x i32> %wide.masked.load54, %24
72 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %25, <4 x i32>* %lsr.iv5961, i32 4, <4 x i1> %22)
73 %scevgep = getelementptr i32, i32* %lsr.iv, i32 4
74 %scevgep57 = getelementptr i32, i32* %lsr.iv56, i32 4
75 %scevgep60 = getelementptr i32, i32* %lsr.iv59, i32 4
76 %26 = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %20, i32 1)
77 %27 = icmp ne i32 %26, 0
78 br i1 %27, label %vector.body38, label %for.cond.cleanup6
80 for.cond.cleanup6: ; preds = %vector.body38, %entry, %for.cond4.preheader
83 ; Function Attrs: nofree norecurse nounwind
84 define dso_local arm_aapcs_vfpcc void @test2(i32* noalias nocapture %a, i32* nocapture readonly %b, i32* nocapture readonly %c, i32 %N) local_unnamed_addr {
87 %cmp30 = icmp eq i32 %div, 0
88 %0 = add nuw i32 %div, 3
90 %2 = shl nuw i32 %1, 2
93 %5 = add nuw nsw i32 %4, 1
94 br i1 %cmp30, label %for.cond4.preheader, label %vector.ph
96 vector.ph: ; preds = %entry
97 %start1 = call i32 @llvm.start.loop.iterations.i32(i32 %5)
100 vector.body: ; preds = %vector.body, %vector.ph
101 %lsr.iv68 = phi i32* [ %scevgep69, %vector.body ], [ %a, %vector.ph ]
102 %lsr.iv65 = phi i32* [ %scevgep66, %vector.body ], [ %c, %vector.ph ]
103 %lsr.iv62 = phi i32* [ %scevgep63, %vector.body ], [ %b, %vector.ph ]
104 %6 = phi i32 [ %start1, %vector.ph ], [ %11, %vector.body ]
105 %7 = phi i32 [ %div, %vector.ph ], [ %9, %vector.body ]
106 %lsr.iv6870 = bitcast i32* %lsr.iv68 to <4 x i32>*
107 %lsr.iv6567 = bitcast i32* %lsr.iv65 to <4 x i32>*
108 %lsr.iv6264 = bitcast i32* %lsr.iv62 to <4 x i32>*
109 %8 = call <4 x i1> @llvm.arm.mve.vctp32(i32 %7)
111 %wide.masked.load = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv6264, i32 4, <4 x i1> %8, <4 x i32> undef)
112 %wide.masked.load35 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv6567, i32 4, <4 x i1> %8, <4 x i32> undef)
113 %10 = mul nsw <4 x i32> %wide.masked.load35, %wide.masked.load
114 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %10, <4 x i32>* %lsr.iv6870, i32 4, <4 x i1> %8)
115 %scevgep63 = getelementptr i32, i32* %lsr.iv62, i32 4
116 %scevgep66 = getelementptr i32, i32* %lsr.iv65, i32 4
117 %scevgep69 = getelementptr i32, i32* %lsr.iv68, i32 4
118 %11 = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %6, i32 1)
119 %12 = icmp ne i32 %11, 0
120 br i1 %12, label %vector.body, label %for.cond4.preheader
122 for.cond4.preheader: ; preds = %vector.body, %entry
123 %cmp528 = icmp eq i32 %N, 0
125 %14 = lshr i32 %13, 2
126 %15 = shl nuw i32 %14, 2
127 %16 = add i32 %15, -4
128 %17 = lshr i32 %16, 2
129 %18 = add nuw nsw i32 %17, 1
130 br i1 %cmp528, label %for.cond.cleanup6, label %vector.ph39
132 vector.ph39: ; preds = %for.cond4.preheader
133 %start2 = call i32 @llvm.start.loop.iterations.i32(i32 %18)
134 br label %vector.body38
136 vector.body38: ; preds = %vector.body38, %vector.ph39
137 %lsr.iv59 = phi i32* [ %scevgep60, %vector.body38 ], [ %a, %vector.ph39 ]
138 %lsr.iv56 = phi i32* [ %scevgep57, %vector.body38 ], [ %c, %vector.ph39 ]
139 %lsr.iv = phi i32* [ %scevgep, %vector.body38 ], [ %b, %vector.ph39 ]
140 %19 = phi i32 [ %start2, %vector.ph39 ], [ %25, %vector.body38 ]
141 %20 = phi i32 [ %N, %vector.ph39 ], [ %22, %vector.body38 ]
142 %lsr.iv5961 = bitcast i32* %lsr.iv59 to <4 x i32>*
143 %lsr.iv5658 = bitcast i32* %lsr.iv56 to <4 x i32>*
144 %lsr.iv55 = bitcast i32* %lsr.iv to <4 x i32>*
145 %21 = call <4 x i1> @llvm.arm.mve.vctp32(i32 %20)
147 %wide.masked.load52 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv55, i32 4, <4 x i1> %21, <4 x i32> undef)
148 %wide.masked.load53 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv5658, i32 4, <4 x i1> %21, <4 x i32> undef)
149 %23 = xor <4 x i32> %wide.masked.load53, %wide.masked.load52
150 %wide.masked.load54 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv5961, i32 4, <4 x i1> %21, <4 x i32> undef)
151 %24 = add nsw <4 x i32> %wide.masked.load54, %23
152 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %24, <4 x i32>* %lsr.iv5961, i32 4, <4 x i1> %21)
153 %scevgep = getelementptr i32, i32* %lsr.iv, i32 4
154 %scevgep57 = getelementptr i32, i32* %lsr.iv56, i32 4
155 %scevgep60 = getelementptr i32, i32* %lsr.iv59, i32 4
156 %25 = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %19, i32 1)
157 %26 = icmp ne i32 %25, 0
158 br i1 %26, label %vector.body38, label %for.cond.cleanup6
160 for.cond.cleanup6: ; preds = %vector.body38, %for.cond4.preheader
163 ; Function Attrs: nofree norecurse nounwind
164 define dso_local arm_aapcs_vfpcc void @test3(i32* noalias nocapture %a, i32* nocapture readonly %b, i32* nocapture readonly %c, i32 %N) local_unnamed_addr {
166 %cmp54 = icmp eq i32 %N, 0
169 %2 = shl nuw i32 %1, 2
172 %5 = add nuw nsw i32 %4, 1
173 br i1 %cmp54, label %for.cond.cleanup17, label %vector.ph
175 vector.ph: ; preds = %entry
176 %start1 = call i32 @llvm.start.loop.iterations.i32(i32 %5)
177 br label %vector.body
179 vector.body: ; preds = %vector.body, %vector.ph
180 %lsr.iv123 = phi i32* [ %scevgep124, %vector.body ], [ %a, %vector.ph ]
181 %lsr.iv120 = phi i32* [ %scevgep121, %vector.body ], [ %c, %vector.ph ]
182 %lsr.iv117 = phi i32* [ %scevgep118, %vector.body ], [ %b, %vector.ph ]
183 %6 = phi i32 [ %start1, %vector.ph ], [ %11, %vector.body ]
184 %7 = phi i32 [ %N, %vector.ph ], [ %9, %vector.body ]
185 %lsr.iv123125 = bitcast i32* %lsr.iv123 to <4 x i32>*
186 %lsr.iv120122 = bitcast i32* %lsr.iv120 to <4 x i32>*
187 %lsr.iv117119 = bitcast i32* %lsr.iv117 to <4 x i32>*
188 %8 = call <4 x i1> @llvm.arm.mve.vctp32(i32 %7)
190 %wide.masked.load = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv117119, i32 4, <4 x i1> %8, <4 x i32> undef)
191 %wide.masked.load62 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv120122, i32 4, <4 x i1> %8, <4 x i32> undef)
192 %10 = mul nsw <4 x i32> %wide.masked.load62, %wide.masked.load
193 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %10, <4 x i32>* %lsr.iv123125, i32 4, <4 x i1> %8)
194 %scevgep118 = getelementptr i32, i32* %lsr.iv117, i32 4
195 %scevgep121 = getelementptr i32, i32* %lsr.iv120, i32 4
196 %scevgep124 = getelementptr i32, i32* %lsr.iv123, i32 4
197 %11 = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %6, i32 1)
198 %12 = icmp ne i32 %11, 0
199 br i1 %12, label %vector.body, label %for.cond4.preheader
201 for.cond4.preheader: ; preds = %vector.body
202 %div = lshr i32 %N, 1
203 %cmp552 = icmp eq i32 %div, 0
204 %13 = add nuw i32 %div, 3
205 %14 = lshr i32 %13, 2
206 %15 = shl nuw i32 %14, 2
207 %16 = add i32 %15, -4
208 %17 = lshr i32 %16, 2
209 %18 = add nuw nsw i32 %17, 1
210 br i1 %cmp552, label %for.cond15.preheader, label %vector.ph66
212 vector.ph66: ; preds = %for.cond4.preheader
213 %start2 = call i32 @llvm.start.loop.iterations.i32(i32 %18)
214 br label %vector.body65
216 vector.body65: ; preds = %vector.body65, %vector.ph66
217 %lsr.iv114 = phi i32* [ %scevgep115, %vector.body65 ], [ %a, %vector.ph66 ]
218 %lsr.iv111 = phi i32* [ %scevgep112, %vector.body65 ], [ %c, %vector.ph66 ]
219 %lsr.iv108 = phi i32* [ %scevgep109, %vector.body65 ], [ %b, %vector.ph66 ]
220 %19 = phi i32 [ %start2, %vector.ph66 ], [ %25, %vector.body65 ]
221 %20 = phi i32 [ %div, %vector.ph66 ], [ %22, %vector.body65 ]
222 %lsr.iv114116 = bitcast i32* %lsr.iv114 to <4 x i32>*
223 %lsr.iv111113 = bitcast i32* %lsr.iv111 to <4 x i32>*
224 %lsr.iv108110 = bitcast i32* %lsr.iv108 to <4 x i32>*
225 %21 = call <4 x i1> @llvm.arm.mve.vctp32(i32 %20)
227 %wide.masked.load79 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv108110, i32 4, <4 x i1> %21, <4 x i32> undef)
228 %wide.masked.load80 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv111113, i32 4, <4 x i1> %21, <4 x i32> undef)
229 %23 = xor <4 x i32> %wide.masked.load80, %wide.masked.load79
230 %wide.masked.load81 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv114116, i32 4, <4 x i1> %21, <4 x i32> undef)
231 %24 = add nsw <4 x i32> %wide.masked.load81, %23
232 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %24, <4 x i32>* %lsr.iv114116, i32 4, <4 x i1> %21)
233 %scevgep109 = getelementptr i32, i32* %lsr.iv108, i32 4
234 %scevgep112 = getelementptr i32, i32* %lsr.iv111, i32 4
235 %scevgep115 = getelementptr i32, i32* %lsr.iv114, i32 4
236 %25 = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %19, i32 1)
237 %26 = icmp ne i32 %25, 0
238 br i1 %26, label %vector.body65, label %for.cond15.preheader
240 for.cond15.preheader: ; preds = %vector.body65, %for.cond4.preheader
241 %27 = icmp eq i32 %N, 0
243 %29 = lshr i32 %28, 2
244 %30 = shl nuw i32 %29, 2
245 %31 = add i32 %30, -4
246 %32 = lshr i32 %31, 2
247 %33 = add nuw nsw i32 %32, 1
248 br i1 %27, label %for.cond.cleanup17, label %vector.ph85
250 vector.ph85: ; preds = %for.cond15.preheader
251 %start3 = call i32 @llvm.start.loop.iterations.i32(i32 %33)
252 br label %vector.body84
254 vector.body84: ; preds = %vector.body84, %vector.ph85
255 %lsr.iv105 = phi i32* [ %scevgep106, %vector.body84 ], [ %a, %vector.ph85 ]
256 %lsr.iv102 = phi i32* [ %scevgep103, %vector.body84 ], [ %c, %vector.ph85 ]
257 %lsr.iv = phi i32* [ %scevgep, %vector.body84 ], [ %b, %vector.ph85 ]
258 %34 = phi i32 [ %start3, %vector.ph85 ], [ %40, %vector.body84 ]
259 %35 = phi i32 [ %N, %vector.ph85 ], [ %37, %vector.body84 ]
260 %lsr.iv105107 = bitcast i32* %lsr.iv105 to <4 x i32>*
261 %lsr.iv102104 = bitcast i32* %lsr.iv102 to <4 x i32>*
262 %lsr.iv101 = bitcast i32* %lsr.iv to <4 x i32>*
263 %36 = call <4 x i1> @llvm.arm.mve.vctp32(i32 %35)
265 %wide.masked.load98 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv101, i32 4, <4 x i1> %36, <4 x i32> undef)
266 %wide.masked.load99 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv102104, i32 4, <4 x i1> %36, <4 x i32> undef)
267 %wide.masked.load100 = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %lsr.iv105107, i32 4, <4 x i1> %36, <4 x i32> undef)
268 %38 = add <4 x i32> %wide.masked.load99, %wide.masked.load98
269 %39 = sub <4 x i32> %wide.masked.load100, %38
270 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %39, <4 x i32>* %lsr.iv105107, i32 4, <4 x i1> %36)
271 %scevgep = getelementptr i32, i32* %lsr.iv, i32 4
272 %scevgep103 = getelementptr i32, i32* %lsr.iv102, i32 4
273 %scevgep106 = getelementptr i32, i32* %lsr.iv105, i32 4
274 %40 = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %34, i32 1)
275 %41 = icmp ne i32 %40, 0
276 br i1 %41, label %vector.body84, label %for.cond.cleanup17
278 for.cond.cleanup17: ; preds = %vector.body84, %entry, %for.cond15.preheader
281 declare <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>*, i32 immarg, <4 x i1>, <4 x i32>)
282 declare void @llvm.masked.store.v4i32.p0v4i32(<4 x i32>, <4 x i32>*, i32 immarg, <4 x i1>)
283 declare i32 @llvm.start.loop.iterations.i32(i32)
284 declare i32 @llvm.loop.decrement.reg.i32.i32.i32(i32, i32)
285 declare <4 x i1> @llvm.arm.mve.vctp32(i32)
291 exposesReturnsTwice: false
293 regBankSelected: false
296 tracksRegLiveness: true
300 - { reg: '$r0', virtual-reg: '' }
301 - { reg: '$r1', virtual-reg: '' }
302 - { reg: '$r2', virtual-reg: '' }
303 - { reg: '$r3', virtual-reg: '' }
305 isFrameAddressTaken: false
306 isReturnAddressTaken: false
310 offsetAdjustment: -16
316 cvBytesOfCalleeSavedRegisters: 0
317 hasOpaqueSPAdjustment: false
319 hasMustTailInVarArgFunc: false
325 - { id: 0, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4,
326 stack-id: default, callee-saved-register: '$lr', callee-saved-restored: false,
327 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
328 - { id: 1, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4,
329 stack-id: default, callee-saved-register: '$r7', callee-saved-restored: true,
330 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
331 - { id: 2, name: '', type: spill-slot, offset: -12, size: 4, alignment: 4,
332 stack-id: default, callee-saved-register: '$r6', callee-saved-restored: true,
333 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
334 - { id: 3, name: '', type: spill-slot, offset: -16, size: 4, alignment: 4,
335 stack-id: default, callee-saved-register: '$r5', callee-saved-restored: true,
336 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
337 - { id: 4, name: '', type: spill-slot, offset: -20, size: 4, alignment: 4,
338 stack-id: default, callee-saved-register: '$r4', callee-saved-restored: true,
339 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
340 - { id: 5, name: '', type: spill-slot, offset: -24, size: 4, alignment: 4,
341 stack-id: default, callee-saved-register: '$r8', callee-saved-restored: true,
342 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
345 machineFunctionInfo: {}
347 ; CHECK-LABEL: name: test1
349 ; CHECK: successors: %bb.6(0x30000000), %bb.1(0x50000000)
350 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r3, $r4, $r5, $r6, $r8
351 ; CHECK: frame-setup tPUSH 14 /* CC::al */, $noreg, killed $r4, killed $r5, killed $r6, killed $lr, implicit-def $sp, implicit $sp
352 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 20
353 ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4
354 ; CHECK: frame-setup CFI_INSTRUCTION offset $r7, -8
355 ; CHECK: frame-setup CFI_INSTRUCTION offset $r6, -12
356 ; CHECK: frame-setup CFI_INSTRUCTION offset $r5, -16
357 ; CHECK: frame-setup CFI_INSTRUCTION offset $r4, -20
358 ; CHECK: dead $r7 = frame-setup tADDrSPi $sp, 3, 14 /* CC::al */, $noreg
359 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa $r7, 8
360 ; CHECK: early-clobber $sp = frame-setup t2STR_PRE killed $r8, $sp, -4, 14 /* CC::al */, $noreg
361 ; CHECK: frame-setup CFI_INSTRUCTION offset $r8, -24
362 ; CHECK: tCMPi8 renamable $r3, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
363 ; CHECK: tBcc %bb.6, 0 /* CC::eq */, killed $cpsr
364 ; CHECK: bb.1.vector.ph:
365 ; CHECK: successors: %bb.2(0x80000000)
366 ; CHECK: liveins: $r0, $r1, $r2, $r3
367 ; CHECK: $r8 = tMOVr $r0, 14 /* CC::al */, $noreg
368 ; CHECK: $r5 = tMOVr $r2, 14 /* CC::al */, $noreg
369 ; CHECK: $r4 = tMOVr $r3, 14 /* CC::al */, $noreg
370 ; CHECK: $r6 = tMOVr $r1, 14 /* CC::al */, $noreg
371 ; CHECK: $lr = MVE_DLSTP_32 killed renamable $r4
372 ; CHECK: bb.2.vector.body:
373 ; CHECK: successors: %bb.2(0x7c000000), %bb.3(0x04000000)
374 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r3, $r5, $r6, $r8
375 ; CHECK: renamable $r6, renamable $q0 = MVE_VLDRWU32_post killed renamable $r6, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv6264, align 4)
376 ; CHECK: renamable $r5, renamable $q1 = MVE_VLDRWU32_post killed renamable $r5, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv6567, align 4)
377 ; CHECK: renamable $q0 = nsw MVE_VMULi32 killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
378 ; CHECK: renamable $r8 = MVE_VSTRWU32_post killed renamable $q0, killed renamable $r8, 16, 0, killed $noreg :: (store (s128) into %ir.lsr.iv6870, align 4)
379 ; CHECK: $lr = MVE_LETP killed renamable $lr, %bb.2
380 ; CHECK: bb.3.for.cond4.preheader:
381 ; CHECK: successors: %bb.6(0x30000000), %bb.4(0x50000000)
382 ; CHECK: liveins: $r0, $r1, $r2, $r3
383 ; CHECK: tCBZ $r3, %bb.6
384 ; CHECK: bb.4.vector.ph39:
385 ; CHECK: successors: %bb.5(0x80000000)
386 ; CHECK: liveins: $r0, $r1, $r2, $r3
387 ; CHECK: $r12 = tMOVr $r0, 14 /* CC::al */, $noreg
388 ; CHECK: $lr = MVE_DLSTP_32 killed renamable $r3
389 ; CHECK: bb.5.vector.body38:
390 ; CHECK: successors: %bb.5(0x7c000000), %bb.6(0x04000000)
391 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r12
392 ; CHECK: renamable $r1, renamable $q0 = MVE_VLDRWU32_post killed renamable $r1, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv55, align 4)
393 ; CHECK: renamable $r2, renamable $q1 = MVE_VLDRWU32_post killed renamable $r2, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv5658, align 4)
394 ; CHECK: renamable $r12, renamable $q2 = MVE_VLDRWU32_post killed renamable $r12, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv5961, align 4)
395 ; CHECK: renamable $q0 = MVE_VEOR killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
396 ; CHECK: renamable $q0 = nsw MVE_VADDi32 killed renamable $q2, killed renamable $q0, 0, $noreg, undef renamable $q0
397 ; CHECK: MVE_VSTRWU32 killed renamable $q0, killed renamable $r0, 0, 0, killed $noreg :: (store (s128) into %ir.lsr.iv5961, align 4)
398 ; CHECK: $r0 = tMOVr $r12, 14 /* CC::al */, $noreg
399 ; CHECK: $lr = MVE_LETP killed renamable $lr, %bb.5
400 ; CHECK: bb.6.for.cond.cleanup6:
401 ; CHECK: $r8, $sp = t2LDR_POST $sp, 4, 14 /* CC::al */, $noreg
402 ; CHECK: tPOP_RET 14 /* CC::al */, $noreg, def $r4, def $r5, def $r6, def $r7, def $pc
404 successors: %bb.6(0x30000000), %bb.1(0x50000000)
405 liveins: $r0, $r1, $r2, $r3, $r4, $r5, $r6, $lr, $r8
407 frame-setup tPUSH 14, $noreg, killed $r4, killed $r5, killed $r6, killed $lr, implicit-def $sp, implicit $sp
408 frame-setup CFI_INSTRUCTION def_cfa_offset 20
409 frame-setup CFI_INSTRUCTION offset $lr, -4
410 frame-setup CFI_INSTRUCTION offset $r7, -8
411 frame-setup CFI_INSTRUCTION offset $r6, -12
412 frame-setup CFI_INSTRUCTION offset $r5, -16
413 frame-setup CFI_INSTRUCTION offset $r4, -20
414 $r7 = frame-setup tADDrSPi $sp, 3, 14, $noreg
415 frame-setup CFI_INSTRUCTION def_cfa $r7, 8
416 early-clobber $sp = frame-setup t2STR_PRE killed $r8, $sp, -4, 14, $noreg
417 frame-setup CFI_INSTRUCTION offset $r8, -24
418 tCMPi8 renamable $r3, 0, 14, $noreg, implicit-def $cpsr
419 tBcc %bb.6, 0, killed $cpsr
422 successors: %bb.2(0x80000000)
423 liveins: $r0, $r1, $r2, $r3
425 renamable $r6, dead $cpsr = tADDi3 renamable $r3, 3, 14, $noreg
426 $r8 = tMOVr $r0, 14, $noreg
427 renamable $r6 = t2BICri killed renamable $r6, 3, 14, $noreg, $noreg
428 $r5 = tMOVr $r2, 14, $noreg
429 renamable $r12 = t2SUBri killed renamable $r6, 4, 14, $noreg, $noreg
430 renamable $r6, dead $cpsr = tMOVi8 1, 14, $noreg
431 $r4 = tMOVr $r3, 14, $noreg
432 renamable $lr = nuw nsw t2ADDrs killed renamable $r6, renamable $r12, 19, 14, $noreg, $noreg
433 $r6 = tMOVr $r1, 14, $noreg
434 $lr = t2DoLoopStart renamable $lr
437 successors: %bb.2(0x7c000000), %bb.3(0x04000000)
438 liveins: $lr, $r0, $r1, $r2, $r3, $r4, $r5, $r6, $r8, $r12
440 renamable $vpr = MVE_VCTP32 renamable $r4, 0, $noreg
441 MVE_VPST 4, implicit $vpr
442 renamable $r6, renamable $q0 = MVE_VLDRWU32_post killed renamable $r6, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv6264, align 4)
443 renamable $r5, renamable $q1 = MVE_VLDRWU32_post killed renamable $r5, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv6567, align 4)
444 renamable $r4, dead $cpsr = tSUBi8 killed renamable $r4, 4, 14, $noreg
445 renamable $q0 = nsw MVE_VMULi32 killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
446 MVE_VPST 8, implicit $vpr
447 renamable $r8 = MVE_VSTRWU32_post killed renamable $q0, killed renamable $r8, 16, 1, killed renamable $vpr :: (store (s128) into %ir.lsr.iv6870, align 4)
448 renamable $lr = t2LoopDec killed renamable $lr, 1
449 t2LoopEnd renamable $lr, %bb.2, implicit-def dead $cpsr
452 bb.3.for.cond4.preheader:
453 successors: %bb.6(0x30000000), %bb.4(0x50000000)
454 liveins: $r0, $r1, $r2, $r3, $r12
459 successors: %bb.5(0x80000000)
460 liveins: $r0, $r1, $r2, $r3, $r12
462 renamable $r6, dead $cpsr = tMOVi8 1, 14, $noreg
463 renamable $lr = nuw nsw t2ADDrs killed renamable $r6, killed renamable $r12, 19, 14, $noreg, $noreg
464 $r12 = tMOVr $r0, 14, $noreg
465 $lr = t2DoLoopStart renamable $lr
468 successors: %bb.5(0x7c000000), %bb.6(0x04000000)
469 liveins: $lr, $r0, $r1, $r2, $r3, $r12
471 renamable $vpr = MVE_VCTP32 renamable $r3, 0, $noreg
472 MVE_VPST 2, implicit $vpr
473 renamable $r1, renamable $q0 = MVE_VLDRWU32_post killed renamable $r1, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv55, align 4)
474 renamable $r2, renamable $q1 = MVE_VLDRWU32_post killed renamable $r2, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv5658, align 4)
475 renamable $r12, renamable $q2 = MVE_VLDRWU32_post killed renamable $r12, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv5961, align 4)
476 renamable $q0 = MVE_VEOR killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
477 renamable $r3, dead $cpsr = tSUBi8 killed renamable $r3, 4, 14, $noreg
478 renamable $q0 = nsw MVE_VADDi32 killed renamable $q2, killed renamable $q0, 0, $noreg, undef renamable $q0
479 MVE_VPST 8, implicit $vpr
480 MVE_VSTRWU32 killed renamable $q0, killed renamable $r0, 0, 1, killed renamable $vpr :: (store (s128) into %ir.lsr.iv5961, align 4)
481 renamable $lr = t2LoopDec killed renamable $lr, 1
482 $r0 = tMOVr $r12, 14, $noreg
483 t2LoopEnd renamable $lr, %bb.5, implicit-def dead $cpsr
486 bb.6.for.cond.cleanup6:
487 $r8, $sp = t2LDR_POST $sp, 4, 14, $noreg
488 tPOP_RET 14, $noreg, def $r4, def $r5, def $r6, def $r7, def $pc
494 exposesReturnsTwice: false
496 regBankSelected: false
499 tracksRegLiveness: true
503 - { reg: '$r0', virtual-reg: '' }
504 - { reg: '$r1', virtual-reg: '' }
505 - { reg: '$r2', virtual-reg: '' }
506 - { reg: '$r3', virtual-reg: '' }
508 isFrameAddressTaken: false
509 isReturnAddressTaken: false
513 offsetAdjustment: -16
519 cvBytesOfCalleeSavedRegisters: 0
520 hasOpaqueSPAdjustment: false
522 hasMustTailInVarArgFunc: false
528 - { id: 0, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4,
529 stack-id: default, callee-saved-register: '$lr', callee-saved-restored: false,
530 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
531 - { id: 1, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4,
532 stack-id: default, callee-saved-register: '$r7', callee-saved-restored: true,
533 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
534 - { id: 2, name: '', type: spill-slot, offset: -12, size: 4, alignment: 4,
535 stack-id: default, callee-saved-register: '$r6', callee-saved-restored: true,
536 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
537 - { id: 3, name: '', type: spill-slot, offset: -16, size: 4, alignment: 4,
538 stack-id: default, callee-saved-register: '$r5', callee-saved-restored: true,
539 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
540 - { id: 4, name: '', type: spill-slot, offset: -20, size: 4, alignment: 4,
541 stack-id: default, callee-saved-register: '$r4', callee-saved-restored: true,
542 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
543 - { id: 5, name: '', type: spill-slot, offset: -24, size: 4, alignment: 4,
544 stack-id: default, callee-saved-register: '$r8', callee-saved-restored: true,
545 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
548 machineFunctionInfo: {}
550 ; CHECK-LABEL: name: test2
552 ; CHECK: successors: %bb.3(0x30000000), %bb.1(0x50000000)
553 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r3, $r4, $r5, $r6, $r8
554 ; CHECK: frame-setup tPUSH 14 /* CC::al */, $noreg, killed $r4, killed $r5, killed $r6, killed $lr, implicit-def $sp, implicit $sp
555 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 20
556 ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4
557 ; CHECK: frame-setup CFI_INSTRUCTION offset $r7, -8
558 ; CHECK: frame-setup CFI_INSTRUCTION offset $r6, -12
559 ; CHECK: frame-setup CFI_INSTRUCTION offset $r5, -16
560 ; CHECK: frame-setup CFI_INSTRUCTION offset $r4, -20
561 ; CHECK: dead $r7 = frame-setup tADDrSPi $sp, 3, 14 /* CC::al */, $noreg
562 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa $r7, 8
563 ; CHECK: early-clobber $sp = frame-setup t2STR_PRE killed $r8, $sp, -4, 14 /* CC::al */, $noreg
564 ; CHECK: frame-setup CFI_INSTRUCTION offset $r8, -24
565 ; CHECK: renamable $r6, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
566 ; CHECK: t2CMPrs killed renamable $r6, renamable $r3, 11, 14 /* CC::al */, $noreg, implicit-def $cpsr
567 ; CHECK: tBcc %bb.3, 0 /* CC::eq */, killed $cpsr
568 ; CHECK: bb.1.vector.ph:
569 ; CHECK: successors: %bb.2(0x80000000)
570 ; CHECK: liveins: $r0, $r1, $r2, $r3
571 ; CHECK: renamable $r4, dead $cpsr = tLSRri renamable $r3, 1, 14 /* CC::al */, $noreg
572 ; CHECK: $r8 = tMOVr $r0, 14 /* CC::al */, $noreg
573 ; CHECK: $r5 = tMOVr $r1, 14 /* CC::al */, $noreg
574 ; CHECK: $r6 = tMOVr $r2, 14 /* CC::al */, $noreg
575 ; CHECK: $lr = MVE_DLSTP_32 killed renamable $r4
576 ; CHECK: bb.2.vector.body:
577 ; CHECK: successors: %bb.2(0x7c000000), %bb.3(0x04000000)
578 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r3, $r5, $r6, $r8
579 ; CHECK: renamable $r5, renamable $q0 = MVE_VLDRWU32_post killed renamable $r5, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv6264, align 4)
580 ; CHECK: renamable $r6, renamable $q1 = MVE_VLDRWU32_post killed renamable $r6, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv6567, align 4)
581 ; CHECK: renamable $q0 = nsw MVE_VMULi32 killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
582 ; CHECK: renamable $r8 = MVE_VSTRWU32_post killed renamable $q0, killed renamable $r8, 16, 0, killed $noreg :: (store (s128) into %ir.lsr.iv6870, align 4)
583 ; CHECK: $lr = MVE_LETP killed renamable $lr, %bb.2
584 ; CHECK: bb.3.for.cond4.preheader:
585 ; CHECK: successors: %bb.6(0x30000000), %bb.4(0x50000000)
586 ; CHECK: liveins: $r0, $r1, $r2, $r3
587 ; CHECK: tCBZ $r3, %bb.6
588 ; CHECK: bb.4.vector.ph39:
589 ; CHECK: successors: %bb.5(0x80000000)
590 ; CHECK: liveins: $r0, $r1, $r2, $r3
591 ; CHECK: $r4 = tMOVr $r0, 14 /* CC::al */, $noreg
592 ; CHECK: $lr = MVE_DLSTP_32 killed renamable $r3
593 ; CHECK: bb.5.vector.body38:
594 ; CHECK: successors: %bb.5(0x7c000000), %bb.6(0x04000000)
595 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r4
596 ; CHECK: renamable $r1, renamable $q0 = MVE_VLDRWU32_post killed renamable $r1, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv55, align 4)
597 ; CHECK: renamable $r2, renamable $q1 = MVE_VLDRWU32_post killed renamable $r2, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv5658, align 4)
598 ; CHECK: renamable $r4, renamable $q2 = MVE_VLDRWU32_post killed renamable $r4, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv5961, align 4)
599 ; CHECK: renamable $q0 = MVE_VEOR killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
600 ; CHECK: renamable $q0 = nsw MVE_VADDi32 killed renamable $q2, killed renamable $q0, 0, $noreg, undef renamable $q0
601 ; CHECK: MVE_VSTRWU32 killed renamable $q0, killed renamable $r0, 0, 0, killed $noreg :: (store (s128) into %ir.lsr.iv5961, align 4)
602 ; CHECK: $r0 = tMOVr $r4, 14 /* CC::al */, $noreg
603 ; CHECK: $lr = MVE_LETP killed renamable $lr, %bb.5
604 ; CHECK: bb.6.for.cond.cleanup6:
605 ; CHECK: $r8, $sp = t2LDR_POST $sp, 4, 14 /* CC::al */, $noreg
606 ; CHECK: tPOP_RET 14 /* CC::al */, $noreg, def $r4, def $r5, def $r6, def $r7, def $pc
608 successors: %bb.3(0x30000000), %bb.1(0x50000000)
609 liveins: $r0, $r1, $r2, $r3, $r4, $r5, $r6, $lr, $r8
611 frame-setup tPUSH 14, $noreg, killed $r4, killed $r5, killed $r6, killed $lr, implicit-def $sp, implicit $sp
612 frame-setup CFI_INSTRUCTION def_cfa_offset 20
613 frame-setup CFI_INSTRUCTION offset $lr, -4
614 frame-setup CFI_INSTRUCTION offset $r7, -8
615 frame-setup CFI_INSTRUCTION offset $r6, -12
616 frame-setup CFI_INSTRUCTION offset $r5, -16
617 frame-setup CFI_INSTRUCTION offset $r4, -20
618 $r7 = frame-setup tADDrSPi $sp, 3, 14, $noreg
619 frame-setup CFI_INSTRUCTION def_cfa $r7, 8
620 early-clobber $sp = frame-setup t2STR_PRE killed $r8, $sp, -4, 14, $noreg
621 frame-setup CFI_INSTRUCTION offset $r8, -24
622 renamable $r6, dead $cpsr = tMOVi8 0, 14, $noreg
623 renamable $r12 = t2MOVi 1, 14, $noreg, $noreg
624 t2CMPrs killed renamable $r6, renamable $r3, 11, 14, $noreg, implicit-def $cpsr
625 tBcc %bb.3, 0, killed $cpsr
628 successors: %bb.2(0x80000000)
629 liveins: $r0, $r1, $r2, $r3, $r12
631 renamable $r6, dead $cpsr = tMOVi8 3, 14, $noreg
632 renamable $r4, dead $cpsr = tLSRri renamable $r3, 1, 14, $noreg
633 renamable $r6 = nuw t2ADDrs killed renamable $r6, renamable $r3, 11, 14, $noreg, $noreg
634 $r8 = tMOVr $r0, 14, $noreg
635 renamable $r6 = t2BICri killed renamable $r6, 3, 14, $noreg, $noreg
636 $r5 = tMOVr $r1, 14, $noreg
637 renamable $r6, dead $cpsr = tSUBi8 killed renamable $r6, 4, 14, $noreg
638 renamable $lr = nuw nsw t2ADDrs renamable $r12, killed renamable $r6, 19, 14, $noreg, $noreg
639 $r6 = tMOVr $r2, 14, $noreg
640 $lr = t2DoLoopStart renamable $lr
643 successors: %bb.2(0x7c000000), %bb.3(0x04000000)
644 liveins: $lr, $r0, $r1, $r2, $r3, $r4, $r5, $r6, $r8, $r12
646 renamable $vpr = MVE_VCTP32 renamable $r4, 0, $noreg
647 MVE_VPST 4, implicit $vpr
648 renamable $r5, renamable $q0 = MVE_VLDRWU32_post killed renamable $r5, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv6264, align 4)
649 renamable $r6, renamable $q1 = MVE_VLDRWU32_post killed renamable $r6, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv6567, align 4)
650 renamable $r4, dead $cpsr = tSUBi8 killed renamable $r4, 4, 14, $noreg
651 renamable $q0 = nsw MVE_VMULi32 killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
652 MVE_VPST 8, implicit $vpr
653 renamable $r8 = MVE_VSTRWU32_post killed renamable $q0, killed renamable $r8, 16, 1, killed renamable $vpr :: (store (s128) into %ir.lsr.iv6870, align 4)
654 renamable $lr = t2LoopDec killed renamable $lr, 1
655 t2LoopEnd renamable $lr, %bb.2, implicit-def dead $cpsr
658 bb.3.for.cond4.preheader:
659 successors: %bb.6(0x30000000), %bb.4(0x50000000)
660 liveins: $r0, $r1, $r2, $r3, $r12
665 successors: %bb.5(0x80000000)
666 liveins: $r0, $r1, $r2, $r3, $r12
668 renamable $r6, dead $cpsr = tADDi3 renamable $r3, 3, 14, $noreg
669 $r4 = tMOVr $r0, 14, $noreg
670 renamable $r6 = t2BICri killed renamable $r6, 3, 14, $noreg, $noreg
671 renamable $r6, dead $cpsr = tSUBi8 killed renamable $r6, 4, 14, $noreg
672 renamable $lr = nuw nsw t2ADDrs killed renamable $r12, killed renamable $r6, 19, 14, $noreg, $noreg
673 $lr = t2DoLoopStart renamable $lr
676 successors: %bb.5(0x7c000000), %bb.6(0x04000000)
677 liveins: $lr, $r0, $r1, $r2, $r3, $r4
679 renamable $vpr = MVE_VCTP32 renamable $r3, 0, $noreg
680 MVE_VPST 2, implicit $vpr
681 renamable $r1, renamable $q0 = MVE_VLDRWU32_post killed renamable $r1, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv55, align 4)
682 renamable $r2, renamable $q1 = MVE_VLDRWU32_post killed renamable $r2, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv5658, align 4)
683 renamable $r4, renamable $q2 = MVE_VLDRWU32_post killed renamable $r4, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv5961, align 4)
684 renamable $q0 = MVE_VEOR killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
685 renamable $r3, dead $cpsr = tSUBi8 killed renamable $r3, 4, 14, $noreg
686 renamable $q0 = nsw MVE_VADDi32 killed renamable $q2, killed renamable $q0, 0, $noreg, undef renamable $q0
687 MVE_VPST 8, implicit $vpr
688 MVE_VSTRWU32 killed renamable $q0, killed renamable $r0, 0, 1, killed renamable $vpr :: (store (s128) into %ir.lsr.iv5961, align 4)
689 renamable $lr = t2LoopDec killed renamable $lr, 1
690 $r0 = tMOVr $r4, 14, $noreg
691 t2LoopEnd renamable $lr, %bb.5, implicit-def dead $cpsr
694 bb.6.for.cond.cleanup6:
695 $r8, $sp = t2LDR_POST $sp, 4, 14, $noreg
696 tPOP_RET 14, $noreg, def $r4, def $r5, def $r6, def $r7, def $pc
702 exposesReturnsTwice: false
704 regBankSelected: false
707 tracksRegLiveness: true
711 - { reg: '$r0', virtual-reg: '' }
712 - { reg: '$r1', virtual-reg: '' }
713 - { reg: '$r2', virtual-reg: '' }
714 - { reg: '$r3', virtual-reg: '' }
716 isFrameAddressTaken: false
717 isReturnAddressTaken: false
721 offsetAdjustment: -24
727 cvBytesOfCalleeSavedRegisters: 0
728 hasOpaqueSPAdjustment: false
730 hasMustTailInVarArgFunc: false
736 - { id: 0, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4,
737 stack-id: default, callee-saved-register: '$lr', callee-saved-restored: false,
738 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
739 - { id: 1, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4,
740 stack-id: default, callee-saved-register: '$r7', callee-saved-restored: true,
741 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
742 - { id: 2, name: '', type: spill-slot, offset: -12, size: 4, alignment: 4,
743 stack-id: default, callee-saved-register: '$r6', callee-saved-restored: true,
744 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
745 - { id: 3, name: '', type: spill-slot, offset: -16, size: 4, alignment: 4,
746 stack-id: default, callee-saved-register: '$r5', callee-saved-restored: true,
747 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
748 - { id: 4, name: '', type: spill-slot, offset: -20, size: 4, alignment: 4,
749 stack-id: default, callee-saved-register: '$r4', callee-saved-restored: true,
750 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
751 - { id: 5, name: '', type: spill-slot, offset: -24, size: 4, alignment: 4,
752 stack-id: default, callee-saved-register: '$r10', callee-saved-restored: true,
753 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
754 - { id: 6, name: '', type: spill-slot, offset: -28, size: 4, alignment: 4,
755 stack-id: default, callee-saved-register: '$r9', callee-saved-restored: true,
756 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
757 - { id: 7, name: '', type: spill-slot, offset: -32, size: 4, alignment: 4,
758 stack-id: default, callee-saved-register: '$r8', callee-saved-restored: true,
759 debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
762 machineFunctionInfo: {}
764 ; CHECK-LABEL: name: test3
766 ; CHECK: successors: %bb.9(0x30000000), %bb.1(0x50000000)
767 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r3, $r4, $r5, $r6, $r8, $r9, $r10
768 ; CHECK: frame-setup tPUSH 14 /* CC::al */, $noreg, killed $r4, killed $r5, killed $r6, killed $lr, implicit-def $sp, implicit $sp
769 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 20
770 ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4
771 ; CHECK: frame-setup CFI_INSTRUCTION offset $r7, -8
772 ; CHECK: frame-setup CFI_INSTRUCTION offset $r6, -12
773 ; CHECK: frame-setup CFI_INSTRUCTION offset $r5, -16
774 ; CHECK: frame-setup CFI_INSTRUCTION offset $r4, -20
775 ; CHECK: dead $r7 = frame-setup tADDrSPi $sp, 3, 14 /* CC::al */, $noreg
776 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa $r7, 8
777 ; CHECK: $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r8, killed $r9, killed $r10
778 ; CHECK: frame-setup CFI_INSTRUCTION offset $r10, -24
779 ; CHECK: frame-setup CFI_INSTRUCTION offset $r9, -28
780 ; CHECK: frame-setup CFI_INSTRUCTION offset $r8, -32
781 ; CHECK: tCMPi8 renamable $r3, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
782 ; CHECK: tBcc %bb.9, 0 /* CC::eq */, killed $cpsr
783 ; CHECK: bb.1.vector.ph:
784 ; CHECK: successors: %bb.2(0x80000000)
785 ; CHECK: liveins: $r0, $r1, $r2, $r3
786 ; CHECK: $r8 = tMOVr $r0, 14 /* CC::al */, $noreg
787 ; CHECK: $r5 = tMOVr $r2, 14 /* CC::al */, $noreg
788 ; CHECK: $r4 = tMOVr $r3, 14 /* CC::al */, $noreg
789 ; CHECK: $r6 = tMOVr $r1, 14 /* CC::al */, $noreg
790 ; CHECK: $lr = MVE_DLSTP_32 killed renamable $r4
791 ; CHECK: bb.2.vector.body:
792 ; CHECK: successors: %bb.2(0x7c000000), %bb.3(0x04000000)
793 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r3, $r5, $r6, $r8
794 ; CHECK: renamable $r6, renamable $q0 = MVE_VLDRWU32_post killed renamable $r6, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv117119, align 4)
795 ; CHECK: renamable $r5, renamable $q1 = MVE_VLDRWU32_post killed renamable $r5, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv120122, align 4)
796 ; CHECK: renamable $q0 = nsw MVE_VMULi32 killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
797 ; CHECK: renamable $r8 = MVE_VSTRWU32_post killed renamable $q0, killed renamable $r8, 16, 0, killed $noreg :: (store (s128) into %ir.lsr.iv123125, align 4)
798 ; CHECK: $lr = MVE_LETP killed renamable $lr, %bb.2
799 ; CHECK: bb.3.for.cond4.preheader:
800 ; CHECK: successors: %bb.6(0x30000000), %bb.4(0x50000000)
801 ; CHECK: liveins: $r0, $r1, $r2, $r3
802 ; CHECK: renamable $r6, dead $cpsr = tMOVi8 0, 14 /* CC::al */, $noreg
803 ; CHECK: t2CMPrs killed renamable $r6, renamable $r3, 11, 14 /* CC::al */, $noreg, implicit-def $cpsr
804 ; CHECK: tBcc %bb.6, 0 /* CC::eq */, killed $cpsr
805 ; CHECK: bb.4.vector.ph66:
806 ; CHECK: successors: %bb.5(0x80000000)
807 ; CHECK: liveins: $r0, $r1, $r2, $r3
808 ; CHECK: renamable $r5, dead $cpsr = tLSRri renamable $r3, 1, 14 /* CC::al */, $noreg
809 ; CHECK: $r10 = tMOVr $r0, 14 /* CC::al */, $noreg
810 ; CHECK: $r9 = tMOVr $r2, 14 /* CC::al */, $noreg
811 ; CHECK: $r4 = tMOVr $r1, 14 /* CC::al */, $noreg
812 ; CHECK: $r6 = tMOVr $r0, 14 /* CC::al */, $noreg
813 ; CHECK: $lr = MVE_DLSTP_32 killed renamable $r5
814 ; CHECK: bb.5.vector.body65:
815 ; CHECK: successors: %bb.5(0x7c000000), %bb.6(0x04000000)
816 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r3, $r4, $r6, $r9, $r10
817 ; CHECK: renamable $r4, renamable $q0 = MVE_VLDRWU32_post killed renamable $r4, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv108110, align 4)
818 ; CHECK: renamable $r9, renamable $q1 = MVE_VLDRWU32_post killed renamable $r9, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv111113, align 4)
819 ; CHECK: renamable $r6, renamable $q2 = MVE_VLDRWU32_post killed renamable $r6, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv114116, align 4)
820 ; CHECK: renamable $q0 = MVE_VEOR killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
821 ; CHECK: renamable $q0 = nsw MVE_VADDi32 killed renamable $q2, killed renamable $q0, 0, $noreg, undef renamable $q0
822 ; CHECK: MVE_VSTRWU32 killed renamable $q0, killed renamable $r10, 0, 0, killed $noreg :: (store (s128) into %ir.lsr.iv114116, align 4)
823 ; CHECK: $r10 = tMOVr $r6, 14 /* CC::al */, $noreg
824 ; CHECK: $lr = MVE_LETP killed renamable $lr, %bb.5
825 ; CHECK: bb.6.for.cond15.preheader:
826 ; CHECK: successors: %bb.9(0x30000000), %bb.7(0x50000000)
827 ; CHECK: liveins: $r0, $r1, $r2, $r3
828 ; CHECK: tCBZ $r3, %bb.9
829 ; CHECK: bb.7.vector.ph85:
830 ; CHECK: successors: %bb.8(0x80000000)
831 ; CHECK: liveins: $r0, $r1, $r2, $r3
832 ; CHECK: $r5 = tMOVr $r0, 14 /* CC::al */, $noreg
833 ; CHECK: $lr = MVE_DLSTP_32 killed renamable $r3
834 ; CHECK: bb.8.vector.body84:
835 ; CHECK: successors: %bb.8(0x7c000000), %bb.9(0x04000000)
836 ; CHECK: liveins: $lr, $r0, $r1, $r2, $r5
837 ; CHECK: renamable $r1, renamable $q0 = MVE_VLDRWU32_post killed renamable $r1, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv101, align 4)
838 ; CHECK: renamable $r2, renamable $q1 = MVE_VLDRWU32_post killed renamable $r2, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv102104, align 4)
839 ; CHECK: renamable $r5, renamable $q2 = MVE_VLDRWU32_post killed renamable $r5, 16, 0, $noreg :: (load (s128) from %ir.lsr.iv105107, align 4)
840 ; CHECK: renamable $q0 = MVE_VADDi32 killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
841 ; CHECK: renamable $q0 = MVE_VSUBi32 killed renamable $q2, killed renamable $q0, 0, $noreg, undef renamable $q0
842 ; CHECK: MVE_VSTRWU32 killed renamable $q0, killed renamable $r0, 0, 0, killed $noreg :: (store (s128) into %ir.lsr.iv105107, align 4)
843 ; CHECK: $r0 = tMOVr $r5, 14 /* CC::al */, $noreg
844 ; CHECK: $lr = MVE_LETP killed renamable $lr, %bb.8
845 ; CHECK: bb.9.for.cond.cleanup17:
846 ; CHECK: $sp = t2LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r8, def $r9, def $r10
847 ; CHECK: tPOP_RET 14 /* CC::al */, $noreg, def $r4, def $r5, def $r6, def $r7, def $pc
849 successors: %bb.9(0x30000000), %bb.1(0x50000000)
850 liveins: $r0, $r1, $r2, $r3, $r4, $r5, $r6, $lr, $r8, $r9, $r10
852 frame-setup tPUSH 14, $noreg, killed $r4, killed $r5, killed $r6, killed $lr, implicit-def $sp, implicit $sp
853 frame-setup CFI_INSTRUCTION def_cfa_offset 20
854 frame-setup CFI_INSTRUCTION offset $lr, -4
855 frame-setup CFI_INSTRUCTION offset $r7, -8
856 frame-setup CFI_INSTRUCTION offset $r6, -12
857 frame-setup CFI_INSTRUCTION offset $r5, -16
858 frame-setup CFI_INSTRUCTION offset $r4, -20
859 $r7 = frame-setup tADDrSPi $sp, 3, 14, $noreg
860 frame-setup CFI_INSTRUCTION def_cfa $r7, 8
861 $sp = frame-setup t2STMDB_UPD $sp, 14, $noreg, killed $r8, killed $r9, killed $r10
862 frame-setup CFI_INSTRUCTION offset $r10, -24
863 frame-setup CFI_INSTRUCTION offset $r9, -28
864 frame-setup CFI_INSTRUCTION offset $r8, -32
865 tCMPi8 renamable $r3, 0, 14, $noreg, implicit-def $cpsr
866 tBcc %bb.9, 0, killed $cpsr
869 successors: %bb.2(0x80000000)
870 liveins: $r0, $r1, $r2, $r3
872 renamable $r6, dead $cpsr = tADDi3 renamable $r3, 3, 14, $noreg
873 $r8 = tMOVr $r0, 14, $noreg
874 renamable $r6 = t2BICri killed renamable $r6, 3, 14, $noreg, $noreg
875 $r5 = tMOVr $r2, 14, $noreg
876 renamable $r12 = t2SUBri killed renamable $r6, 4, 14, $noreg, $noreg
877 renamable $r6, dead $cpsr = tMOVi8 1, 14, $noreg
878 $r4 = tMOVr $r3, 14, $noreg
879 renamable $lr = nuw nsw t2ADDrs killed renamable $r6, renamable $r12, 19, 14, $noreg, $noreg
880 $r6 = tMOVr $r1, 14, $noreg
881 $lr = t2DoLoopStart renamable $lr
884 successors: %bb.2(0x7c000000), %bb.3(0x04000000)
885 liveins: $lr, $r0, $r1, $r2, $r3, $r4, $r5, $r6, $r8, $r12
887 renamable $vpr = MVE_VCTP32 renamable $r4, 0, $noreg
888 MVE_VPST 4, implicit $vpr
889 renamable $r6, renamable $q0 = MVE_VLDRWU32_post killed renamable $r6, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv117119, align 4)
890 renamable $r5, renamable $q1 = MVE_VLDRWU32_post killed renamable $r5, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv120122, align 4)
891 renamable $r4, dead $cpsr = tSUBi8 killed renamable $r4, 4, 14, $noreg
892 renamable $q0 = nsw MVE_VMULi32 killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
893 MVE_VPST 8, implicit $vpr
894 renamable $r8 = MVE_VSTRWU32_post killed renamable $q0, killed renamable $r8, 16, 1, killed renamable $vpr :: (store (s128) into %ir.lsr.iv123125, align 4)
895 renamable $lr = t2LoopDec killed renamable $lr, 1
896 t2LoopEnd renamable $lr, %bb.2, implicit-def dead $cpsr
899 bb.3.for.cond4.preheader:
900 successors: %bb.6(0x30000000), %bb.4(0x50000000)
901 liveins: $r0, $r1, $r2, $r3, $r12
903 renamable $r6, dead $cpsr = tMOVi8 0, 14, $noreg
904 renamable $r8 = t2MOVi 1, 14, $noreg, $noreg
905 t2CMPrs killed renamable $r6, renamable $r3, 11, 14, $noreg, implicit-def $cpsr
906 tBcc %bb.6, 0, killed $cpsr
909 successors: %bb.5(0x80000000)
910 liveins: $r0, $r1, $r2, $r3, $r8, $r12
912 renamable $r6, dead $cpsr = tMOVi8 3, 14, $noreg
913 renamable $r5, dead $cpsr = tLSRri renamable $r3, 1, 14, $noreg
914 renamable $r6 = nuw t2ADDrs killed renamable $r6, renamable $r3, 11, 14, $noreg, $noreg
915 $r10 = tMOVr $r0, 14, $noreg
916 renamable $r6 = t2BICri killed renamable $r6, 3, 14, $noreg, $noreg
917 $r9 = tMOVr $r2, 14, $noreg
918 renamable $r6, dead $cpsr = tSUBi8 killed renamable $r6, 4, 14, $noreg
919 $r4 = tMOVr $r1, 14, $noreg
920 renamable $lr = nuw nsw t2ADDrs renamable $r8, killed renamable $r6, 19, 14, $noreg, $noreg
921 $r6 = tMOVr $r0, 14, $noreg
922 $lr = t2DoLoopStart renamable $lr
925 successors: %bb.5(0x7c000000), %bb.6(0x04000000)
926 liveins: $lr, $r0, $r1, $r2, $r3, $r4, $r5, $r6, $r8, $r9, $r10, $r12
928 renamable $vpr = MVE_VCTP32 renamable $r5, 0, $noreg
929 MVE_VPST 2, implicit $vpr
930 renamable $r4, renamable $q0 = MVE_VLDRWU32_post killed renamable $r4, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv108110, align 4)
931 renamable $r9, renamable $q1 = MVE_VLDRWU32_post killed renamable $r9, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv111113, align 4)
932 renamable $r6, renamable $q2 = MVE_VLDRWU32_post killed renamable $r6, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv114116, align 4)
933 renamable $q0 = MVE_VEOR killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
934 renamable $r5, dead $cpsr = tSUBi8 killed renamable $r5, 4, 14, $noreg
935 renamable $q0 = nsw MVE_VADDi32 killed renamable $q2, killed renamable $q0, 0, $noreg, undef renamable $q0
936 MVE_VPST 8, implicit $vpr
937 MVE_VSTRWU32 killed renamable $q0, killed renamable $r10, 0, 1, killed renamable $vpr :: (store (s128) into %ir.lsr.iv114116, align 4)
938 renamable $lr = t2LoopDec killed renamable $lr, 1
939 $r10 = tMOVr $r6, 14, $noreg
940 t2LoopEnd renamable $lr, %bb.5, implicit-def dead $cpsr
943 bb.6.for.cond15.preheader:
944 successors: %bb.9(0x30000000), %bb.7(0x50000000)
945 liveins: $r0, $r1, $r2, $r3, $r8, $r12
950 successors: %bb.8(0x80000000)
951 liveins: $r0, $r1, $r2, $r3, $r8, $r12
953 renamable $lr = nuw nsw t2ADDrs killed renamable $r8, killed renamable $r12, 19, 14, $noreg, $noreg
954 $r5 = tMOVr $r0, 14, $noreg
955 $lr = t2DoLoopStart renamable $lr
958 successors: %bb.8(0x7c000000), %bb.9(0x04000000)
959 liveins: $lr, $r0, $r1, $r2, $r3, $r5
961 renamable $vpr = MVE_VCTP32 renamable $r3, 0, $noreg
962 MVE_VPST 2, implicit $vpr
963 renamable $r1, renamable $q0 = MVE_VLDRWU32_post killed renamable $r1, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv101, align 4)
964 renamable $r2, renamable $q1 = MVE_VLDRWU32_post killed renamable $r2, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv102104, align 4)
965 renamable $r5, renamable $q2 = MVE_VLDRWU32_post killed renamable $r5, 16, 1, renamable $vpr :: (load (s128) from %ir.lsr.iv105107, align 4)
966 renamable $q0 = MVE_VADDi32 killed renamable $q1, killed renamable $q0, 0, $noreg, undef renamable $q0
967 renamable $r3, dead $cpsr = tSUBi8 killed renamable $r3, 4, 14, $noreg
968 renamable $q0 = MVE_VSUBi32 killed renamable $q2, killed renamable $q0, 0, $noreg, undef renamable $q0
969 MVE_VPST 8, implicit $vpr
970 MVE_VSTRWU32 killed renamable $q0, killed renamable $r0, 0, 1, killed renamable $vpr :: (store (s128) into %ir.lsr.iv105107, align 4)
971 renamable $lr = t2LoopDec killed renamable $lr, 1
972 $r0 = tMOVr $r5, 14, $noreg
973 t2LoopEnd renamable $lr, %bb.8, implicit-def dead $cpsr
976 bb.9.for.cond.cleanup17:
977 $sp = t2LDMIA_UPD $sp, 14, $noreg, def $r8, def $r9, def $r10
978 tPOP_RET 14, $noreg, def $r4, def $r5, def $r6, def $r7, def $pc