509 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp,+fp64 -verify-machineinstrs %s -o - | FileCheck %s3 4define void @arm_cmplx_mag_squared_f16(ptr nocapture readonly %pSrc, ptr nocapture %pDst, i32 %numSamples) {5; CHECK-LABEL: arm_cmplx_mag_squared_f16:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: .save {r4, r5, r7, lr}8; CHECK-NEXT: push {r4, r5, r7, lr}9; CHECK-NEXT: cmp r2, #010; CHECK-NEXT: beq .LBB0_811; CHECK-NEXT: @ %bb.1: @ %while.body.preheader12; CHECK-NEXT: cmp r2, #813; CHECK-NEXT: blo .LBB0_914; CHECK-NEXT: @ %bb.2: @ %vector.memcheck15; CHECK-NEXT: add.w r3, r0, r2, lsl #216; CHECK-NEXT: cmp r3, r117; CHECK-NEXT: itt hi18; CHECK-NEXT: addhi.w r3, r1, r2, lsl #119; CHECK-NEXT: cmphi r3, r020; CHECK-NEXT: bhi .LBB0_921; CHECK-NEXT: @ %bb.3: @ %vector.ph22; CHECK-NEXT: bic r4, r2, #723; CHECK-NEXT: movs r5, #124; CHECK-NEXT: sub.w r3, r4, #825; CHECK-NEXT: add.w r12, r1, r4, lsl #126; CHECK-NEXT: add.w lr, r5, r3, lsr #327; CHECK-NEXT: add.w r3, r0, r4, lsl #228; CHECK-NEXT: and r5, r2, #729; CHECK-NEXT: .LBB0_4: @ %vector.body30; CHECK-NEXT: @ =>This Inner Loop Header: Depth=131; CHECK-NEXT: vld20.16 {q0, q1}, [r0]32; CHECK-NEXT: vld21.16 {q0, q1}, [r0]!33; CHECK-NEXT: vmul.f16 q0, q0, q034; CHECK-NEXT: vfma.f16 q0, q1, q135; CHECK-NEXT: vstrb.8 q0, [r1], #1636; CHECK-NEXT: le lr, .LBB0_437; CHECK-NEXT: @ %bb.5: @ %middle.block38; CHECK-NEXT: cmp r4, r239; CHECK-NEXT: it eq40; CHECK-NEXT: popeq {r4, r5, r7, pc}41; CHECK-NEXT: .LBB0_6: @ %while.body.preheader2642; CHECK-NEXT: dls lr, r543; CHECK-NEXT: .LBB0_7: @ %while.body44; CHECK-NEXT: @ =>This Inner Loop Header: Depth=145; CHECK-NEXT: vldr.16 s0, [r3]46; CHECK-NEXT: vldr.16 s2, [r3, #2]47; CHECK-NEXT: adds r3, #448; CHECK-NEXT: vmul.f16 s0, s0, s049; CHECK-NEXT: vfma.f16 s0, s2, s250; CHECK-NEXT: vstr.16 s0, [r12]51; CHECK-NEXT: add.w r12, r12, #252; CHECK-NEXT: le lr, .LBB0_753; CHECK-NEXT: .LBB0_8: @ %while.end54; CHECK-NEXT: pop {r4, r5, r7, pc}55; CHECK-NEXT: .LBB0_9:56; CHECK-NEXT: mov r3, r057; CHECK-NEXT: mov r12, r158; CHECK-NEXT: mov r5, r259; CHECK-NEXT: b .LBB0_660entry:61 %cmp.not11 = icmp eq i32 %numSamples, 062 br i1 %cmp.not11, label %while.end, label %while.body.preheader63 64while.body.preheader: ; preds = %entry65 %min.iters.check = icmp ult i32 %numSamples, 866 br i1 %min.iters.check, label %while.body.preheader26, label %vector.memcheck67 68vector.memcheck: ; preds = %while.body.preheader69 %scevgep = getelementptr half, ptr %pDst, i32 %numSamples70 %0 = shl i32 %numSamples, 171 %scevgep18 = getelementptr half, ptr %pSrc, i32 %072 %bound0 = icmp ugt ptr %scevgep18, %pDst73 %bound1 = icmp ugt ptr %scevgep, %pSrc74 %found.conflict = and i1 %bound0, %bound175 br i1 %found.conflict, label %while.body.preheader26, label %vector.ph76 77vector.ph: ; preds = %vector.memcheck78 %n.vec = and i32 %numSamples, -879 %1 = shl i32 %n.vec, 180 %ind.end = getelementptr half, ptr %pSrc, i32 %181 %ind.end21 = getelementptr half, ptr %pDst, i32 %n.vec82 %ind.end23 = and i32 %numSamples, 783 br label %vector.body84 85vector.body: ; preds = %vector.body, %vector.ph86 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]87 %2 = shl i32 %index, 188 %next.gep = getelementptr half, ptr %pSrc, i32 %289 %next.gep24 = getelementptr half, ptr %pDst, i32 %index90 %wide.vec = load <16 x half>, ptr %next.gep, align 291 %3 = fmul fast <16 x half> %wide.vec, %wide.vec92 %4 = shufflevector <16 x half> %3, <16 x half> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>93 %5 = fmul fast <16 x half> %wide.vec, %wide.vec94 %6 = shufflevector <16 x half> %5, <16 x half> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>95 %7 = fadd fast <8 x half> %6, %496 store <8 x half> %7, ptr %next.gep24, align 297 %index.next = add i32 %index, 898 %8 = icmp eq i32 %index.next, %n.vec99 br i1 %8, label %middle.block, label %vector.body100 101middle.block: ; preds = %vector.body102 %cmp.n = icmp eq i32 %n.vec, %numSamples103 br i1 %cmp.n, label %while.end, label %while.body.preheader26104 105while.body.preheader26: ; preds = %middle.block, %vector.memcheck, %while.body.preheader106 %pSrc.addr.014.ph = phi ptr [ %pSrc, %vector.memcheck ], [ %pSrc, %while.body.preheader ], [ %ind.end, %middle.block ]107 %pDst.addr.013.ph = phi ptr [ %pDst, %vector.memcheck ], [ %pDst, %while.body.preheader ], [ %ind.end21, %middle.block ]108 %blkCnt.012.ph = phi i32 [ %numSamples, %vector.memcheck ], [ %numSamples, %while.body.preheader ], [ %ind.end23, %middle.block ]109 br label %while.body110 111while.body: ; preds = %while.body.preheader26, %while.body112 %pSrc.addr.014 = phi ptr [ %incdec.ptr1, %while.body ], [ %pSrc.addr.014.ph, %while.body.preheader26 ]113 %pDst.addr.013 = phi ptr [ %incdec.ptr3, %while.body ], [ %pDst.addr.013.ph, %while.body.preheader26 ]114 %blkCnt.012 = phi i32 [ %dec, %while.body ], [ %blkCnt.012.ph, %while.body.preheader26 ]115 %incdec.ptr = getelementptr inbounds half, ptr %pSrc.addr.014, i32 1116 %9 = load half, ptr %pSrc.addr.014, align 2117 %incdec.ptr1 = getelementptr inbounds half, ptr %pSrc.addr.014, i32 2118 %10 = load half, ptr %incdec.ptr, align 2119 %mul = fmul fast half %9, %9120 %mul2 = fmul fast half %10, %10121 %add = fadd fast half %mul2, %mul122 %incdec.ptr3 = getelementptr inbounds half, ptr %pDst.addr.013, i32 1123 store half %add, ptr %pDst.addr.013, align 2124 %dec = add i32 %blkCnt.012, -1125 %cmp.not = icmp eq i32 %dec, 0126 br i1 %cmp.not, label %while.end, label %while.body127 128while.end: ; preds = %while.body, %middle.block, %entry129 ret void130}131 132define void @arm_cmplx_mag_squared_f32(ptr nocapture readonly %pSrc, ptr nocapture %pDst, i32 %numSamples) {133; CHECK-LABEL: arm_cmplx_mag_squared_f32:134; CHECK: @ %bb.0: @ %entry135; CHECK-NEXT: .save {r4, r5, r7, lr}136; CHECK-NEXT: push {r4, r5, r7, lr}137; CHECK-NEXT: cbz r2, .LBB1_8138; CHECK-NEXT: @ %bb.1: @ %while.body.preheader139; CHECK-NEXT: cmp r2, #4140; CHECK-NEXT: blo .LBB1_9141; CHECK-NEXT: @ %bb.2: @ %vector.memcheck142; CHECK-NEXT: add.w r3, r0, r2, lsl #3143; CHECK-NEXT: cmp r3, r1144; CHECK-NEXT: itt hi145; CHECK-NEXT: addhi.w r3, r1, r2, lsl #2146; CHECK-NEXT: cmphi r3, r0147; CHECK-NEXT: bhi .LBB1_9148; CHECK-NEXT: @ %bb.3: @ %vector.ph149; CHECK-NEXT: bic r4, r2, #3150; CHECK-NEXT: movs r5, #1151; CHECK-NEXT: subs r3, r4, #4152; CHECK-NEXT: add.w r12, r1, r4, lsl #2153; CHECK-NEXT: add.w lr, r5, r3, lsr #2154; CHECK-NEXT: add.w r3, r0, r4, lsl #3155; CHECK-NEXT: and r5, r2, #3156; CHECK-NEXT: .LBB1_4: @ %vector.body157; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1158; CHECK-NEXT: vld20.32 {q0, q1}, [r0]159; CHECK-NEXT: vld21.32 {q0, q1}, [r0]!160; CHECK-NEXT: vmul.f32 q0, q0, q0161; CHECK-NEXT: vfma.f32 q0, q1, q1162; CHECK-NEXT: vstrb.8 q0, [r1], #16163; CHECK-NEXT: le lr, .LBB1_4164; CHECK-NEXT: @ %bb.5: @ %middle.block165; CHECK-NEXT: cmp r4, r2166; CHECK-NEXT: it eq167; CHECK-NEXT: popeq {r4, r5, r7, pc}168; CHECK-NEXT: .LBB1_6: @ %while.body.preheader26169; CHECK-NEXT: dls lr, r5170; CHECK-NEXT: .LBB1_7: @ %while.body171; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1172; CHECK-NEXT: vldr s0, [r3]173; CHECK-NEXT: vldr s2, [r3, #4]174; CHECK-NEXT: adds r3, #8175; CHECK-NEXT: vmul.f32 s0, s0, s0176; CHECK-NEXT: vfma.f32 s0, s2, s2177; CHECK-NEXT: vstmia r12!, {s0}178; CHECK-NEXT: le lr, .LBB1_7179; CHECK-NEXT: .LBB1_8: @ %while.end180; CHECK-NEXT: pop {r4, r5, r7, pc}181; CHECK-NEXT: .LBB1_9:182; CHECK-NEXT: mov r3, r0183; CHECK-NEXT: mov r12, r1184; CHECK-NEXT: mov r5, r2185; CHECK-NEXT: b .LBB1_6186entry:187 %cmp.not11 = icmp eq i32 %numSamples, 0188 br i1 %cmp.not11, label %while.end, label %while.body.preheader189 190while.body.preheader: ; preds = %entry191 %min.iters.check = icmp ult i32 %numSamples, 4192 br i1 %min.iters.check, label %while.body.preheader26, label %vector.memcheck193 194vector.memcheck: ; preds = %while.body.preheader195 %scevgep = getelementptr float, ptr %pDst, i32 %numSamples196 %0 = shl i32 %numSamples, 1197 %scevgep18 = getelementptr float, ptr %pSrc, i32 %0198 %bound0 = icmp ugt ptr %scevgep18, %pDst199 %bound1 = icmp ugt ptr %scevgep, %pSrc200 %found.conflict = and i1 %bound0, %bound1201 br i1 %found.conflict, label %while.body.preheader26, label %vector.ph202 203vector.ph: ; preds = %vector.memcheck204 %n.vec = and i32 %numSamples, -4205 %1 = shl i32 %n.vec, 1206 %ind.end = getelementptr float, ptr %pSrc, i32 %1207 %ind.end21 = getelementptr float, ptr %pDst, i32 %n.vec208 %ind.end23 = and i32 %numSamples, 3209 br label %vector.body210 211vector.body: ; preds = %vector.body, %vector.ph212 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]213 %2 = shl i32 %index, 1214 %next.gep = getelementptr float, ptr %pSrc, i32 %2215 %next.gep24 = getelementptr float, ptr %pDst, i32 %index216 %wide.vec = load <8 x float>, ptr %next.gep, align 4217 %3 = fmul fast <8 x float> %wide.vec, %wide.vec218 %4 = shufflevector <8 x float> %3, <8 x float> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>219 %5 = fmul fast <8 x float> %wide.vec, %wide.vec220 %6 = shufflevector <8 x float> %5, <8 x float> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>221 %7 = fadd fast <4 x float> %6, %4222 store <4 x float> %7, ptr %next.gep24, align 4223 %index.next = add i32 %index, 4224 %8 = icmp eq i32 %index.next, %n.vec225 br i1 %8, label %middle.block, label %vector.body226 227middle.block: ; preds = %vector.body228 %cmp.n = icmp eq i32 %n.vec, %numSamples229 br i1 %cmp.n, label %while.end, label %while.body.preheader26230 231while.body.preheader26: ; preds = %middle.block, %vector.memcheck, %while.body.preheader232 %pSrc.addr.014.ph = phi ptr [ %pSrc, %vector.memcheck ], [ %pSrc, %while.body.preheader ], [ %ind.end, %middle.block ]233 %pDst.addr.013.ph = phi ptr [ %pDst, %vector.memcheck ], [ %pDst, %while.body.preheader ], [ %ind.end21, %middle.block ]234 %blkCnt.012.ph = phi i32 [ %numSamples, %vector.memcheck ], [ %numSamples, %while.body.preheader ], [ %ind.end23, %middle.block ]235 br label %while.body236 237while.body: ; preds = %while.body.preheader26, %while.body238 %pSrc.addr.014 = phi ptr [ %incdec.ptr1, %while.body ], [ %pSrc.addr.014.ph, %while.body.preheader26 ]239 %pDst.addr.013 = phi ptr [ %incdec.ptr3, %while.body ], [ %pDst.addr.013.ph, %while.body.preheader26 ]240 %blkCnt.012 = phi i32 [ %dec, %while.body ], [ %blkCnt.012.ph, %while.body.preheader26 ]241 %incdec.ptr = getelementptr inbounds float, ptr %pSrc.addr.014, i32 1242 %9 = load float, ptr %pSrc.addr.014, align 4243 %incdec.ptr1 = getelementptr inbounds float, ptr %pSrc.addr.014, i32 2244 %10 = load float, ptr %incdec.ptr, align 4245 %mul = fmul fast float %9, %9246 %mul2 = fmul fast float %10, %10247 %add = fadd fast float %mul2, %mul248 %incdec.ptr3 = getelementptr inbounds float, ptr %pDst.addr.013, i32 1249 store float %add, ptr %pDst.addr.013, align 4250 %dec = add i32 %blkCnt.012, -1251 %cmp.not = icmp eq i32 %dec, 0252 br i1 %cmp.not, label %while.end, label %while.body253 254while.end: ; preds = %while.body, %middle.block, %entry255 ret void256}257 258define void @arm_cmplx_mag_squared_f16_cse(ptr nocapture readonly %pSrc, ptr nocapture %pDst, i32 %numSamples) {259; CHECK-LABEL: arm_cmplx_mag_squared_f16_cse:260; CHECK: @ %bb.0: @ %entry261; CHECK-NEXT: .save {r4, r5, r7, lr}262; CHECK-NEXT: push {r4, r5, r7, lr}263; CHECK-NEXT: cmp r2, #0264; CHECK-NEXT: beq .LBB2_8265; CHECK-NEXT: @ %bb.1: @ %while.body.preheader266; CHECK-NEXT: cmp r2, #8267; CHECK-NEXT: blo .LBB2_9268; CHECK-NEXT: @ %bb.2: @ %vector.memcheck269; CHECK-NEXT: add.w r3, r0, r2, lsl #2270; CHECK-NEXT: cmp r3, r1271; CHECK-NEXT: itt hi272; CHECK-NEXT: addhi.w r3, r1, r2, lsl #1273; CHECK-NEXT: cmphi r3, r0274; CHECK-NEXT: bhi .LBB2_9275; CHECK-NEXT: @ %bb.3: @ %vector.ph276; CHECK-NEXT: bic r4, r2, #7277; CHECK-NEXT: movs r5, #1278; CHECK-NEXT: sub.w r3, r4, #8279; CHECK-NEXT: add.w r12, r1, r4, lsl #1280; CHECK-NEXT: add.w lr, r5, r3, lsr #3281; CHECK-NEXT: add.w r3, r0, r4, lsl #2282; CHECK-NEXT: and r5, r2, #7283; CHECK-NEXT: .LBB2_4: @ %vector.body284; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1285; CHECK-NEXT: vld20.16 {q0, q1}, [r0]286; CHECK-NEXT: vld21.16 {q0, q1}, [r0]!287; CHECK-NEXT: vmul.f16 q0, q0, q0288; CHECK-NEXT: vfma.f16 q0, q1, q1289; CHECK-NEXT: vstrb.8 q0, [r1], #16290; CHECK-NEXT: le lr, .LBB2_4291; CHECK-NEXT: @ %bb.5: @ %middle.block292; CHECK-NEXT: cmp r4, r2293; CHECK-NEXT: it eq294; CHECK-NEXT: popeq {r4, r5, r7, pc}295; CHECK-NEXT: .LBB2_6: @ %while.body.preheader26296; CHECK-NEXT: dls lr, r5297; CHECK-NEXT: .LBB2_7: @ %while.body298; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1299; CHECK-NEXT: vldr.16 s0, [r3]300; CHECK-NEXT: vldr.16 s2, [r3, #2]301; CHECK-NEXT: adds r3, #4302; CHECK-NEXT: vmul.f16 s0, s0, s0303; CHECK-NEXT: vfma.f16 s0, s2, s2304; CHECK-NEXT: vstr.16 s0, [r12]305; CHECK-NEXT: add.w r12, r12, #2306; CHECK-NEXT: le lr, .LBB2_7307; CHECK-NEXT: .LBB2_8: @ %while.end308; CHECK-NEXT: pop {r4, r5, r7, pc}309; CHECK-NEXT: .LBB2_9:310; CHECK-NEXT: mov r3, r0311; CHECK-NEXT: mov r12, r1312; CHECK-NEXT: mov r5, r2313; CHECK-NEXT: b .LBB2_6314entry:315 %cmp.not11 = icmp eq i32 %numSamples, 0316 br i1 %cmp.not11, label %while.end, label %while.body.preheader317 318while.body.preheader: ; preds = %entry319 %min.iters.check = icmp ult i32 %numSamples, 8320 br i1 %min.iters.check, label %while.body.preheader26, label %vector.memcheck321 322vector.memcheck: ; preds = %while.body.preheader323 %scevgep = getelementptr half, ptr %pDst, i32 %numSamples324 %0 = shl i32 %numSamples, 1325 %scevgep18 = getelementptr half, ptr %pSrc, i32 %0326 %bound0 = icmp ugt ptr %scevgep18, %pDst327 %bound1 = icmp ugt ptr %scevgep, %pSrc328 %found.conflict = and i1 %bound0, %bound1329 br i1 %found.conflict, label %while.body.preheader26, label %vector.ph330 331vector.ph: ; preds = %vector.memcheck332 %n.vec = and i32 %numSamples, -8333 %1 = shl i32 %n.vec, 1334 %ind.end = getelementptr half, ptr %pSrc, i32 %1335 %ind.end21 = getelementptr half, ptr %pDst, i32 %n.vec336 %ind.end23 = and i32 %numSamples, 7337 br label %vector.body338 339vector.body: ; preds = %vector.body, %vector.ph340 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]341 %2 = shl i32 %index, 1342 %next.gep = getelementptr half, ptr %pSrc, i32 %2343 %next.gep24 = getelementptr half, ptr %pDst, i32 %index344 %wide.vec = load <16 x half>, ptr %next.gep, align 2345 %3 = fmul fast <16 x half> %wide.vec, %wide.vec346 %4 = shufflevector <16 x half> %3, <16 x half> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>347 %5 = shufflevector <16 x half> %3, <16 x half> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>348 %6 = fadd fast <8 x half> %5, %4349 store <8 x half> %6, ptr %next.gep24, align 2350 %index.next = add i32 %index, 8351 %7 = icmp eq i32 %index.next, %n.vec352 br i1 %7, label %middle.block, label %vector.body353 354middle.block: ; preds = %vector.body355 %cmp.n = icmp eq i32 %n.vec, %numSamples356 br i1 %cmp.n, label %while.end, label %while.body.preheader26357 358while.body.preheader26: ; preds = %middle.block, %vector.memcheck, %while.body.preheader359 %pSrc.addr.014.ph = phi ptr [ %pSrc, %vector.memcheck ], [ %pSrc, %while.body.preheader ], [ %ind.end, %middle.block ]360 %pDst.addr.013.ph = phi ptr [ %pDst, %vector.memcheck ], [ %pDst, %while.body.preheader ], [ %ind.end21, %middle.block ]361 %blkCnt.012.ph = phi i32 [ %numSamples, %vector.memcheck ], [ %numSamples, %while.body.preheader ], [ %ind.end23, %middle.block ]362 br label %while.body363 364while.body: ; preds = %while.body, %while.body.preheader26365 %pSrc.addr.014 = phi ptr [ %incdec.ptr1, %while.body ], [ %pSrc.addr.014.ph, %while.body.preheader26 ]366 %pDst.addr.013 = phi ptr [ %incdec.ptr3, %while.body ], [ %pDst.addr.013.ph, %while.body.preheader26 ]367 %blkCnt.012 = phi i32 [ %dec, %while.body ], [ %blkCnt.012.ph, %while.body.preheader26 ]368 %incdec.ptr = getelementptr inbounds half, ptr %pSrc.addr.014, i32 1369 %8 = load half, ptr %pSrc.addr.014, align 2370 %incdec.ptr1 = getelementptr inbounds half, ptr %pSrc.addr.014, i32 2371 %9 = load half, ptr %incdec.ptr, align 2372 %mul = fmul fast half %8, %8373 %mul2 = fmul fast half %9, %9374 %add = fadd fast half %mul2, %mul375 %incdec.ptr3 = getelementptr inbounds half, ptr %pDst.addr.013, i32 1376 store half %add, ptr %pDst.addr.013, align 2377 %dec = add i32 %blkCnt.012, -1378 %cmp.not = icmp eq i32 %dec, 0379 br i1 %cmp.not, label %while.end, label %while.body380 381while.end: ; preds = %while.body, %middle.block, %entry382 ret void383}384 385define void @arm_cmplx_mag_squared_f32_cse(ptr nocapture readonly %pSrc, ptr nocapture %pDst, i32 %numSamples) {386; CHECK-LABEL: arm_cmplx_mag_squared_f32_cse:387; CHECK: @ %bb.0: @ %entry388; CHECK-NEXT: .save {r4, r5, r7, lr}389; CHECK-NEXT: push {r4, r5, r7, lr}390; CHECK-NEXT: cbz r2, .LBB3_8391; CHECK-NEXT: @ %bb.1: @ %while.body.preheader392; CHECK-NEXT: cmp r2, #4393; CHECK-NEXT: blo .LBB3_9394; CHECK-NEXT: @ %bb.2: @ %vector.memcheck395; CHECK-NEXT: add.w r3, r0, r2, lsl #3396; CHECK-NEXT: cmp r3, r1397; CHECK-NEXT: itt hi398; CHECK-NEXT: addhi.w r3, r1, r2, lsl #2399; CHECK-NEXT: cmphi r3, r0400; CHECK-NEXT: bhi .LBB3_9401; CHECK-NEXT: @ %bb.3: @ %vector.ph402; CHECK-NEXT: bic r4, r2, #3403; CHECK-NEXT: movs r5, #1404; CHECK-NEXT: subs r3, r4, #4405; CHECK-NEXT: add.w r12, r1, r4, lsl #2406; CHECK-NEXT: add.w lr, r5, r3, lsr #2407; CHECK-NEXT: add.w r3, r0, r4, lsl #3408; CHECK-NEXT: and r5, r2, #3409; CHECK-NEXT: .LBB3_4: @ %vector.body410; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1411; CHECK-NEXT: vld20.32 {q0, q1}, [r0]412; CHECK-NEXT: vld21.32 {q0, q1}, [r0]!413; CHECK-NEXT: vmul.f32 q0, q0, q0414; CHECK-NEXT: vfma.f32 q0, q1, q1415; CHECK-NEXT: vstrb.8 q0, [r1], #16416; CHECK-NEXT: le lr, .LBB3_4417; CHECK-NEXT: @ %bb.5: @ %middle.block418; CHECK-NEXT: cmp r4, r2419; CHECK-NEXT: it eq420; CHECK-NEXT: popeq {r4, r5, r7, pc}421; CHECK-NEXT: .LBB3_6: @ %while.body.preheader26422; CHECK-NEXT: dls lr, r5423; CHECK-NEXT: .LBB3_7: @ %while.body424; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1425; CHECK-NEXT: vldr s0, [r3]426; CHECK-NEXT: vldr s2, [r3, #4]427; CHECK-NEXT: adds r3, #8428; CHECK-NEXT: vmul.f32 s0, s0, s0429; CHECK-NEXT: vfma.f32 s0, s2, s2430; CHECK-NEXT: vstmia r12!, {s0}431; CHECK-NEXT: le lr, .LBB3_7432; CHECK-NEXT: .LBB3_8: @ %while.end433; CHECK-NEXT: pop {r4, r5, r7, pc}434; CHECK-NEXT: .LBB3_9:435; CHECK-NEXT: mov r3, r0436; CHECK-NEXT: mov r12, r1437; CHECK-NEXT: mov r5, r2438; CHECK-NEXT: b .LBB3_6439entry:440 %cmp.not11 = icmp eq i32 %numSamples, 0441 br i1 %cmp.not11, label %while.end, label %while.body.preheader442 443while.body.preheader: ; preds = %entry444 %min.iters.check = icmp ult i32 %numSamples, 4445 br i1 %min.iters.check, label %while.body.preheader26, label %vector.memcheck446 447vector.memcheck: ; preds = %while.body.preheader448 %scevgep = getelementptr float, ptr %pDst, i32 %numSamples449 %0 = shl i32 %numSamples, 1450 %scevgep18 = getelementptr float, ptr %pSrc, i32 %0451 %bound0 = icmp ugt ptr %scevgep18, %pDst452 %bound1 = icmp ugt ptr %scevgep, %pSrc453 %found.conflict = and i1 %bound0, %bound1454 br i1 %found.conflict, label %while.body.preheader26, label %vector.ph455 456vector.ph: ; preds = %vector.memcheck457 %n.vec = and i32 %numSamples, -4458 %1 = shl i32 %n.vec, 1459 %ind.end = getelementptr float, ptr %pSrc, i32 %1460 %ind.end21 = getelementptr float, ptr %pDst, i32 %n.vec461 %ind.end23 = and i32 %numSamples, 3462 br label %vector.body463 464vector.body: ; preds = %vector.body, %vector.ph465 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]466 %2 = shl i32 %index, 1467 %next.gep = getelementptr float, ptr %pSrc, i32 %2468 %next.gep24 = getelementptr float, ptr %pDst, i32 %index469 %wide.vec = load <8 x float>, ptr %next.gep, align 4470 %3 = fmul fast <8 x float> %wide.vec, %wide.vec471 %4 = shufflevector <8 x float> %3, <8 x float> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>472 %5 = shufflevector <8 x float> %3, <8 x float> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>473 %6 = fadd fast <4 x float> %5, %4474 store <4 x float> %6, ptr %next.gep24, align 4475 %index.next = add i32 %index, 4476 %7 = icmp eq i32 %index.next, %n.vec477 br i1 %7, label %middle.block, label %vector.body478 479middle.block: ; preds = %vector.body480 %cmp.n = icmp eq i32 %n.vec, %numSamples481 br i1 %cmp.n, label %while.end, label %while.body.preheader26482 483while.body.preheader26: ; preds = %middle.block, %vector.memcheck, %while.body.preheader484 %pSrc.addr.014.ph = phi ptr [ %pSrc, %vector.memcheck ], [ %pSrc, %while.body.preheader ], [ %ind.end, %middle.block ]485 %pDst.addr.013.ph = phi ptr [ %pDst, %vector.memcheck ], [ %pDst, %while.body.preheader ], [ %ind.end21, %middle.block ]486 %blkCnt.012.ph = phi i32 [ %numSamples, %vector.memcheck ], [ %numSamples, %while.body.preheader ], [ %ind.end23, %middle.block ]487 br label %while.body488 489while.body: ; preds = %while.body, %while.body.preheader26490 %pSrc.addr.014 = phi ptr [ %incdec.ptr1, %while.body ], [ %pSrc.addr.014.ph, %while.body.preheader26 ]491 %pDst.addr.013 = phi ptr [ %incdec.ptr3, %while.body ], [ %pDst.addr.013.ph, %while.body.preheader26 ]492 %blkCnt.012 = phi i32 [ %dec, %while.body ], [ %blkCnt.012.ph, %while.body.preheader26 ]493 %incdec.ptr = getelementptr inbounds float, ptr %pSrc.addr.014, i32 1494 %8 = load float, ptr %pSrc.addr.014, align 4495 %incdec.ptr1 = getelementptr inbounds float, ptr %pSrc.addr.014, i32 2496 %9 = load float, ptr %incdec.ptr, align 4497 %mul = fmul fast float %8, %8498 %mul2 = fmul fast float %9, %9499 %add = fadd fast float %mul2, %mul500 %incdec.ptr3 = getelementptr inbounds float, ptr %pDst.addr.013, i32 1501 store float %add, ptr %pDst.addr.013, align 4502 %dec = add i32 %blkCnt.012, -1503 %cmp.not = icmp eq i32 %dec, 0504 br i1 %cmp.not, label %while.end, label %while.body505 506while.end: ; preds = %while.body, %middle.block, %entry507 ret void508}509