brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.5 KiB · 2509d5a Raw
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