brintos

brintos / llvm-project-archived public Read only

0
0
Text · 77.7 KiB · 7c6c7e9 Raw
1886 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp,+fp-armv8d16sp,+fp16,+fullfp16 %s -o - | FileCheck %s3 4define arm_aapcs_vfpcc void @float_float_mul(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {5; CHECK-LABEL: float_float_mul:6; CHECK:       @ %bb.0: @ %entry7; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, lr}8; CHECK-NEXT:    cmp r3, #09; CHECK-NEXT:    beq .LBB0_1010; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader11; CHECK-NEXT:    cmp r3, #312; CHECK-NEXT:    bhi .LBB0_313; CHECK-NEXT:  @ %bb.2:14; CHECK-NEXT:    mov.w r12, #015; CHECK-NEXT:    b .LBB0_416; CHECK-NEXT:  .LBB0_3: @ %vector.memcheck17; CHECK-NEXT:    add.w r7, r1, r3, lsl #218; CHECK-NEXT:    add.w r6, r2, r3, lsl #219; CHECK-NEXT:    cmp r7, r220; CHECK-NEXT:    add.w r5, r0, r3, lsl #221; CHECK-NEXT:    cset r7, hi22; CHECK-NEXT:    cmp r6, r123; CHECK-NEXT:    csel r7, zr, r7, ls24; CHECK-NEXT:    cmp r6, r025; CHECK-NEXT:    cset r6, hi26; CHECK-NEXT:    cmp r5, r227; CHECK-NEXT:    cset r5, hi28; CHECK-NEXT:    mov.w r12, #029; CHECK-NEXT:    tst r5, r630; CHECK-NEXT:    it eq31; CHECK-NEXT:    cmpeq r7, #032; CHECK-NEXT:    beq .LBB0_1133; CHECK-NEXT:  .LBB0_4: @ %for.body.preheader2234; CHECK-NEXT:    mvn.w r7, r1235; CHECK-NEXT:    adds r4, r7, r336; CHECK-NEXT:    and r7, r3, #337; CHECK-NEXT:    add.w r8, r12, r738; CHECK-NEXT:    wls lr, r7, .LBB0_739; CHECK-NEXT:  @ %bb.5: @ %for.body.prol.preheader40; CHECK-NEXT:    add.w r6, r0, r12, lsl #241; CHECK-NEXT:    add.w r7, r1, r12, lsl #242; CHECK-NEXT:    add.w r5, r2, r12, lsl #243; CHECK-NEXT:    mov r12, r844; CHECK-NEXT:  .LBB0_6: @ %for.body.prol45; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=146; CHECK-NEXT:    vldmia r7!, {s0}47; CHECK-NEXT:    vldmia r6!, {s2}48; CHECK-NEXT:    vmul.f32 s0, s2, s049; CHECK-NEXT:    vstmia r5!, {s0}50; CHECK-NEXT:    le lr, .LBB0_651; CHECK-NEXT:  .LBB0_7: @ %for.body.prol.loopexit52; CHECK-NEXT:    cmp r4, #353; CHECK-NEXT:    blo .LBB0_1054; CHECK-NEXT:  @ %bb.8: @ %for.body.preheader155; CHECK-NEXT:    sub.w r3, r8, r356; CHECK-NEXT:    movs r7, #157; CHECK-NEXT:    rsb r3, r3, r3, lsl #3058; CHECK-NEXT:    subs r3, #459; CHECK-NEXT:    add.w lr, r7, r3, lsr #260; CHECK-NEXT:    lsl.w r3, r12, #261; CHECK-NEXT:  .LBB0_9: @ %for.body62; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=163; CHECK-NEXT:    adds r7, r1, r364; CHECK-NEXT:    adds r6, r0, r365; CHECK-NEXT:    adds r5, r2, r366; CHECK-NEXT:    adds r0, #1667; CHECK-NEXT:    vldr s0, [r7]68; CHECK-NEXT:    adds r1, #1669; CHECK-NEXT:    vldr s2, [r6]70; CHECK-NEXT:    adds r2, #1671; CHECK-NEXT:    vmul.f32 s0, s2, s072; CHECK-NEXT:    vstr s0, [r5]73; CHECK-NEXT:    vldr s0, [r7, #4]74; CHECK-NEXT:    vldr s2, [r6, #4]75; CHECK-NEXT:    vmul.f32 s0, s2, s076; CHECK-NEXT:    vstr s0, [r5, #4]77; CHECK-NEXT:    vldr s0, [r7, #8]78; CHECK-NEXT:    vldr s2, [r6, #8]79; CHECK-NEXT:    vmul.f32 s0, s2, s080; CHECK-NEXT:    vstr s0, [r5, #8]81; CHECK-NEXT:    vldr s0, [r7, #12]82; CHECK-NEXT:    vldr s2, [r6, #12]83; CHECK-NEXT:    vmul.f32 s0, s2, s084; CHECK-NEXT:    vstr s0, [r5, #12]85; CHECK-NEXT:    le lr, .LBB0_986; CHECK-NEXT:  .LBB0_10: @ %for.cond.cleanup87; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, pc}88; CHECK-NEXT:  .LBB0_11: @ %vector.ph89; CHECK-NEXT:    bic r12, r3, #390; CHECK-NEXT:    movs r6, #191; CHECK-NEXT:    sub.w r7, r12, #492; CHECK-NEXT:    mov r4, r093; CHECK-NEXT:    mov r5, r194; CHECK-NEXT:    add.w lr, r6, r7, lsr #295; CHECK-NEXT:    mov r6, r296; CHECK-NEXT:  .LBB0_12: @ %vector.body97; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=198; CHECK-NEXT:    vldrw.u32 q0, [r5], #1699; CHECK-NEXT:    vldrw.u32 q1, [r4], #16100; CHECK-NEXT:    vmul.f32 q0, q1, q0101; CHECK-NEXT:    vstrb.8 q0, [r6], #16102; CHECK-NEXT:    le lr, .LBB0_12103; CHECK-NEXT:  @ %bb.13: @ %middle.block104; CHECK-NEXT:    cmp r12, r3105; CHECK-NEXT:    bne .LBB0_4106; CHECK-NEXT:    b .LBB0_10107entry:108  %cmp8 = icmp eq i32 %N, 0109  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader110 111for.body.preheader:                               ; preds = %entry112  %min.iters.check = icmp ult i32 %N, 4113  br i1 %min.iters.check, label %for.body.preheader22, label %vector.memcheck114 115for.body.preheader22:                             ; preds = %middle.block, %vector.memcheck, %for.body.preheader116  %i.09.ph = phi i32 [ 0, %vector.memcheck ], [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]117  %0 = xor i32 %i.09.ph, -1118  %1 = add i32 %0, %N119  %xtraiter = and i32 %N, 3120  %lcmp.mod = icmp eq i32 %xtraiter, 0121  br i1 %lcmp.mod, label %for.body.prol.loopexit, label %for.body.prol122 123for.body.prol:                                    ; preds = %for.body.preheader22, %for.body.prol124  %i.09.prol = phi i32 [ %inc.prol, %for.body.prol ], [ %i.09.ph, %for.body.preheader22 ]125  %prol.iter = phi i32 [ %prol.iter.sub, %for.body.prol ], [ %xtraiter, %for.body.preheader22 ]126  %arrayidx.prol = getelementptr inbounds float, ptr %a, i32 %i.09.prol127  %2 = load float, ptr %arrayidx.prol, align 4128  %arrayidx1.prol = getelementptr inbounds float, ptr %b, i32 %i.09.prol129  %3 = load float, ptr %arrayidx1.prol, align 4130  %mul.prol = fmul float %2, %3131  %arrayidx2.prol = getelementptr inbounds float, ptr %c, i32 %i.09.prol132  store float %mul.prol, ptr %arrayidx2.prol, align 4133  %inc.prol = add nuw i32 %i.09.prol, 1134  %prol.iter.sub = add i32 %prol.iter, -1135  %prol.iter.cmp = icmp eq i32 %prol.iter.sub, 0136  br i1 %prol.iter.cmp, label %for.body.prol.loopexit, label %for.body.prol137 138for.body.prol.loopexit:                           ; preds = %for.body.prol, %for.body.preheader22139  %i.09.unr = phi i32 [ %i.09.ph, %for.body.preheader22 ], [ %inc.prol, %for.body.prol ]140  %4 = icmp ult i32 %1, 3141  br i1 %4, label %for.cond.cleanup, label %for.body142 143vector.memcheck:                                  ; preds = %for.body.preheader144  %scevgep = getelementptr float, ptr %c, i32 %N145  %scevgep13 = getelementptr float, ptr %a, i32 %N146  %scevgep16 = getelementptr float, ptr %b, i32 %N147  %bound0 = icmp ugt ptr %scevgep13, %c148  %bound1 = icmp ugt ptr %scevgep, %a149  %found.conflict = and i1 %bound0, %bound1150  %bound018 = icmp ugt ptr %scevgep16, %c151  %bound119 = icmp ugt ptr %scevgep, %b152  %found.conflict20 = and i1 %bound018, %bound119153  %conflict.rdx = or i1 %found.conflict, %found.conflict20154  br i1 %conflict.rdx, label %for.body.preheader22, label %vector.ph155 156vector.ph:                                        ; preds = %vector.memcheck157  %n.vec = and i32 %N, -4158  br label %vector.body159 160vector.body:                                      ; preds = %vector.body, %vector.ph161  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]162  %5 = getelementptr inbounds float, ptr %a, i32 %index163  %wide.load = load <4 x float>, ptr %5, align 4164  %6 = getelementptr inbounds float, ptr %b, i32 %index165  %wide.load21 = load <4 x float>, ptr %6, align 4166  %7 = fmul <4 x float> %wide.load, %wide.load21167  %8 = getelementptr inbounds float, ptr %c, i32 %index168  store <4 x float> %7, ptr %8, align 4169  %index.next = add i32 %index, 4170  %9 = icmp eq i32 %index.next, %n.vec171  br i1 %9, label %middle.block, label %vector.body172 173middle.block:                                     ; preds = %vector.body174  %cmp.n = icmp eq i32 %n.vec, %N175  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader22176 177for.cond.cleanup:                                 ; preds = %for.body.prol.loopexit, %for.body, %middle.block, %entry178  ret void179 180for.body:                                         ; preds = %for.body.prol.loopexit, %for.body181  %i.09 = phi i32 [ %inc.3, %for.body ], [ %i.09.unr, %for.body.prol.loopexit ]182  %arrayidx = getelementptr inbounds float, ptr %a, i32 %i.09183  %10 = load float, ptr %arrayidx, align 4184  %arrayidx1 = getelementptr inbounds float, ptr %b, i32 %i.09185  %11 = load float, ptr %arrayidx1, align 4186  %mul = fmul float %10, %11187  %arrayidx2 = getelementptr inbounds float, ptr %c, i32 %i.09188  store float %mul, ptr %arrayidx2, align 4189  %inc = add nuw i32 %i.09, 1190  %arrayidx.1 = getelementptr inbounds float, ptr %a, i32 %inc191  %12 = load float, ptr %arrayidx.1, align 4192  %arrayidx1.1 = getelementptr inbounds float, ptr %b, i32 %inc193  %13 = load float, ptr %arrayidx1.1, align 4194  %mul.1 = fmul float %12, %13195  %arrayidx2.1 = getelementptr inbounds float, ptr %c, i32 %inc196  store float %mul.1, ptr %arrayidx2.1, align 4197  %inc.1 = add nuw i32 %i.09, 2198  %arrayidx.2 = getelementptr inbounds float, ptr %a, i32 %inc.1199  %14 = load float, ptr %arrayidx.2, align 4200  %arrayidx1.2 = getelementptr inbounds float, ptr %b, i32 %inc.1201  %15 = load float, ptr %arrayidx1.2, align 4202  %mul.2 = fmul float %14, %15203  %arrayidx2.2 = getelementptr inbounds float, ptr %c, i32 %inc.1204  store float %mul.2, ptr %arrayidx2.2, align 4205  %inc.2 = add nuw i32 %i.09, 3206  %arrayidx.3 = getelementptr inbounds float, ptr %a, i32 %inc.2207  %16 = load float, ptr %arrayidx.3, align 4208  %arrayidx1.3 = getelementptr inbounds float, ptr %b, i32 %inc.2209  %17 = load float, ptr %arrayidx1.3, align 4210  %mul.3 = fmul float %16, %17211  %arrayidx2.3 = getelementptr inbounds float, ptr %c, i32 %inc.2212  store float %mul.3, ptr %arrayidx2.3, align 4213  %inc.3 = add nuw i32 %i.09, 4214  %exitcond.3 = icmp eq i32 %inc.3, %N215  br i1 %exitcond.3, label %for.cond.cleanup, label %for.body216}217 218define arm_aapcs_vfpcc void @float_float_add(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {219; CHECK-LABEL: float_float_add:220; CHECK:       @ %bb.0: @ %entry221; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, lr}222; CHECK-NEXT:    cmp r3, #0223; CHECK-NEXT:    beq .LBB1_10224; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader225; CHECK-NEXT:    cmp r3, #3226; CHECK-NEXT:    bhi .LBB1_3227; CHECK-NEXT:  @ %bb.2:228; CHECK-NEXT:    mov.w r12, #0229; CHECK-NEXT:    b .LBB1_4230; CHECK-NEXT:  .LBB1_3: @ %vector.memcheck231; CHECK-NEXT:    add.w r7, r1, r3, lsl #2232; CHECK-NEXT:    add.w r6, r2, r3, lsl #2233; CHECK-NEXT:    cmp r7, r2234; CHECK-NEXT:    add.w r5, r0, r3, lsl #2235; CHECK-NEXT:    cset r7, hi236; CHECK-NEXT:    cmp r6, r1237; CHECK-NEXT:    csel r7, zr, r7, ls238; CHECK-NEXT:    cmp r6, r0239; CHECK-NEXT:    cset r6, hi240; CHECK-NEXT:    cmp r5, r2241; CHECK-NEXT:    cset r5, hi242; CHECK-NEXT:    mov.w r12, #0243; CHECK-NEXT:    tst r5, r6244; CHECK-NEXT:    it eq245; CHECK-NEXT:    cmpeq r7, #0246; CHECK-NEXT:    beq .LBB1_11247; CHECK-NEXT:  .LBB1_4: @ %for.body.preheader22248; CHECK-NEXT:    mvn.w r7, r12249; CHECK-NEXT:    adds r4, r7, r3250; CHECK-NEXT:    and r7, r3, #3251; CHECK-NEXT:    add.w r8, r12, r7252; CHECK-NEXT:    wls lr, r7, .LBB1_7253; CHECK-NEXT:  @ %bb.5: @ %for.body.prol.preheader254; CHECK-NEXT:    add.w r6, r0, r12, lsl #2255; CHECK-NEXT:    add.w r7, r1, r12, lsl #2256; CHECK-NEXT:    add.w r5, r2, r12, lsl #2257; CHECK-NEXT:    mov r12, r8258; CHECK-NEXT:  .LBB1_6: @ %for.body.prol259; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1260; CHECK-NEXT:    vldmia r7!, {s0}261; CHECK-NEXT:    vldmia r6!, {s2}262; CHECK-NEXT:    vadd.f32 s0, s2, s0263; CHECK-NEXT:    vstmia r5!, {s0}264; CHECK-NEXT:    le lr, .LBB1_6265; CHECK-NEXT:  .LBB1_7: @ %for.body.prol.loopexit266; CHECK-NEXT:    cmp r4, #3267; CHECK-NEXT:    blo .LBB1_10268; CHECK-NEXT:  @ %bb.8: @ %for.body.preheader1269; CHECK-NEXT:    sub.w r3, r8, r3270; CHECK-NEXT:    movs r7, #1271; CHECK-NEXT:    rsb r3, r3, r3, lsl #30272; CHECK-NEXT:    subs r3, #4273; CHECK-NEXT:    add.w lr, r7, r3, lsr #2274; CHECK-NEXT:    lsl.w r3, r12, #2275; CHECK-NEXT:  .LBB1_9: @ %for.body276; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1277; CHECK-NEXT:    adds r7, r1, r3278; CHECK-NEXT:    adds r6, r0, r3279; CHECK-NEXT:    adds r5, r2, r3280; CHECK-NEXT:    adds r0, #16281; CHECK-NEXT:    vldr s0, [r7]282; CHECK-NEXT:    adds r1, #16283; CHECK-NEXT:    vldr s2, [r6]284; CHECK-NEXT:    adds r2, #16285; CHECK-NEXT:    vadd.f32 s0, s2, s0286; CHECK-NEXT:    vstr s0, [r5]287; CHECK-NEXT:    vldr s0, [r7, #4]288; CHECK-NEXT:    vldr s2, [r6, #4]289; CHECK-NEXT:    vadd.f32 s0, s2, s0290; CHECK-NEXT:    vstr s0, [r5, #4]291; CHECK-NEXT:    vldr s0, [r7, #8]292; CHECK-NEXT:    vldr s2, [r6, #8]293; CHECK-NEXT:    vadd.f32 s0, s2, s0294; CHECK-NEXT:    vstr s0, [r5, #8]295; CHECK-NEXT:    vldr s0, [r7, #12]296; CHECK-NEXT:    vldr s2, [r6, #12]297; CHECK-NEXT:    vadd.f32 s0, s2, s0298; CHECK-NEXT:    vstr s0, [r5, #12]299; CHECK-NEXT:    le lr, .LBB1_9300; CHECK-NEXT:  .LBB1_10: @ %for.cond.cleanup301; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, pc}302; CHECK-NEXT:  .LBB1_11: @ %vector.ph303; CHECK-NEXT:    bic r12, r3, #3304; CHECK-NEXT:    movs r6, #1305; CHECK-NEXT:    sub.w r7, r12, #4306; CHECK-NEXT:    mov r4, r0307; CHECK-NEXT:    mov r5, r1308; CHECK-NEXT:    add.w lr, r6, r7, lsr #2309; CHECK-NEXT:    mov r6, r2310; CHECK-NEXT:  .LBB1_12: @ %vector.body311; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1312; CHECK-NEXT:    vldrw.u32 q0, [r5], #16313; CHECK-NEXT:    vldrw.u32 q1, [r4], #16314; CHECK-NEXT:    vadd.f32 q0, q1, q0315; CHECK-NEXT:    vstrb.8 q0, [r6], #16316; CHECK-NEXT:    le lr, .LBB1_12317; CHECK-NEXT:  @ %bb.13: @ %middle.block318; CHECK-NEXT:    cmp r12, r3319; CHECK-NEXT:    bne .LBB1_4320; CHECK-NEXT:    b .LBB1_10321entry:322  %cmp8 = icmp eq i32 %N, 0323  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader324 325for.body.preheader:                               ; preds = %entry326  %min.iters.check = icmp ult i32 %N, 4327  br i1 %min.iters.check, label %for.body.preheader22, label %vector.memcheck328 329for.body.preheader22:                             ; preds = %middle.block, %vector.memcheck, %for.body.preheader330  %i.09.ph = phi i32 [ 0, %vector.memcheck ], [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]331  %0 = xor i32 %i.09.ph, -1332  %1 = add i32 %0, %N333  %xtraiter = and i32 %N, 3334  %lcmp.mod = icmp eq i32 %xtraiter, 0335  br i1 %lcmp.mod, label %for.body.prol.loopexit, label %for.body.prol336 337for.body.prol:                                    ; preds = %for.body.preheader22, %for.body.prol338  %i.09.prol = phi i32 [ %inc.prol, %for.body.prol ], [ %i.09.ph, %for.body.preheader22 ]339  %prol.iter = phi i32 [ %prol.iter.sub, %for.body.prol ], [ %xtraiter, %for.body.preheader22 ]340  %arrayidx.prol = getelementptr inbounds float, ptr %a, i32 %i.09.prol341  %2 = load float, ptr %arrayidx.prol, align 4342  %arrayidx1.prol = getelementptr inbounds float, ptr %b, i32 %i.09.prol343  %3 = load float, ptr %arrayidx1.prol, align 4344  %add.prol = fadd float %2, %3345  %arrayidx2.prol = getelementptr inbounds float, ptr %c, i32 %i.09.prol346  store float %add.prol, ptr %arrayidx2.prol, align 4347  %inc.prol = add nuw i32 %i.09.prol, 1348  %prol.iter.sub = add i32 %prol.iter, -1349  %prol.iter.cmp = icmp eq i32 %prol.iter.sub, 0350  br i1 %prol.iter.cmp, label %for.body.prol.loopexit, label %for.body.prol351 352for.body.prol.loopexit:                           ; preds = %for.body.prol, %for.body.preheader22353  %i.09.unr = phi i32 [ %i.09.ph, %for.body.preheader22 ], [ %inc.prol, %for.body.prol ]354  %4 = icmp ult i32 %1, 3355  br i1 %4, label %for.cond.cleanup, label %for.body356 357vector.memcheck:                                  ; preds = %for.body.preheader358  %scevgep = getelementptr float, ptr %c, i32 %N359  %scevgep13 = getelementptr float, ptr %a, i32 %N360  %scevgep16 = getelementptr float, ptr %b, i32 %N361  %bound0 = icmp ugt ptr %scevgep13, %c362  %bound1 = icmp ugt ptr %scevgep, %a363  %found.conflict = and i1 %bound0, %bound1364  %bound018 = icmp ugt ptr %scevgep16, %c365  %bound119 = icmp ugt ptr %scevgep, %b366  %found.conflict20 = and i1 %bound018, %bound119367  %conflict.rdx = or i1 %found.conflict, %found.conflict20368  br i1 %conflict.rdx, label %for.body.preheader22, label %vector.ph369 370vector.ph:                                        ; preds = %vector.memcheck371  %n.vec = and i32 %N, -4372  br label %vector.body373 374vector.body:                                      ; preds = %vector.body, %vector.ph375  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]376  %5 = getelementptr inbounds float, ptr %a, i32 %index377  %wide.load = load <4 x float>, ptr %5, align 4378  %6 = getelementptr inbounds float, ptr %b, i32 %index379  %wide.load21 = load <4 x float>, ptr %6, align 4380  %7 = fadd <4 x float> %wide.load, %wide.load21381  %8 = getelementptr inbounds float, ptr %c, i32 %index382  store <4 x float> %7, ptr %8, align 4383  %index.next = add i32 %index, 4384  %9 = icmp eq i32 %index.next, %n.vec385  br i1 %9, label %middle.block, label %vector.body386 387middle.block:                                     ; preds = %vector.body388  %cmp.n = icmp eq i32 %n.vec, %N389  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader22390 391for.cond.cleanup:                                 ; preds = %for.body.prol.loopexit, %for.body, %middle.block, %entry392  ret void393 394for.body:                                         ; preds = %for.body.prol.loopexit, %for.body395  %i.09 = phi i32 [ %inc.3, %for.body ], [ %i.09.unr, %for.body.prol.loopexit ]396  %arrayidx = getelementptr inbounds float, ptr %a, i32 %i.09397  %10 = load float, ptr %arrayidx, align 4398  %arrayidx1 = getelementptr inbounds float, ptr %b, i32 %i.09399  %11 = load float, ptr %arrayidx1, align 4400  %add = fadd float %10, %11401  %arrayidx2 = getelementptr inbounds float, ptr %c, i32 %i.09402  store float %add, ptr %arrayidx2, align 4403  %inc = add nuw i32 %i.09, 1404  %arrayidx.1 = getelementptr inbounds float, ptr %a, i32 %inc405  %12 = load float, ptr %arrayidx.1, align 4406  %arrayidx1.1 = getelementptr inbounds float, ptr %b, i32 %inc407  %13 = load float, ptr %arrayidx1.1, align 4408  %add.1 = fadd float %12, %13409  %arrayidx2.1 = getelementptr inbounds float, ptr %c, i32 %inc410  store float %add.1, ptr %arrayidx2.1, align 4411  %inc.1 = add nuw i32 %i.09, 2412  %arrayidx.2 = getelementptr inbounds float, ptr %a, i32 %inc.1413  %14 = load float, ptr %arrayidx.2, align 4414  %arrayidx1.2 = getelementptr inbounds float, ptr %b, i32 %inc.1415  %15 = load float, ptr %arrayidx1.2, align 4416  %add.2 = fadd float %14, %15417  %arrayidx2.2 = getelementptr inbounds float, ptr %c, i32 %inc.1418  store float %add.2, ptr %arrayidx2.2, align 4419  %inc.2 = add nuw i32 %i.09, 3420  %arrayidx.3 = getelementptr inbounds float, ptr %a, i32 %inc.2421  %16 = load float, ptr %arrayidx.3, align 4422  %arrayidx1.3 = getelementptr inbounds float, ptr %b, i32 %inc.2423  %17 = load float, ptr %arrayidx1.3, align 4424  %add.3 = fadd float %16, %17425  %arrayidx2.3 = getelementptr inbounds float, ptr %c, i32 %inc.2426  store float %add.3, ptr %arrayidx2.3, align 4427  %inc.3 = add nuw i32 %i.09, 4428  %exitcond.3 = icmp eq i32 %inc.3, %N429  br i1 %exitcond.3, label %for.cond.cleanup, label %for.body430}431 432define arm_aapcs_vfpcc void @float_float_sub(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {433; CHECK-LABEL: float_float_sub:434; CHECK:       @ %bb.0: @ %entry435; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, lr}436; CHECK-NEXT:    cmp r3, #0437; CHECK-NEXT:    beq .LBB2_10438; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader439; CHECK-NEXT:    cmp r3, #3440; CHECK-NEXT:    bhi .LBB2_3441; CHECK-NEXT:  @ %bb.2:442; CHECK-NEXT:    mov.w r12, #0443; CHECK-NEXT:    b .LBB2_4444; CHECK-NEXT:  .LBB2_3: @ %vector.memcheck445; CHECK-NEXT:    add.w r7, r1, r3, lsl #2446; CHECK-NEXT:    add.w r6, r2, r3, lsl #2447; CHECK-NEXT:    cmp r7, r2448; CHECK-NEXT:    add.w r5, r0, r3, lsl #2449; CHECK-NEXT:    cset r7, hi450; CHECK-NEXT:    cmp r6, r1451; CHECK-NEXT:    csel r7, zr, r7, ls452; CHECK-NEXT:    cmp r6, r0453; CHECK-NEXT:    cset r6, hi454; CHECK-NEXT:    cmp r5, r2455; CHECK-NEXT:    cset r5, hi456; CHECK-NEXT:    mov.w r12, #0457; CHECK-NEXT:    tst r5, r6458; CHECK-NEXT:    it eq459; CHECK-NEXT:    cmpeq r7, #0460; CHECK-NEXT:    beq .LBB2_11461; CHECK-NEXT:  .LBB2_4: @ %for.body.preheader22462; CHECK-NEXT:    mvn.w r7, r12463; CHECK-NEXT:    adds r4, r7, r3464; CHECK-NEXT:    and r7, r3, #3465; CHECK-NEXT:    add.w r8, r12, r7466; CHECK-NEXT:    wls lr, r7, .LBB2_7467; CHECK-NEXT:  @ %bb.5: @ %for.body.prol.preheader468; CHECK-NEXT:    add.w r6, r0, r12, lsl #2469; CHECK-NEXT:    add.w r7, r1, r12, lsl #2470; CHECK-NEXT:    add.w r5, r2, r12, lsl #2471; CHECK-NEXT:    mov r12, r8472; CHECK-NEXT:  .LBB2_6: @ %for.body.prol473; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1474; CHECK-NEXT:    vldmia r7!, {s0}475; CHECK-NEXT:    vldmia r6!, {s2}476; CHECK-NEXT:    vsub.f32 s0, s2, s0477; CHECK-NEXT:    vstmia r5!, {s0}478; CHECK-NEXT:    le lr, .LBB2_6479; CHECK-NEXT:  .LBB2_7: @ %for.body.prol.loopexit480; CHECK-NEXT:    cmp r4, #3481; CHECK-NEXT:    blo .LBB2_10482; CHECK-NEXT:  @ %bb.8: @ %for.body.preheader1483; CHECK-NEXT:    sub.w r3, r8, r3484; CHECK-NEXT:    movs r7, #1485; CHECK-NEXT:    rsb r3, r3, r3, lsl #30486; CHECK-NEXT:    subs r3, #4487; CHECK-NEXT:    add.w lr, r7, r3, lsr #2488; CHECK-NEXT:    lsl.w r3, r12, #2489; CHECK-NEXT:  .LBB2_9: @ %for.body490; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1491; CHECK-NEXT:    adds r7, r1, r3492; CHECK-NEXT:    adds r6, r0, r3493; CHECK-NEXT:    adds r5, r2, r3494; CHECK-NEXT:    adds r0, #16495; CHECK-NEXT:    vldr s0, [r7]496; CHECK-NEXT:    adds r1, #16497; CHECK-NEXT:    vldr s2, [r6]498; CHECK-NEXT:    adds r2, #16499; CHECK-NEXT:    vsub.f32 s0, s2, s0500; CHECK-NEXT:    vstr s0, [r5]501; CHECK-NEXT:    vldr s0, [r7, #4]502; CHECK-NEXT:    vldr s2, [r6, #4]503; CHECK-NEXT:    vsub.f32 s0, s2, s0504; CHECK-NEXT:    vstr s0, [r5, #4]505; CHECK-NEXT:    vldr s0, [r7, #8]506; CHECK-NEXT:    vldr s2, [r6, #8]507; CHECK-NEXT:    vsub.f32 s0, s2, s0508; CHECK-NEXT:    vstr s0, [r5, #8]509; CHECK-NEXT:    vldr s0, [r7, #12]510; CHECK-NEXT:    vldr s2, [r6, #12]511; CHECK-NEXT:    vsub.f32 s0, s2, s0512; CHECK-NEXT:    vstr s0, [r5, #12]513; CHECK-NEXT:    le lr, .LBB2_9514; CHECK-NEXT:  .LBB2_10: @ %for.cond.cleanup515; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, pc}516; CHECK-NEXT:  .LBB2_11: @ %vector.ph517; CHECK-NEXT:    bic r12, r3, #3518; CHECK-NEXT:    movs r6, #1519; CHECK-NEXT:    sub.w r7, r12, #4520; CHECK-NEXT:    mov r4, r0521; CHECK-NEXT:    mov r5, r1522; CHECK-NEXT:    add.w lr, r6, r7, lsr #2523; CHECK-NEXT:    mov r6, r2524; CHECK-NEXT:  .LBB2_12: @ %vector.body525; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1526; CHECK-NEXT:    vldrw.u32 q0, [r5], #16527; CHECK-NEXT:    vldrw.u32 q1, [r4], #16528; CHECK-NEXT:    vsub.f32 q0, q1, q0529; CHECK-NEXT:    vstrb.8 q0, [r6], #16530; CHECK-NEXT:    le lr, .LBB2_12531; CHECK-NEXT:  @ %bb.13: @ %middle.block532; CHECK-NEXT:    cmp r12, r3533; CHECK-NEXT:    bne .LBB2_4534; CHECK-NEXT:    b .LBB2_10535entry:536  %cmp8 = icmp eq i32 %N, 0537  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader538 539for.body.preheader:                               ; preds = %entry540  %min.iters.check = icmp ult i32 %N, 4541  br i1 %min.iters.check, label %for.body.preheader22, label %vector.memcheck542 543for.body.preheader22:                             ; preds = %middle.block, %vector.memcheck, %for.body.preheader544  %i.09.ph = phi i32 [ 0, %vector.memcheck ], [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]545  %0 = xor i32 %i.09.ph, -1546  %1 = add i32 %0, %N547  %xtraiter = and i32 %N, 3548  %lcmp.mod = icmp eq i32 %xtraiter, 0549  br i1 %lcmp.mod, label %for.body.prol.loopexit, label %for.body.prol550 551for.body.prol:                                    ; preds = %for.body.preheader22, %for.body.prol552  %i.09.prol = phi i32 [ %inc.prol, %for.body.prol ], [ %i.09.ph, %for.body.preheader22 ]553  %prol.iter = phi i32 [ %prol.iter.sub, %for.body.prol ], [ %xtraiter, %for.body.preheader22 ]554  %arrayidx.prol = getelementptr inbounds float, ptr %a, i32 %i.09.prol555  %2 = load float, ptr %arrayidx.prol, align 4556  %arrayidx1.prol = getelementptr inbounds float, ptr %b, i32 %i.09.prol557  %3 = load float, ptr %arrayidx1.prol, align 4558  %sub.prol = fsub float %2, %3559  %arrayidx2.prol = getelementptr inbounds float, ptr %c, i32 %i.09.prol560  store float %sub.prol, ptr %arrayidx2.prol, align 4561  %inc.prol = add nuw i32 %i.09.prol, 1562  %prol.iter.sub = add i32 %prol.iter, -1563  %prol.iter.cmp = icmp eq i32 %prol.iter.sub, 0564  br i1 %prol.iter.cmp, label %for.body.prol.loopexit, label %for.body.prol565 566for.body.prol.loopexit:                           ; preds = %for.body.prol, %for.body.preheader22567  %i.09.unr = phi i32 [ %i.09.ph, %for.body.preheader22 ], [ %inc.prol, %for.body.prol ]568  %4 = icmp ult i32 %1, 3569  br i1 %4, label %for.cond.cleanup, label %for.body570 571vector.memcheck:                                  ; preds = %for.body.preheader572  %scevgep = getelementptr float, ptr %c, i32 %N573  %scevgep13 = getelementptr float, ptr %a, i32 %N574  %scevgep16 = getelementptr float, ptr %b, i32 %N575  %bound0 = icmp ugt ptr %scevgep13, %c576  %bound1 = icmp ugt ptr %scevgep, %a577  %found.conflict = and i1 %bound0, %bound1578  %bound018 = icmp ugt ptr %scevgep16, %c579  %bound119 = icmp ugt ptr %scevgep, %b580  %found.conflict20 = and i1 %bound018, %bound119581  %conflict.rdx = or i1 %found.conflict, %found.conflict20582  br i1 %conflict.rdx, label %for.body.preheader22, label %vector.ph583 584vector.ph:                                        ; preds = %vector.memcheck585  %n.vec = and i32 %N, -4586  br label %vector.body587 588vector.body:                                      ; preds = %vector.body, %vector.ph589  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]590  %5 = getelementptr inbounds float, ptr %a, i32 %index591  %wide.load = load <4 x float>, ptr %5, align 4592  %6 = getelementptr inbounds float, ptr %b, i32 %index593  %wide.load21 = load <4 x float>, ptr %6, align 4594  %7 = fsub <4 x float> %wide.load, %wide.load21595  %8 = getelementptr inbounds float, ptr %c, i32 %index596  store <4 x float> %7, ptr %8, align 4597  %index.next = add i32 %index, 4598  %9 = icmp eq i32 %index.next, %n.vec599  br i1 %9, label %middle.block, label %vector.body600 601middle.block:                                     ; preds = %vector.body602  %cmp.n = icmp eq i32 %n.vec, %N603  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader22604 605for.cond.cleanup:                                 ; preds = %for.body.prol.loopexit, %for.body, %middle.block, %entry606  ret void607 608for.body:                                         ; preds = %for.body.prol.loopexit, %for.body609  %i.09 = phi i32 [ %inc.3, %for.body ], [ %i.09.unr, %for.body.prol.loopexit ]610  %arrayidx = getelementptr inbounds float, ptr %a, i32 %i.09611  %10 = load float, ptr %arrayidx, align 4612  %arrayidx1 = getelementptr inbounds float, ptr %b, i32 %i.09613  %11 = load float, ptr %arrayidx1, align 4614  %sub = fsub float %10, %11615  %arrayidx2 = getelementptr inbounds float, ptr %c, i32 %i.09616  store float %sub, ptr %arrayidx2, align 4617  %inc = add nuw i32 %i.09, 1618  %arrayidx.1 = getelementptr inbounds float, ptr %a, i32 %inc619  %12 = load float, ptr %arrayidx.1, align 4620  %arrayidx1.1 = getelementptr inbounds float, ptr %b, i32 %inc621  %13 = load float, ptr %arrayidx1.1, align 4622  %sub.1 = fsub float %12, %13623  %arrayidx2.1 = getelementptr inbounds float, ptr %c, i32 %inc624  store float %sub.1, ptr %arrayidx2.1, align 4625  %inc.1 = add nuw i32 %i.09, 2626  %arrayidx.2 = getelementptr inbounds float, ptr %a, i32 %inc.1627  %14 = load float, ptr %arrayidx.2, align 4628  %arrayidx1.2 = getelementptr inbounds float, ptr %b, i32 %inc.1629  %15 = load float, ptr %arrayidx1.2, align 4630  %sub.2 = fsub float %14, %15631  %arrayidx2.2 = getelementptr inbounds float, ptr %c, i32 %inc.1632  store float %sub.2, ptr %arrayidx2.2, align 4633  %inc.2 = add nuw i32 %i.09, 3634  %arrayidx.3 = getelementptr inbounds float, ptr %a, i32 %inc.2635  %16 = load float, ptr %arrayidx.3, align 4636  %arrayidx1.3 = getelementptr inbounds float, ptr %b, i32 %inc.2637  %17 = load float, ptr %arrayidx1.3, align 4638  %sub.3 = fsub float %16, %17639  %arrayidx2.3 = getelementptr inbounds float, ptr %c, i32 %inc.2640  store float %sub.3, ptr %arrayidx2.3, align 4641  %inc.3 = add nuw i32 %i.09, 4642  %exitcond.3 = icmp eq i32 %inc.3, %N643  br i1 %exitcond.3, label %for.cond.cleanup, label %for.body644}645 646define arm_aapcs_vfpcc void @float_int_mul(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {647; CHECK-LABEL: float_int_mul:648; CHECK:       @ %bb.0: @ %entry649; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}650; CHECK-NEXT:    cmp r3, #0651; CHECK-NEXT:    beq.w .LBB3_13652; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader653; CHECK-NEXT:    cmp r3, #3654; CHECK-NEXT:    bls .LBB3_6655; CHECK-NEXT:  @ %bb.2: @ %vector.memcheck656; CHECK-NEXT:    add.w r7, r0, r3, lsl #2657; CHECK-NEXT:    cmp r7, r2658; CHECK-NEXT:    itt hi659; CHECK-NEXT:    addhi.w r7, r2, r3, lsl #2660; CHECK-NEXT:    cmphi r7, r0661; CHECK-NEXT:    bhi .LBB3_6662; CHECK-NEXT:  @ %bb.3: @ %vector.ph663; CHECK-NEXT:    bic r12, r3, #3664; CHECK-NEXT:    movs r6, #1665; CHECK-NEXT:    sub.w r7, r12, #4666; CHECK-NEXT:    mov r4, r0667; CHECK-NEXT:    mov r5, r1668; CHECK-NEXT:    add.w lr, r6, r7, lsr #2669; CHECK-NEXT:    mov r6, r2670; CHECK-NEXT:  .LBB3_4: @ %vector.body671; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1672; CHECK-NEXT:    vldrw.u32 q0, [r5], #16673; CHECK-NEXT:    vldrw.u32 q1, [r4], #16674; CHECK-NEXT:    vcvt.f32.s32 q0, q0675; CHECK-NEXT:    vmul.f32 q0, q1, q0676; CHECK-NEXT:    vstrb.8 q0, [r6], #16677; CHECK-NEXT:    le lr, .LBB3_4678; CHECK-NEXT:  @ %bb.5: @ %middle.block679; CHECK-NEXT:    cmp r12, r3680; CHECK-NEXT:    bne .LBB3_7681; CHECK-NEXT:    b .LBB3_13682; CHECK-NEXT:  .LBB3_6:683; CHECK-NEXT:    mov.w r12, #0684; CHECK-NEXT:  .LBB3_7: @ %for.body.preheader16685; CHECK-NEXT:    mvn.w r7, r12686; CHECK-NEXT:    add.w r9, r7, r3687; CHECK-NEXT:    and r7, r3, #3688; CHECK-NEXT:    add.w r8, r12, r7689; CHECK-NEXT:    wls lr, r7, .LBB3_10690; CHECK-NEXT:  @ %bb.8: @ %for.body.prol.preheader691; CHECK-NEXT:    add.w r6, r0, r12, lsl #2692; CHECK-NEXT:    add.w r7, r1, r12, lsl #2693; CHECK-NEXT:    add.w r5, r2, r12, lsl #2694; CHECK-NEXT:    mov r12, r8695; CHECK-NEXT:  .LBB3_9: @ %for.body.prol696; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1697; CHECK-NEXT:    ldr r4, [r7], #4698; CHECK-NEXT:    vldmia r6!, {s2}699; CHECK-NEXT:    vmov s0, r4700; CHECK-NEXT:    vcvt.f32.s32 s0, s0701; CHECK-NEXT:    vmul.f32 s0, s2, s0702; CHECK-NEXT:    vstmia r5!, {s0}703; CHECK-NEXT:    le lr, .LBB3_9704; CHECK-NEXT:  .LBB3_10: @ %for.body.prol.loopexit705; CHECK-NEXT:    cmp.w r9, #3706; CHECK-NEXT:    blo .LBB3_13707; CHECK-NEXT:  @ %bb.11: @ %for.body.preheader1708; CHECK-NEXT:    sub.w r3, r8, r3709; CHECK-NEXT:    add.w r1, r1, r12, lsl #2710; CHECK-NEXT:    movs r7, #1711; CHECK-NEXT:    adds r1, #8712; CHECK-NEXT:    rsb r3, r3, r3, lsl #30713; CHECK-NEXT:    subs r3, #4714; CHECK-NEXT:    add.w lr, r7, r3, lsr #2715; CHECK-NEXT:    lsl.w r3, r12, #2716; CHECK-NEXT:  .LBB3_12: @ %for.body717; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1718; CHECK-NEXT:    vldr s0, [r1, #-8]719; CHECK-NEXT:    adds r7, r0, r3720; CHECK-NEXT:    adds r6, r2, r3721; CHECK-NEXT:    adds r0, #16722; CHECK-NEXT:    vcvt.f32.s32 s0, s0723; CHECK-NEXT:    vldr s2, [r7]724; CHECK-NEXT:    adds r2, #16725; CHECK-NEXT:    vmul.f32 s0, s2, s0726; CHECK-NEXT:    vstr s0, [r6]727; CHECK-NEXT:    vldr s0, [r1, #-4]728; CHECK-NEXT:    vldr s2, [r7, #4]729; CHECK-NEXT:    vcvt.f32.s32 s0, s0730; CHECK-NEXT:    vmul.f32 s0, s2, s0731; CHECK-NEXT:    vstr s0, [r6, #4]732; CHECK-NEXT:    vldr s0, [r1]733; CHECK-NEXT:    vldr s2, [r7, #8]734; CHECK-NEXT:    vcvt.f32.s32 s0, s0735; CHECK-NEXT:    vmul.f32 s0, s2, s0736; CHECK-NEXT:    vstr s0, [r6, #8]737; CHECK-NEXT:    vldr s0, [r1, #4]738; CHECK-NEXT:    adds r1, #16739; CHECK-NEXT:    vldr s2, [r7, #12]740; CHECK-NEXT:    vcvt.f32.s32 s0, s0741; CHECK-NEXT:    vmul.f32 s0, s2, s0742; CHECK-NEXT:    vstr s0, [r6, #12]743; CHECK-NEXT:    le lr, .LBB3_12744; CHECK-NEXT:  .LBB3_13: @ %for.cond.cleanup745; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}746entry:747  %cmp8 = icmp eq i32 %N, 0748  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader749 750for.body.preheader:                               ; preds = %entry751  %min.iters.check = icmp ult i32 %N, 4752  br i1 %min.iters.check, label %for.body.preheader16, label %vector.memcheck753 754for.body.preheader16:                             ; preds = %middle.block, %vector.memcheck, %for.body.preheader755  %i.09.ph = phi i32 [ 0, %vector.memcheck ], [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]756  %0 = xor i32 %i.09.ph, -1757  %1 = add i32 %0, %N758  %xtraiter = and i32 %N, 3759  %lcmp.mod = icmp eq i32 %xtraiter, 0760  br i1 %lcmp.mod, label %for.body.prol.loopexit, label %for.body.prol761 762for.body.prol:                                    ; preds = %for.body.preheader16, %for.body.prol763  %i.09.prol = phi i32 [ %inc.prol, %for.body.prol ], [ %i.09.ph, %for.body.preheader16 ]764  %prol.iter = phi i32 [ %prol.iter.sub, %for.body.prol ], [ %xtraiter, %for.body.preheader16 ]765  %arrayidx.prol = getelementptr inbounds float, ptr %a, i32 %i.09.prol766  %2 = load float, ptr %arrayidx.prol, align 4767  %arrayidx1.prol = getelementptr inbounds i32, ptr %b, i32 %i.09.prol768  %3 = load i32, ptr %arrayidx1.prol, align 4769  %conv.prol = sitofp i32 %3 to float770  %mul.prol = fmul float %2, %conv.prol771  %arrayidx2.prol = getelementptr inbounds float, ptr %c, i32 %i.09.prol772  store float %mul.prol, ptr %arrayidx2.prol, align 4773  %inc.prol = add nuw i32 %i.09.prol, 1774  %prol.iter.sub = add i32 %prol.iter, -1775  %prol.iter.cmp = icmp eq i32 %prol.iter.sub, 0776  br i1 %prol.iter.cmp, label %for.body.prol.loopexit, label %for.body.prol777 778for.body.prol.loopexit:                           ; preds = %for.body.prol, %for.body.preheader16779  %i.09.unr = phi i32 [ %i.09.ph, %for.body.preheader16 ], [ %inc.prol, %for.body.prol ]780  %4 = icmp ult i32 %1, 3781  br i1 %4, label %for.cond.cleanup, label %for.body782 783vector.memcheck:                                  ; preds = %for.body.preheader784  %scevgep = getelementptr float, ptr %c, i32 %N785  %scevgep13 = getelementptr float, ptr %a, i32 %N786  %bound0 = icmp ugt ptr %scevgep13, %c787  %bound1 = icmp ugt ptr %scevgep, %a788  %found.conflict = and i1 %bound0, %bound1789  br i1 %found.conflict, label %for.body.preheader16, label %vector.ph790 791vector.ph:                                        ; preds = %vector.memcheck792  %n.vec = and i32 %N, -4793  br label %vector.body794 795vector.body:                                      ; preds = %vector.body, %vector.ph796  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]797  %5 = getelementptr inbounds float, ptr %a, i32 %index798  %wide.load = load <4 x float>, ptr %5, align 4799  %6 = getelementptr inbounds i32, ptr %b, i32 %index800  %wide.load15 = load <4 x i32>, ptr %6, align 4801  %7 = sitofp <4 x i32> %wide.load15 to <4 x float>802  %8 = fmul <4 x float> %wide.load, %7803  %9 = getelementptr inbounds float, ptr %c, i32 %index804  store <4 x float> %8, ptr %9, align 4805  %index.next = add i32 %index, 4806  %10 = icmp eq i32 %index.next, %n.vec807  br i1 %10, label %middle.block, label %vector.body808 809middle.block:                                     ; preds = %vector.body810  %cmp.n = icmp eq i32 %n.vec, %N811  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader16812 813for.cond.cleanup:                                 ; preds = %for.body.prol.loopexit, %for.body, %middle.block, %entry814  ret void815 816for.body:                                         ; preds = %for.body.prol.loopexit, %for.body817  %i.09 = phi i32 [ %inc.3, %for.body ], [ %i.09.unr, %for.body.prol.loopexit ]818  %arrayidx = getelementptr inbounds float, ptr %a, i32 %i.09819  %11 = load float, ptr %arrayidx, align 4820  %arrayidx1 = getelementptr inbounds i32, ptr %b, i32 %i.09821  %12 = load i32, ptr %arrayidx1, align 4822  %conv = sitofp i32 %12 to float823  %mul = fmul float %11, %conv824  %arrayidx2 = getelementptr inbounds float, ptr %c, i32 %i.09825  store float %mul, ptr %arrayidx2, align 4826  %inc = add nuw i32 %i.09, 1827  %arrayidx.1 = getelementptr inbounds float, ptr %a, i32 %inc828  %13 = load float, ptr %arrayidx.1, align 4829  %arrayidx1.1 = getelementptr inbounds i32, ptr %b, i32 %inc830  %14 = load i32, ptr %arrayidx1.1, align 4831  %conv.1 = sitofp i32 %14 to float832  %mul.1 = fmul float %13, %conv.1833  %arrayidx2.1 = getelementptr inbounds float, ptr %c, i32 %inc834  store float %mul.1, ptr %arrayidx2.1, align 4835  %inc.1 = add nuw i32 %i.09, 2836  %arrayidx.2 = getelementptr inbounds float, ptr %a, i32 %inc.1837  %15 = load float, ptr %arrayidx.2, align 4838  %arrayidx1.2 = getelementptr inbounds i32, ptr %b, i32 %inc.1839  %16 = load i32, ptr %arrayidx1.2, align 4840  %conv.2 = sitofp i32 %16 to float841  %mul.2 = fmul float %15, %conv.2842  %arrayidx2.2 = getelementptr inbounds float, ptr %c, i32 %inc.1843  store float %mul.2, ptr %arrayidx2.2, align 4844  %inc.2 = add nuw i32 %i.09, 3845  %arrayidx.3 = getelementptr inbounds float, ptr %a, i32 %inc.2846  %17 = load float, ptr %arrayidx.3, align 4847  %arrayidx1.3 = getelementptr inbounds i32, ptr %b, i32 %inc.2848  %18 = load i32, ptr %arrayidx1.3, align 4849  %conv.3 = sitofp i32 %18 to float850  %mul.3 = fmul float %17, %conv.3851  %arrayidx2.3 = getelementptr inbounds float, ptr %c, i32 %inc.2852  store float %mul.3, ptr %arrayidx2.3, align 4853  %inc.3 = add nuw i32 %i.09, 4854  %exitcond.3 = icmp eq i32 %inc.3, %N855  br i1 %exitcond.3, label %for.cond.cleanup, label %for.body856}857 858define arm_aapcs_vfpcc void @float_int_int_mul(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {859; CHECK-LABEL: float_int_int_mul:860; CHECK:       @ %bb.0: @ %entry861; CHECK-NEXT:    push {r4, r5, r6, lr}862; CHECK-NEXT:    cbz r3, .LBB4_8863; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader864; CHECK-NEXT:    cmp r3, #3865; CHECK-NEXT:    bhi .LBB4_3866; CHECK-NEXT:  @ %bb.2:867; CHECK-NEXT:    mov.w r12, #0868; CHECK-NEXT:    b .LBB4_6869; CHECK-NEXT:  .LBB4_3: @ %vector.ph870; CHECK-NEXT:    bic r12, r3, #3871; CHECK-NEXT:    movs r5, #1872; CHECK-NEXT:    sub.w r6, r12, #4873; CHECK-NEXT:    mov r4, r0874; CHECK-NEXT:    add.w lr, r5, r6, lsr #2875; CHECK-NEXT:    mov r5, r1876; CHECK-NEXT:    mov r6, r2877; CHECK-NEXT:  .LBB4_4: @ %vector.body878; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1879; CHECK-NEXT:    vldrw.u32 q0, [r4], #16880; CHECK-NEXT:    vldrw.u32 q1, [r5], #16881; CHECK-NEXT:    vmul.i32 q0, q1, q0882; CHECK-NEXT:    vcvt.f32.s32 q0, q0883; CHECK-NEXT:    vstrb.8 q0, [r6], #16884; CHECK-NEXT:    le lr, .LBB4_4885; CHECK-NEXT:  @ %bb.5: @ %middle.block886; CHECK-NEXT:    cmp r12, r3887; CHECK-NEXT:    it eq888; CHECK-NEXT:    popeq {r4, r5, r6, pc}889; CHECK-NEXT:  .LBB4_6: @ %for.body.preheader11890; CHECK-NEXT:    sub.w lr, r3, r12891; CHECK-NEXT:    add.w r0, r0, r12, lsl #2892; CHECK-NEXT:    add.w r1, r1, r12, lsl #2893; CHECK-NEXT:    add.w r2, r2, r12, lsl #2894; CHECK-NEXT:  .LBB4_7: @ %for.body895; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1896; CHECK-NEXT:    ldr r3, [r0], #4897; CHECK-NEXT:    ldr r6, [r1], #4898; CHECK-NEXT:    muls r3, r6, r3899; CHECK-NEXT:    vmov s0, r3900; CHECK-NEXT:    vcvt.f32.s32 s0, s0901; CHECK-NEXT:    vstmia r2!, {s0}902; CHECK-NEXT:    le lr, .LBB4_7903; CHECK-NEXT:  .LBB4_8: @ %for.cond.cleanup904; CHECK-NEXT:    pop {r4, r5, r6, pc}905entry:906  %cmp8 = icmp eq i32 %N, 0907  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader908 909for.body.preheader:                               ; preds = %entry910  %min.iters.check = icmp ult i32 %N, 4911  br i1 %min.iters.check, label %for.body.preheader11, label %vector.ph912 913for.body.preheader11:                             ; preds = %middle.block, %for.body.preheader914  %i.09.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]915  br label %for.body916 917vector.ph:                                        ; preds = %for.body.preheader918  %n.vec = and i32 %N, -4919  br label %vector.body920 921vector.body:                                      ; preds = %vector.body, %vector.ph922  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]923  %0 = getelementptr inbounds i32, ptr %a, i32 %index924  %wide.load = load <4 x i32>, ptr %0, align 4925  %1 = getelementptr inbounds i32, ptr %b, i32 %index926  %wide.load10 = load <4 x i32>, ptr %1, align 4927  %2 = mul nsw <4 x i32> %wide.load10, %wide.load928  %3 = sitofp <4 x i32> %2 to <4 x float>929  %4 = getelementptr inbounds float, ptr %c, i32 %index930  store <4 x float> %3, ptr %4, align 4931  %index.next = add i32 %index, 4932  %5 = icmp eq i32 %index.next, %n.vec933  br i1 %5, label %middle.block, label %vector.body934 935middle.block:                                     ; preds = %vector.body936  %cmp.n = icmp eq i32 %n.vec, %N937  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader11938 939for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry940  ret void941 942for.body:                                         ; preds = %for.body.preheader11, %for.body943  %i.09 = phi i32 [ %inc, %for.body ], [ %i.09.ph, %for.body.preheader11 ]944  %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i.09945  %6 = load i32, ptr %arrayidx, align 4946  %arrayidx1 = getelementptr inbounds i32, ptr %b, i32 %i.09947  %7 = load i32, ptr %arrayidx1, align 4948  %mul = mul nsw i32 %7, %6949  %conv = sitofp i32 %mul to float950  %arrayidx2 = getelementptr inbounds float, ptr %c, i32 %i.09951  store float %conv, ptr %arrayidx2, align 4952  %inc = add nuw i32 %i.09, 1953  %exitcond = icmp eq i32 %inc, %N954  br i1 %exitcond, label %for.cond.cleanup, label %for.body955}956 957define arm_aapcs_vfpcc void @half_half_mul(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {958; CHECK-LABEL: half_half_mul:959; CHECK:       @ %bb.0: @ %entry960; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, lr}961; CHECK-NEXT:    cmp r3, #0962; CHECK-NEXT:    beq .LBB5_8963; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader964; CHECK-NEXT:    cmp r3, #3965; CHECK-NEXT:    bhi .LBB5_3966; CHECK-NEXT:  @ %bb.2:967; CHECK-NEXT:    mov.w r12, #0968; CHECK-NEXT:    b .LBB5_6969; CHECK-NEXT:  .LBB5_3: @ %vector.ph970; CHECK-NEXT:    bic r12, r3, #3971; CHECK-NEXT:    movs r5, #1972; CHECK-NEXT:    sub.w r6, r12, #4973; CHECK-NEXT:    mov r4, r0974; CHECK-NEXT:    add.w lr, r5, r6, lsr #2975; CHECK-NEXT:    mov r5, r1976; CHECK-NEXT:    mov r6, r2977; CHECK-NEXT:  .LBB5_4: @ %vector.body978; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1979; CHECK-NEXT:    ldr.w r9, [r4]980; CHECK-NEXT:    ldr r7, [r5]981; CHECK-NEXT:    ldr.w r8, [r4, #4]982; CHECK-NEXT:    vmov.32 q0[0], r9983; CHECK-NEXT:    ldr.w r10, [r5, #4]984; CHECK-NEXT:    vmov.32 q1[0], r7985; CHECK-NEXT:    vmov.32 q0[1], r8986; CHECK-NEXT:    adds r4, #8987; CHECK-NEXT:    vmov.32 q1[1], r10988; CHECK-NEXT:    adds r5, #8989; CHECK-NEXT:    vmul.f16 q0, q0, q1990; CHECK-NEXT:    vcvtt.f32.f16 s3, s1991; CHECK-NEXT:    vcvtb.f32.f16 s2, s1992; CHECK-NEXT:    vcvtt.f32.f16 s1, s0993; CHECK-NEXT:    vcvtb.f32.f16 s0, s0994; CHECK-NEXT:    vstrb.8 q0, [r6], #16995; CHECK-NEXT:    le lr, .LBB5_4996; CHECK-NEXT:  @ %bb.5: @ %middle.block997; CHECK-NEXT:    cmp r12, r3998; CHECK-NEXT:    beq .LBB5_8999; CHECK-NEXT:  .LBB5_6: @ %for.body.preheader111000; CHECK-NEXT:    sub.w lr, r3, r121001; CHECK-NEXT:    add.w r0, r0, r12, lsl #11002; CHECK-NEXT:    add.w r1, r1, r12, lsl #11003; CHECK-NEXT:    add.w r2, r2, r12, lsl #21004; CHECK-NEXT:  .LBB5_7: @ %for.body1005; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11006; CHECK-NEXT:    vldr.16 s0, [r1]1007; CHECK-NEXT:    vldr.16 s2, [r0]1008; CHECK-NEXT:    adds r0, #21009; CHECK-NEXT:    adds r1, #21010; CHECK-NEXT:    vmul.f16 s0, s2, s01011; CHECK-NEXT:    vcvtb.f32.f16 s0, s01012; CHECK-NEXT:    vstmia r2!, {s0}1013; CHECK-NEXT:    le lr, .LBB5_71014; CHECK-NEXT:  .LBB5_8: @ %for.cond.cleanup1015; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, pc}1016entry:1017  %cmp8 = icmp eq i32 %N, 01018  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader1019 1020for.body.preheader:                               ; preds = %entry1021  %min.iters.check = icmp ult i32 %N, 41022  br i1 %min.iters.check, label %for.body.preheader11, label %vector.ph1023 1024for.body.preheader11:                             ; preds = %middle.block, %for.body.preheader1025  %i.09.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1026  br label %for.body1027 1028vector.ph:                                        ; preds = %for.body.preheader1029  %n.vec = and i32 %N, -41030  br label %vector.body1031 1032vector.body:                                      ; preds = %vector.body, %vector.ph1033  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1034  %0 = getelementptr inbounds half, ptr %a, i32 %index1035  %wide.load = load <4 x half>, ptr %0, align 21036  %1 = getelementptr inbounds half, ptr %b, i32 %index1037  %wide.load10 = load <4 x half>, ptr %1, align 21038  %2 = fmul <4 x half> %wide.load, %wide.load101039  %3 = fpext <4 x half> %2 to <4 x float>1040  %4 = getelementptr inbounds float, ptr %c, i32 %index1041  store <4 x float> %3, ptr %4, align 41042  %index.next = add i32 %index, 41043  %5 = icmp eq i32 %index.next, %n.vec1044  br i1 %5, label %middle.block, label %vector.body1045 1046middle.block:                                     ; preds = %vector.body1047  %cmp.n = icmp eq i32 %n.vec, %N1048  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader111049 1050for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry1051  ret void1052 1053for.body:                                         ; preds = %for.body.preheader11, %for.body1054  %i.09 = phi i32 [ %inc, %for.body ], [ %i.09.ph, %for.body.preheader11 ]1055  %arrayidx = getelementptr inbounds half, ptr %a, i32 %i.091056  %6 = load half, ptr %arrayidx, align 21057  %arrayidx1 = getelementptr inbounds half, ptr %b, i32 %i.091058  %7 = load half, ptr %arrayidx1, align 21059  %mul = fmul half %6, %71060  %conv = fpext half %mul to float1061  %arrayidx2 = getelementptr inbounds float, ptr %c, i32 %i.091062  store float %conv, ptr %arrayidx2, align 41063  %inc = add nuw i32 %i.09, 11064  %exitcond = icmp eq i32 %inc, %N1065  br i1 %exitcond, label %for.cond.cleanup, label %for.body1066}1067 1068define arm_aapcs_vfpcc void @half_half_add(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {1069; CHECK-LABEL: half_half_add:1070; CHECK:       @ %bb.0: @ %entry1071; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, lr}1072; CHECK-NEXT:    cmp r3, #01073; CHECK-NEXT:    beq .LBB6_81074; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader1075; CHECK-NEXT:    cmp r3, #31076; CHECK-NEXT:    bhi .LBB6_31077; CHECK-NEXT:  @ %bb.2:1078; CHECK-NEXT:    mov.w r12, #01079; CHECK-NEXT:    b .LBB6_61080; CHECK-NEXT:  .LBB6_3: @ %vector.ph1081; CHECK-NEXT:    bic r12, r3, #31082; CHECK-NEXT:    movs r5, #11083; CHECK-NEXT:    sub.w r6, r12, #41084; CHECK-NEXT:    mov r4, r01085; CHECK-NEXT:    add.w lr, r5, r6, lsr #21086; CHECK-NEXT:    mov r5, r11087; CHECK-NEXT:    mov r6, r21088; CHECK-NEXT:  .LBB6_4: @ %vector.body1089; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11090; CHECK-NEXT:    ldr.w r9, [r4]1091; CHECK-NEXT:    ldr r7, [r5]1092; CHECK-NEXT:    ldr.w r8, [r4, #4]1093; CHECK-NEXT:    vmov.32 q0[0], r91094; CHECK-NEXT:    ldr.w r10, [r5, #4]1095; CHECK-NEXT:    vmov.32 q1[0], r71096; CHECK-NEXT:    vmov.32 q0[1], r81097; CHECK-NEXT:    adds r4, #81098; CHECK-NEXT:    vmov.32 q1[1], r101099; CHECK-NEXT:    adds r5, #81100; CHECK-NEXT:    vadd.f16 q0, q0, q11101; CHECK-NEXT:    vcvtt.f32.f16 s3, s11102; CHECK-NEXT:    vcvtb.f32.f16 s2, s11103; CHECK-NEXT:    vcvtt.f32.f16 s1, s01104; CHECK-NEXT:    vcvtb.f32.f16 s0, s01105; CHECK-NEXT:    vstrb.8 q0, [r6], #161106; CHECK-NEXT:    le lr, .LBB6_41107; CHECK-NEXT:  @ %bb.5: @ %middle.block1108; CHECK-NEXT:    cmp r12, r31109; CHECK-NEXT:    beq .LBB6_81110; CHECK-NEXT:  .LBB6_6: @ %for.body.preheader111111; CHECK-NEXT:    sub.w lr, r3, r121112; CHECK-NEXT:    add.w r0, r0, r12, lsl #11113; CHECK-NEXT:    add.w r1, r1, r12, lsl #11114; CHECK-NEXT:    add.w r2, r2, r12, lsl #21115; CHECK-NEXT:  .LBB6_7: @ %for.body1116; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11117; CHECK-NEXT:    vldr.16 s0, [r1]1118; CHECK-NEXT:    vldr.16 s2, [r0]1119; CHECK-NEXT:    adds r0, #21120; CHECK-NEXT:    adds r1, #21121; CHECK-NEXT:    vadd.f16 s0, s2, s01122; CHECK-NEXT:    vcvtb.f32.f16 s0, s01123; CHECK-NEXT:    vstmia r2!, {s0}1124; CHECK-NEXT:    le lr, .LBB6_71125; CHECK-NEXT:  .LBB6_8: @ %for.cond.cleanup1126; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, pc}1127entry:1128  %cmp8 = icmp eq i32 %N, 01129  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader1130 1131for.body.preheader:                               ; preds = %entry1132  %min.iters.check = icmp ult i32 %N, 41133  br i1 %min.iters.check, label %for.body.preheader11, label %vector.ph1134 1135for.body.preheader11:                             ; preds = %middle.block, %for.body.preheader1136  %i.09.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1137  br label %for.body1138 1139vector.ph:                                        ; preds = %for.body.preheader1140  %n.vec = and i32 %N, -41141  br label %vector.body1142 1143vector.body:                                      ; preds = %vector.body, %vector.ph1144  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1145  %0 = getelementptr inbounds half, ptr %a, i32 %index1146  %wide.load = load <4 x half>, ptr %0, align 21147  %1 = getelementptr inbounds half, ptr %b, i32 %index1148  %wide.load10 = load <4 x half>, ptr %1, align 21149  %2 = fadd <4 x half> %wide.load, %wide.load101150  %3 = fpext <4 x half> %2 to <4 x float>1151  %4 = getelementptr inbounds float, ptr %c, i32 %index1152  store <4 x float> %3, ptr %4, align 41153  %index.next = add i32 %index, 41154  %5 = icmp eq i32 %index.next, %n.vec1155  br i1 %5, label %middle.block, label %vector.body1156 1157middle.block:                                     ; preds = %vector.body1158  %cmp.n = icmp eq i32 %n.vec, %N1159  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader111160 1161for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry1162  ret void1163 1164for.body:                                         ; preds = %for.body.preheader11, %for.body1165  %i.09 = phi i32 [ %inc, %for.body ], [ %i.09.ph, %for.body.preheader11 ]1166  %arrayidx = getelementptr inbounds half, ptr %a, i32 %i.091167  %6 = load half, ptr %arrayidx, align 21168  %arrayidx1 = getelementptr inbounds half, ptr %b, i32 %i.091169  %7 = load half, ptr %arrayidx1, align 21170  %add = fadd half %6, %71171  %conv = fpext half %add to float1172  %arrayidx2 = getelementptr inbounds float, ptr %c, i32 %i.091173  store float %conv, ptr %arrayidx2, align 41174  %inc = add nuw i32 %i.09, 11175  %exitcond = icmp eq i32 %inc, %N1176  br i1 %exitcond, label %for.cond.cleanup, label %for.body1177}1178 1179define arm_aapcs_vfpcc void @half_half_sub(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {1180; CHECK-LABEL: half_half_sub:1181; CHECK:       @ %bb.0: @ %entry1182; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, lr}1183; CHECK-NEXT:    cmp r3, #01184; CHECK-NEXT:    beq .LBB7_81185; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader1186; CHECK-NEXT:    cmp r3, #31187; CHECK-NEXT:    bhi .LBB7_31188; CHECK-NEXT:  @ %bb.2:1189; CHECK-NEXT:    mov.w r12, #01190; CHECK-NEXT:    b .LBB7_61191; CHECK-NEXT:  .LBB7_3: @ %vector.ph1192; CHECK-NEXT:    bic r12, r3, #31193; CHECK-NEXT:    movs r5, #11194; CHECK-NEXT:    sub.w r6, r12, #41195; CHECK-NEXT:    mov r4, r01196; CHECK-NEXT:    add.w lr, r5, r6, lsr #21197; CHECK-NEXT:    mov r5, r11198; CHECK-NEXT:    mov r6, r21199; CHECK-NEXT:  .LBB7_4: @ %vector.body1200; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11201; CHECK-NEXT:    ldr.w r9, [r4]1202; CHECK-NEXT:    ldr r7, [r5]1203; CHECK-NEXT:    ldr.w r8, [r4, #4]1204; CHECK-NEXT:    vmov.32 q0[0], r91205; CHECK-NEXT:    ldr.w r10, [r5, #4]1206; CHECK-NEXT:    vmov.32 q1[0], r71207; CHECK-NEXT:    vmov.32 q0[1], r81208; CHECK-NEXT:    adds r4, #81209; CHECK-NEXT:    vmov.32 q1[1], r101210; CHECK-NEXT:    adds r5, #81211; CHECK-NEXT:    vsub.f16 q0, q0, q11212; CHECK-NEXT:    vcvtt.f32.f16 s3, s11213; CHECK-NEXT:    vcvtb.f32.f16 s2, s11214; CHECK-NEXT:    vcvtt.f32.f16 s1, s01215; CHECK-NEXT:    vcvtb.f32.f16 s0, s01216; CHECK-NEXT:    vstrb.8 q0, [r6], #161217; CHECK-NEXT:    le lr, .LBB7_41218; CHECK-NEXT:  @ %bb.5: @ %middle.block1219; CHECK-NEXT:    cmp r12, r31220; CHECK-NEXT:    beq .LBB7_81221; CHECK-NEXT:  .LBB7_6: @ %for.body.preheader111222; CHECK-NEXT:    sub.w lr, r3, r121223; CHECK-NEXT:    add.w r0, r0, r12, lsl #11224; CHECK-NEXT:    add.w r1, r1, r12, lsl #11225; CHECK-NEXT:    add.w r2, r2, r12, lsl #21226; CHECK-NEXT:  .LBB7_7: @ %for.body1227; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11228; CHECK-NEXT:    vldr.16 s0, [r1]1229; CHECK-NEXT:    vldr.16 s2, [r0]1230; CHECK-NEXT:    adds r0, #21231; CHECK-NEXT:    adds r1, #21232; CHECK-NEXT:    vsub.f16 s0, s2, s01233; CHECK-NEXT:    vcvtb.f32.f16 s0, s01234; CHECK-NEXT:    vstmia r2!, {s0}1235; CHECK-NEXT:    le lr, .LBB7_71236; CHECK-NEXT:  .LBB7_8: @ %for.cond.cleanup1237; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, pc}1238entry:1239  %cmp8 = icmp eq i32 %N, 01240  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader1241 1242for.body.preheader:                               ; preds = %entry1243  %min.iters.check = icmp ult i32 %N, 41244  br i1 %min.iters.check, label %for.body.preheader11, label %vector.ph1245 1246for.body.preheader11:                             ; preds = %middle.block, %for.body.preheader1247  %i.09.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1248  br label %for.body1249 1250vector.ph:                                        ; preds = %for.body.preheader1251  %n.vec = and i32 %N, -41252  br label %vector.body1253 1254vector.body:                                      ; preds = %vector.body, %vector.ph1255  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1256  %0 = getelementptr inbounds half, ptr %a, i32 %index1257  %wide.load = load <4 x half>, ptr %0, align 21258  %1 = getelementptr inbounds half, ptr %b, i32 %index1259  %wide.load10 = load <4 x half>, ptr %1, align 21260  %2 = fsub <4 x half> %wide.load, %wide.load101261  %3 = fpext <4 x half> %2 to <4 x float>1262  %4 = getelementptr inbounds float, ptr %c, i32 %index1263  store <4 x float> %3, ptr %4, align 41264  %index.next = add i32 %index, 41265  %5 = icmp eq i32 %index.next, %n.vec1266  br i1 %5, label %middle.block, label %vector.body1267 1268middle.block:                                     ; preds = %vector.body1269  %cmp.n = icmp eq i32 %n.vec, %N1270  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader111271 1272for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry1273  ret void1274 1275for.body:                                         ; preds = %for.body.preheader11, %for.body1276  %i.09 = phi i32 [ %inc, %for.body ], [ %i.09.ph, %for.body.preheader11 ]1277  %arrayidx = getelementptr inbounds half, ptr %a, i32 %i.091278  %6 = load half, ptr %arrayidx, align 21279  %arrayidx1 = getelementptr inbounds half, ptr %b, i32 %i.091280  %7 = load half, ptr %arrayidx1, align 21281  %sub = fsub half %6, %71282  %conv = fpext half %sub to float1283  %arrayidx2 = getelementptr inbounds float, ptr %c, i32 %i.091284  store float %conv, ptr %arrayidx2, align 41285  %inc = add nuw i32 %i.09, 11286  %exitcond = icmp eq i32 %inc, %N1287  br i1 %exitcond, label %for.cond.cleanup, label %for.body1288}1289 1290define arm_aapcs_vfpcc void @half_short_mul(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr nocapture %c, i32 %N) {1291; CHECK-LABEL: half_short_mul:1292; CHECK:       @ %bb.0: @ %entry1293; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}1294; CHECK-NEXT:    sub sp, #161295; CHECK-NEXT:    cmp r3, #01296; CHECK-NEXT:    beq .LBB8_81297; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader1298; CHECK-NEXT:    mov r8, r21299; CHECK-NEXT:    mov r9, r11300; CHECK-NEXT:    cmp r3, #31301; CHECK-NEXT:    bhi .LBB8_31302; CHECK-NEXT:  @ %bb.2:1303; CHECK-NEXT:    mov.w r12, #01304; CHECK-NEXT:    b .LBB8_61305; CHECK-NEXT:  .LBB8_3: @ %vector.ph1306; CHECK-NEXT:    bic r12, r3, #31307; CHECK-NEXT:    movs r6, #11308; CHECK-NEXT:    sub.w r7, r12, #41309; CHECK-NEXT:    mov r1, sp1310; CHECK-NEXT:    mov r5, r01311; CHECK-NEXT:    add.w lr, r6, r7, lsr #21312; CHECK-NEXT:    mov r6, r91313; CHECK-NEXT:    mov r7, r81314; CHECK-NEXT:  .LBB8_4: @ %vector.body1315; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11316; CHECK-NEXT:    vldrh.u32 q0, [r6], #81317; CHECK-NEXT:    ldr r4, [r5]1318; CHECK-NEXT:    ldr r2, [r5, #4]1319; CHECK-NEXT:    adds r5, #81320; CHECK-NEXT:    vstrh.32 q0, [r1]1321; CHECK-NEXT:    vmov.32 q1[0], r41322; CHECK-NEXT:    vldrw.u32 q0, [r1]1323; CHECK-NEXT:    vmov.32 q1[1], r21324; CHECK-NEXT:    vcvt.f16.s16 q0, q01325; CHECK-NEXT:    vmul.f16 q0, q1, q01326; CHECK-NEXT:    vcvtt.f32.f16 s3, s11327; CHECK-NEXT:    vcvtb.f32.f16 s2, s11328; CHECK-NEXT:    vcvtt.f32.f16 s1, s01329; CHECK-NEXT:    vcvtb.f32.f16 s0, s01330; CHECK-NEXT:    vstrb.8 q0, [r7], #161331; CHECK-NEXT:    le lr, .LBB8_41332; CHECK-NEXT:  @ %bb.5: @ %middle.block1333; CHECK-NEXT:    cmp r12, r31334; CHECK-NEXT:    beq .LBB8_81335; CHECK-NEXT:  .LBB8_6: @ %for.body.preheader131336; CHECK-NEXT:    sub.w lr, r3, r121337; CHECK-NEXT:    add.w r0, r0, r12, lsl #11338; CHECK-NEXT:    add.w r1, r9, r12, lsl #11339; CHECK-NEXT:    add.w r2, r8, r12, lsl #21340; CHECK-NEXT:  .LBB8_7: @ %for.body1341; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11342; CHECK-NEXT:    ldrsh r3, [r1], #21343; CHECK-NEXT:    vldr.16 s0, [r0]1344; CHECK-NEXT:    adds r0, #21345; CHECK-NEXT:    vmov s2, r31346; CHECK-NEXT:    vcvt.f16.s32 s2, s21347; CHECK-NEXT:    vmul.f16 s0, s0, s21348; CHECK-NEXT:    vcvtb.f32.f16 s0, s01349; CHECK-NEXT:    vstmia r2!, {s0}1350; CHECK-NEXT:    le lr, .LBB8_71351; CHECK-NEXT:  .LBB8_8: @ %for.cond.cleanup1352; CHECK-NEXT:    add sp, #161353; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}1354entry:1355  %cmp10 = icmp eq i32 %N, 01356  br i1 %cmp10, label %for.cond.cleanup, label %for.body.preheader1357 1358for.body.preheader:                               ; preds = %entry1359  %min.iters.check = icmp ult i32 %N, 41360  br i1 %min.iters.check, label %for.body.preheader13, label %vector.ph1361 1362for.body.preheader13:                             ; preds = %middle.block, %for.body.preheader1363  %i.011.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1364  br label %for.body1365 1366vector.ph:                                        ; preds = %for.body.preheader1367  %n.vec = and i32 %N, -41368  br label %vector.body1369 1370vector.body:                                      ; preds = %vector.body, %vector.ph1371  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1372  %0 = getelementptr inbounds half, ptr %a, i32 %index1373  %wide.load = load <4 x half>, ptr %0, align 21374  %1 = getelementptr inbounds i16, ptr %b, i32 %index1375  %wide.load12 = load <4 x i16>, ptr %1, align 21376  %2 = sitofp <4 x i16> %wide.load12 to <4 x half>1377  %3 = fmul <4 x half> %wide.load, %21378  %4 = fpext <4 x half> %3 to <4 x float>1379  %5 = getelementptr inbounds float, ptr %c, i32 %index1380  store <4 x float> %4, ptr %5, align 41381  %index.next = add i32 %index, 41382  %6 = icmp eq i32 %index.next, %n.vec1383  br i1 %6, label %middle.block, label %vector.body1384 1385middle.block:                                     ; preds = %vector.body1386  %cmp.n = icmp eq i32 %n.vec, %N1387  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader131388 1389for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry1390  ret void1391 1392for.body:                                         ; preds = %for.body.preheader13, %for.body1393  %i.011 = phi i32 [ %inc, %for.body ], [ %i.011.ph, %for.body.preheader13 ]1394  %arrayidx = getelementptr inbounds half, ptr %a, i32 %i.0111395  %7 = load half, ptr %arrayidx, align 21396  %arrayidx1 = getelementptr inbounds i16, ptr %b, i32 %i.0111397  %8 = load i16, ptr %arrayidx1, align 21398  %conv2 = sitofp i16 %8 to half1399  %mul = fmul half %7, %conv21400  %conv3 = fpext half %mul to float1401  %arrayidx4 = getelementptr inbounds float, ptr %c, i32 %i.0111402  store float %conv3, ptr %arrayidx4, align 41403  %inc = add nuw i32 %i.011, 11404  %exitcond = icmp eq i32 %inc, %N1405  br i1 %exitcond, label %for.cond.cleanup, label %for.body1406}1407 1408define arm_aapcs_vfpcc float @half_half_mac(ptr nocapture readonly %a, ptr nocapture readonly %b, i32 %N) {1409; CHECK-LABEL: half_half_mac:1410; CHECK:       @ %bb.0: @ %entry1411; CHECK-NEXT:    push {r4, r5, r7, lr}1412; CHECK-NEXT:    cbz r2, .LBB9_31413; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader1414; CHECK-NEXT:    and r12, r2, #31415; CHECK-NEXT:    subs r3, r2, #11416; CHECK-NEXT:    cmp r3, #31417; CHECK-NEXT:    bhs .LBB9_41418; CHECK-NEXT:  @ %bb.2:1419; CHECK-NEXT:    vldr s0, .LCPI9_01420; CHECK-NEXT:    movs r2, #01421; CHECK-NEXT:    b .LBB9_61422; CHECK-NEXT:  .LBB9_3:1423; CHECK-NEXT:    vldr s0, .LCPI9_01424; CHECK-NEXT:    pop {r4, r5, r7, pc}1425; CHECK-NEXT:  .LBB9_4: @ %for.body.preheader.new1426; CHECK-NEXT:    bic r2, r2, #31427; CHECK-NEXT:    movs r3, #11428; CHECK-NEXT:    subs r2, #41429; CHECK-NEXT:    vldr s0, .LCPI9_01430; CHECK-NEXT:    add.w lr, r3, r2, lsr #21431; CHECK-NEXT:    movs r3, #01432; CHECK-NEXT:    movs r2, #01433; CHECK-NEXT:  .LBB9_5: @ %for.body1434; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11435; CHECK-NEXT:    adds r5, r0, r31436; CHECK-NEXT:    adds r4, r1, r31437; CHECK-NEXT:    vldr.16 s2, [r4, #6]1438; CHECK-NEXT:    vldr.16 s4, [r5, #6]1439; CHECK-NEXT:    vldr.16 s6, [r5, #4]1440; CHECK-NEXT:    vldr.16 s8, [r5, #2]1441; CHECK-NEXT:    vmul.f16 s2, s4, s21442; CHECK-NEXT:    vldr.16 s4, [r4, #4]1443; CHECK-NEXT:    vldr.16 s10, [r5]1444; CHECK-NEXT:    vcvtb.f32.f16 s2, s21445; CHECK-NEXT:    vmul.f16 s4, s6, s41446; CHECK-NEXT:    vldr.16 s6, [r4, #2]1447; CHECK-NEXT:    vcvtb.f32.f16 s4, s41448; CHECK-NEXT:    adds r3, #81449; CHECK-NEXT:    vmul.f16 s6, s8, s61450; CHECK-NEXT:    vldr.16 s8, [r4]1451; CHECK-NEXT:    vcvtb.f32.f16 s6, s61452; CHECK-NEXT:    adds r2, #41453; CHECK-NEXT:    vmul.f16 s8, s10, s81454; CHECK-NEXT:    vcvtb.f32.f16 s8, s81455; CHECK-NEXT:    vadd.f32 s0, s0, s81456; CHECK-NEXT:    vadd.f32 s0, s0, s61457; CHECK-NEXT:    vadd.f32 s0, s0, s41458; CHECK-NEXT:    vadd.f32 s0, s0, s21459; CHECK-NEXT:    le lr, .LBB9_51460; CHECK-NEXT:  .LBB9_6: @ %for.cond.cleanup.loopexit.unr-lcssa1461; CHECK-NEXT:    wls lr, r12, .LBB9_91462; CHECK-NEXT:  @ %bb.7: @ %for.body.epil.preheader1463; CHECK-NEXT:    add.w r0, r0, r2, lsl #11464; CHECK-NEXT:    add.w r1, r1, r2, lsl #11465; CHECK-NEXT:  .LBB9_8: @ %for.body.epil1466; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11467; CHECK-NEXT:    vldr.16 s2, [r1]1468; CHECK-NEXT:    vldr.16 s4, [r0]1469; CHECK-NEXT:    adds r0, #21470; CHECK-NEXT:    adds r1, #21471; CHECK-NEXT:    vmul.f16 s2, s4, s21472; CHECK-NEXT:    vcvtb.f32.f16 s2, s21473; CHECK-NEXT:    vadd.f32 s0, s0, s21474; CHECK-NEXT:    le lr, .LBB9_81475; CHECK-NEXT:  .LBB9_9: @ %for.cond.cleanup1476; CHECK-NEXT:    pop {r4, r5, r7, pc}1477; CHECK-NEXT:    .p2align 21478; CHECK-NEXT:  @ %bb.10:1479; CHECK-NEXT:  .LCPI9_0:1480; CHECK-NEXT:    .long 0x00000000 @ float 01481entry:1482  %cmp8 = icmp eq i32 %N, 01483  br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader1484 1485for.body.preheader:                               ; preds = %entry1486  %0 = add i32 %N, -11487  %xtraiter = and i32 %N, 31488  %1 = icmp ult i32 %0, 31489  br i1 %1, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body.preheader.new1490 1491for.body.preheader.new:                           ; preds = %for.body.preheader1492  %unroll_iter = sub i32 %N, %xtraiter1493  br label %for.body1494 1495for.cond.cleanup.loopexit.unr-lcssa:              ; preds = %for.body, %for.body.preheader1496  %add.lcssa.ph = phi float [ undef, %for.body.preheader ], [ %add.3, %for.body ]1497  %i.010.unr = phi i32 [ 0, %for.body.preheader ], [ %inc.3, %for.body ]1498  %res.09.unr = phi float [ 0.000000e+00, %for.body.preheader ], [ %add.3, %for.body ]1499  %lcmp.mod = icmp eq i32 %xtraiter, 01500  br i1 %lcmp.mod, label %for.cond.cleanup, label %for.body.epil1501 1502for.body.epil:                                    ; preds = %for.cond.cleanup.loopexit.unr-lcssa, %for.body.epil1503  %i.010.epil = phi i32 [ %inc.epil, %for.body.epil ], [ %i.010.unr, %for.cond.cleanup.loopexit.unr-lcssa ]1504  %res.09.epil = phi float [ %add.epil, %for.body.epil ], [ %res.09.unr, %for.cond.cleanup.loopexit.unr-lcssa ]1505  %epil.iter = phi i32 [ %epil.iter.sub, %for.body.epil ], [ %xtraiter, %for.cond.cleanup.loopexit.unr-lcssa ]1506  %arrayidx.epil = getelementptr inbounds half, ptr %a, i32 %i.010.epil1507  %2 = load half, ptr %arrayidx.epil, align 21508  %arrayidx1.epil = getelementptr inbounds half, ptr %b, i32 %i.010.epil1509  %3 = load half, ptr %arrayidx1.epil, align 21510  %mul.epil = fmul half %2, %31511  %conv.epil = fpext half %mul.epil to float1512  %add.epil = fadd float %res.09.epil, %conv.epil1513  %inc.epil = add nuw i32 %i.010.epil, 11514  %epil.iter.sub = add i32 %epil.iter, -11515  %epil.iter.cmp = icmp eq i32 %epil.iter.sub, 01516  br i1 %epil.iter.cmp, label %for.cond.cleanup, label %for.body.epil1517 1518for.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit.unr-lcssa, %for.body.epil, %entry1519  %res.0.lcssa = phi float [ 0.000000e+00, %entry ], [ %add.lcssa.ph, %for.cond.cleanup.loopexit.unr-lcssa ], [ %add.epil, %for.body.epil ]1520  ret float %res.0.lcssa1521 1522for.body:                                         ; preds = %for.body, %for.body.preheader.new1523  %i.010 = phi i32 [ 0, %for.body.preheader.new ], [ %inc.3, %for.body ]1524  %res.09 = phi float [ 0.000000e+00, %for.body.preheader.new ], [ %add.3, %for.body ]1525  %niter = phi i32 [ %unroll_iter, %for.body.preheader.new ], [ %niter.nsub.3, %for.body ]1526  %arrayidx = getelementptr inbounds half, ptr %a, i32 %i.0101527  %4 = load half, ptr %arrayidx, align 21528  %arrayidx1 = getelementptr inbounds half, ptr %b, i32 %i.0101529  %5 = load half, ptr %arrayidx1, align 21530  %mul = fmul half %4, %51531  %conv = fpext half %mul to float1532  %add = fadd float %res.09, %conv1533  %inc = or disjoint i32 %i.010, 11534  %arrayidx.1 = getelementptr inbounds half, ptr %a, i32 %inc1535  %6 = load half, ptr %arrayidx.1, align 21536  %arrayidx1.1 = getelementptr inbounds half, ptr %b, i32 %inc1537  %7 = load half, ptr %arrayidx1.1, align 21538  %mul.1 = fmul half %6, %71539  %conv.1 = fpext half %mul.1 to float1540  %add.1 = fadd float %add, %conv.11541  %inc.1 = or disjoint i32 %i.010, 21542  %arrayidx.2 = getelementptr inbounds half, ptr %a, i32 %inc.11543  %8 = load half, ptr %arrayidx.2, align 21544  %arrayidx1.2 = getelementptr inbounds half, ptr %b, i32 %inc.11545  %9 = load half, ptr %arrayidx1.2, align 21546  %mul.2 = fmul half %8, %91547  %conv.2 = fpext half %mul.2 to float1548  %add.2 = fadd float %add.1, %conv.21549  %inc.2 = or disjoint i32 %i.010, 31550  %arrayidx.3 = getelementptr inbounds half, ptr %a, i32 %inc.21551  %10 = load half, ptr %arrayidx.3, align 21552  %arrayidx1.3 = getelementptr inbounds half, ptr %b, i32 %inc.21553  %11 = load half, ptr %arrayidx1.3, align 21554  %mul.3 = fmul half %10, %111555  %conv.3 = fpext half %mul.3 to float1556  %add.3 = fadd float %add.2, %conv.31557  %inc.3 = add nuw i32 %i.010, 41558  %niter.nsub.3 = add i32 %niter, -41559  %niter.ncmp.3 = icmp eq i32 %niter.nsub.3, 01560  br i1 %niter.ncmp.3, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body1561}1562 1563define arm_aapcs_vfpcc float @half_half_acc(ptr nocapture readonly %a, ptr nocapture readonly %b, i32 %N) {1564; CHECK-LABEL: half_half_acc:1565; CHECK:       @ %bb.0: @ %entry1566; CHECK-NEXT:    push {r4, r5, r7, lr}1567; CHECK-NEXT:    cbz r2, .LBB10_31568; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader1569; CHECK-NEXT:    and r12, r2, #31570; CHECK-NEXT:    subs r3, r2, #11571; CHECK-NEXT:    cmp r3, #31572; CHECK-NEXT:    bhs .LBB10_41573; CHECK-NEXT:  @ %bb.2:1574; CHECK-NEXT:    vldr s0, .LCPI10_01575; CHECK-NEXT:    movs r2, #01576; CHECK-NEXT:    b .LBB10_61577; CHECK-NEXT:  .LBB10_3:1578; CHECK-NEXT:    vldr s0, .LCPI10_01579; CHECK-NEXT:    pop {r4, r5, r7, pc}1580; CHECK-NEXT:  .LBB10_4: @ %for.body.preheader.new1581; CHECK-NEXT:    bic r2, r2, #31582; CHECK-NEXT:    movs r3, #11583; CHECK-NEXT:    subs r2, #41584; CHECK-NEXT:    vldr s0, .LCPI10_01585; CHECK-NEXT:    add.w lr, r3, r2, lsr #21586; CHECK-NEXT:    movs r3, #01587; CHECK-NEXT:    movs r2, #01588; CHECK-NEXT:  .LBB10_5: @ %for.body1589; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11590; CHECK-NEXT:    adds r5, r0, r31591; CHECK-NEXT:    adds r4, r1, r31592; CHECK-NEXT:    vldr.16 s2, [r4, #6]1593; CHECK-NEXT:    vldr.16 s4, [r5, #6]1594; CHECK-NEXT:    vldr.16 s6, [r5, #4]1595; CHECK-NEXT:    vldr.16 s8, [r5, #2]1596; CHECK-NEXT:    vadd.f16 s2, s4, s21597; CHECK-NEXT:    vldr.16 s4, [r4, #4]1598; CHECK-NEXT:    vldr.16 s10, [r5]1599; CHECK-NEXT:    vcvtb.f32.f16 s2, s21600; CHECK-NEXT:    vadd.f16 s4, s6, s41601; CHECK-NEXT:    vldr.16 s6, [r4, #2]1602; CHECK-NEXT:    vcvtb.f32.f16 s4, s41603; CHECK-NEXT:    adds r3, #81604; CHECK-NEXT:    vadd.f16 s6, s8, s61605; CHECK-NEXT:    vldr.16 s8, [r4]1606; CHECK-NEXT:    vcvtb.f32.f16 s6, s61607; CHECK-NEXT:    adds r2, #41608; CHECK-NEXT:    vadd.f16 s8, s10, s81609; CHECK-NEXT:    vcvtb.f32.f16 s8, s81610; CHECK-NEXT:    vadd.f32 s0, s0, s81611; CHECK-NEXT:    vadd.f32 s0, s0, s61612; CHECK-NEXT:    vadd.f32 s0, s0, s41613; CHECK-NEXT:    vadd.f32 s0, s0, s21614; CHECK-NEXT:    le lr, .LBB10_51615; CHECK-NEXT:  .LBB10_6: @ %for.cond.cleanup.loopexit.unr-lcssa1616; CHECK-NEXT:    wls lr, r12, .LBB10_91617; CHECK-NEXT:  @ %bb.7: @ %for.body.epil.preheader1618; CHECK-NEXT:    add.w r0, r0, r2, lsl #11619; CHECK-NEXT:    add.w r1, r1, r2, lsl #11620; CHECK-NEXT:  .LBB10_8: @ %for.body.epil1621; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11622; CHECK-NEXT:    vldr.16 s2, [r1]1623; CHECK-NEXT:    vldr.16 s4, [r0]1624; CHECK-NEXT:    adds r0, #21625; CHECK-NEXT:    adds r1, #21626; CHECK-NEXT:    vadd.f16 s2, s4, s21627; CHECK-NEXT:    vcvtb.f32.f16 s2, s21628; CHECK-NEXT:    vadd.f32 s0, s0, s21629; CHECK-NEXT:    le lr, .LBB10_81630; CHECK-NEXT:  .LBB10_9: @ %for.cond.cleanup1631; CHECK-NEXT:    pop {r4, r5, r7, pc}1632; CHECK-NEXT:    .p2align 21633; CHECK-NEXT:  @ %bb.10:1634; CHECK-NEXT:  .LCPI10_0:1635; CHECK-NEXT:    .long 0x00000000 @ float 01636entry:1637  %cmp9 = icmp eq i32 %N, 01638  br i1 %cmp9, label %for.cond.cleanup, label %for.body.preheader1639 1640for.body.preheader:                               ; preds = %entry1641  %0 = add i32 %N, -11642  %xtraiter = and i32 %N, 31643  %1 = icmp ult i32 %0, 31644  br i1 %1, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body.preheader.new1645 1646for.body.preheader.new:                           ; preds = %for.body.preheader1647  %unroll_iter = sub i32 %N, %xtraiter1648  br label %for.body1649 1650for.cond.cleanup.loopexit.unr-lcssa:              ; preds = %for.body, %for.body.preheader1651  %add2.lcssa.ph = phi float [ undef, %for.body.preheader ], [ %add2.3, %for.body ]1652  %i.011.unr = phi i32 [ 0, %for.body.preheader ], [ %inc.3, %for.body ]1653  %res.010.unr = phi float [ 0.000000e+00, %for.body.preheader ], [ %add2.3, %for.body ]1654  %lcmp.mod = icmp eq i32 %xtraiter, 01655  br i1 %lcmp.mod, label %for.cond.cleanup, label %for.body.epil1656 1657for.body.epil:                                    ; preds = %for.cond.cleanup.loopexit.unr-lcssa, %for.body.epil1658  %i.011.epil = phi i32 [ %inc.epil, %for.body.epil ], [ %i.011.unr, %for.cond.cleanup.loopexit.unr-lcssa ]1659  %res.010.epil = phi float [ %add2.epil, %for.body.epil ], [ %res.010.unr, %for.cond.cleanup.loopexit.unr-lcssa ]1660  %epil.iter = phi i32 [ %epil.iter.sub, %for.body.epil ], [ %xtraiter, %for.cond.cleanup.loopexit.unr-lcssa ]1661  %arrayidx.epil = getelementptr inbounds half, ptr %a, i32 %i.011.epil1662  %2 = load half, ptr %arrayidx.epil, align 21663  %arrayidx1.epil = getelementptr inbounds half, ptr %b, i32 %i.011.epil1664  %3 = load half, ptr %arrayidx1.epil, align 21665  %add.epil = fadd half %2, %31666  %conv.epil = fpext half %add.epil to float1667  %add2.epil = fadd float %res.010.epil, %conv.epil1668  %inc.epil = add nuw i32 %i.011.epil, 11669  %epil.iter.sub = add i32 %epil.iter, -11670  %epil.iter.cmp = icmp eq i32 %epil.iter.sub, 01671  br i1 %epil.iter.cmp, label %for.cond.cleanup, label %for.body.epil1672 1673for.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit.unr-lcssa, %for.body.epil, %entry1674  %res.0.lcssa = phi float [ 0.000000e+00, %entry ], [ %add2.lcssa.ph, %for.cond.cleanup.loopexit.unr-lcssa ], [ %add2.epil, %for.body.epil ]1675  ret float %res.0.lcssa1676 1677for.body:                                         ; preds = %for.body, %for.body.preheader.new1678  %i.011 = phi i32 [ 0, %for.body.preheader.new ], [ %inc.3, %for.body ]1679  %res.010 = phi float [ 0.000000e+00, %for.body.preheader.new ], [ %add2.3, %for.body ]1680  %niter = phi i32 [ %unroll_iter, %for.body.preheader.new ], [ %niter.nsub.3, %for.body ]1681  %arrayidx = getelementptr inbounds half, ptr %a, i32 %i.0111682  %4 = load half, ptr %arrayidx, align 21683  %arrayidx1 = getelementptr inbounds half, ptr %b, i32 %i.0111684  %5 = load half, ptr %arrayidx1, align 21685  %add = fadd half %4, %51686  %conv = fpext half %add to float1687  %add2 = fadd float %res.010, %conv1688  %inc = or disjoint i32 %i.011, 11689  %arrayidx.1 = getelementptr inbounds half, ptr %a, i32 %inc1690  %6 = load half, ptr %arrayidx.1, align 21691  %arrayidx1.1 = getelementptr inbounds half, ptr %b, i32 %inc1692  %7 = load half, ptr %arrayidx1.1, align 21693  %add.1 = fadd half %6, %71694  %conv.1 = fpext half %add.1 to float1695  %add2.1 = fadd float %add2, %conv.11696  %inc.1 = or disjoint i32 %i.011, 21697  %arrayidx.2 = getelementptr inbounds half, ptr %a, i32 %inc.11698  %8 = load half, ptr %arrayidx.2, align 21699  %arrayidx1.2 = getelementptr inbounds half, ptr %b, i32 %inc.11700  %9 = load half, ptr %arrayidx1.2, align 21701  %add.2 = fadd half %8, %91702  %conv.2 = fpext half %add.2 to float1703  %add2.2 = fadd float %add2.1, %conv.21704  %inc.2 = or disjoint i32 %i.011, 31705  %arrayidx.3 = getelementptr inbounds half, ptr %a, i32 %inc.21706  %10 = load half, ptr %arrayidx.3, align 21707  %arrayidx1.3 = getelementptr inbounds half, ptr %b, i32 %inc.21708  %11 = load half, ptr %arrayidx1.3, align 21709  %add.3 = fadd half %10, %111710  %conv.3 = fpext half %add.3 to float1711  %add2.3 = fadd float %add2.2, %conv.31712  %inc.3 = add nuw i32 %i.011, 41713  %niter.nsub.3 = add i32 %niter, -41714  %niter.ncmp.3 = icmp eq i32 %niter.nsub.3, 01715  br i1 %niter.ncmp.3, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body1716}1717 1718define arm_aapcs_vfpcc float @half_short_mac(ptr nocapture readonly %a, ptr nocapture readonly %b, i32 %N) {1719; CHECK-LABEL: half_short_mac:1720; CHECK:       @ %bb.0: @ %entry1721; CHECK-NEXT:    push {r4, r5, r6, lr}1722; CHECK-NEXT:    cbz r2, .LBB11_31723; CHECK-NEXT:  @ %bb.1: @ %for.body.preheader1724; CHECK-NEXT:    and r12, r2, #31725; CHECK-NEXT:    subs r3, r2, #11726; CHECK-NEXT:    cmp r3, #31727; CHECK-NEXT:    bhs .LBB11_41728; CHECK-NEXT:  @ %bb.2:1729; CHECK-NEXT:    vldr s0, .LCPI11_01730; CHECK-NEXT:    movs r2, #01731; CHECK-NEXT:    b .LBB11_61732; CHECK-NEXT:  .LBB11_3:1733; CHECK-NEXT:    vldr s0, .LCPI11_01734; CHECK-NEXT:    pop {r4, r5, r6, pc}1735; CHECK-NEXT:  .LBB11_4: @ %for.body.preheader.new1736; CHECK-NEXT:    bic r2, r2, #31737; CHECK-NEXT:    movs r3, #11738; CHECK-NEXT:    subs r2, #41739; CHECK-NEXT:    vldr s0, .LCPI11_01740; CHECK-NEXT:    adds r4, r0, #41741; CHECK-NEXT:    add.w lr, r3, r2, lsr #21742; CHECK-NEXT:    adds r3, r1, #41743; CHECK-NEXT:    movs r2, #01744; CHECK-NEXT:  .LBB11_5: @ %for.body1745; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11746; CHECK-NEXT:    ldrsh.w r5, [r3, #2]1747; CHECK-NEXT:    vldr.16 s2, [r4, #2]1748; CHECK-NEXT:    adds r2, #41749; CHECK-NEXT:    vmov s4, r51750; CHECK-NEXT:    ldrsh r5, [r3], #81751; CHECK-NEXT:    vcvt.f16.s32 s4, s41752; CHECK-NEXT:    ldrsh r6, [r3, #-10]1753; CHECK-NEXT:    vmul.f16 s2, s2, s41754; CHECK-NEXT:    vmov s6, r51755; CHECK-NEXT:    vldr.16 s4, [r4]1756; CHECK-NEXT:    vcvt.f16.s32 s6, s61757; CHECK-NEXT:    ldrsh r5, [r3, #-12]1758; CHECK-NEXT:    vmul.f16 s4, s4, s61759; CHECK-NEXT:    vmov s8, r61760; CHECK-NEXT:    vldr.16 s6, [r4, #-2]1761; CHECK-NEXT:    vcvt.f16.s32 s8, s81762; CHECK-NEXT:    vmov s10, r51763; CHECK-NEXT:    vcvtb.f32.f16 s4, s41764; CHECK-NEXT:    vmul.f16 s6, s6, s81765; CHECK-NEXT:    vldr.16 s8, [r4, #-4]1766; CHECK-NEXT:    vcvt.f16.s32 s10, s101767; CHECK-NEXT:    vcvtb.f32.f16 s6, s61768; CHECK-NEXT:    vmul.f16 s8, s8, s101769; CHECK-NEXT:    vcvtb.f32.f16 s2, s21770; CHECK-NEXT:    vcvtb.f32.f16 s8, s81771; CHECK-NEXT:    adds r4, #81772; CHECK-NEXT:    vadd.f32 s0, s0, s81773; CHECK-NEXT:    vadd.f32 s0, s0, s61774; CHECK-NEXT:    vadd.f32 s0, s0, s41775; CHECK-NEXT:    vadd.f32 s0, s0, s21776; CHECK-NEXT:    le lr, .LBB11_51777; CHECK-NEXT:  .LBB11_6: @ %for.cond.cleanup.loopexit.unr-lcssa1778; CHECK-NEXT:    wls lr, r12, .LBB11_91779; CHECK-NEXT:  @ %bb.7: @ %for.body.epil.preheader1780; CHECK-NEXT:    add.w r0, r0, r2, lsl #11781; CHECK-NEXT:    add.w r1, r1, r2, lsl #11782; CHECK-NEXT:  .LBB11_8: @ %for.body.epil1783; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11784; CHECK-NEXT:    ldrsh r2, [r1], #21785; CHECK-NEXT:    vldr.16 s2, [r0]1786; CHECK-NEXT:    adds r0, #21787; CHECK-NEXT:    vmov s4, r21788; CHECK-NEXT:    vcvt.f16.s32 s4, s41789; CHECK-NEXT:    vmul.f16 s2, s2, s41790; CHECK-NEXT:    vcvtb.f32.f16 s2, s21791; CHECK-NEXT:    vadd.f32 s0, s0, s21792; CHECK-NEXT:    le lr, .LBB11_81793; CHECK-NEXT:  .LBB11_9: @ %for.cond.cleanup1794; CHECK-NEXT:    pop {r4, r5, r6, pc}1795; CHECK-NEXT:    .p2align 21796; CHECK-NEXT:  @ %bb.10:1797; CHECK-NEXT:  .LCPI11_0:1798; CHECK-NEXT:    .long 0x00000000 @ float 01799entry:1800  %cmp10 = icmp eq i32 %N, 01801  br i1 %cmp10, label %for.cond.cleanup, label %for.body.preheader1802 1803for.body.preheader:                               ; preds = %entry1804  %0 = add i32 %N, -11805  %xtraiter = and i32 %N, 31806  %1 = icmp ult i32 %0, 31807  br i1 %1, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body.preheader.new1808 1809for.body.preheader.new:                           ; preds = %for.body.preheader1810  %unroll_iter = sub i32 %N, %xtraiter1811  br label %for.body1812 1813for.cond.cleanup.loopexit.unr-lcssa:              ; preds = %for.body, %for.body.preheader1814  %add.lcssa.ph = phi float [ undef, %for.body.preheader ], [ %add.3, %for.body ]1815  %i.012.unr = phi i32 [ 0, %for.body.preheader ], [ %inc.3, %for.body ]1816  %res.011.unr = phi float [ 0.000000e+00, %for.body.preheader ], [ %add.3, %for.body ]1817  %lcmp.mod = icmp eq i32 %xtraiter, 01818  br i1 %lcmp.mod, label %for.cond.cleanup, label %for.body.epil1819 1820for.body.epil:                                    ; preds = %for.cond.cleanup.loopexit.unr-lcssa, %for.body.epil1821  %i.012.epil = phi i32 [ %inc.epil, %for.body.epil ], [ %i.012.unr, %for.cond.cleanup.loopexit.unr-lcssa ]1822  %res.011.epil = phi float [ %add.epil, %for.body.epil ], [ %res.011.unr, %for.cond.cleanup.loopexit.unr-lcssa ]1823  %epil.iter = phi i32 [ %epil.iter.sub, %for.body.epil ], [ %xtraiter, %for.cond.cleanup.loopexit.unr-lcssa ]1824  %arrayidx.epil = getelementptr inbounds half, ptr %a, i32 %i.012.epil1825  %2 = load half, ptr %arrayidx.epil, align 21826  %arrayidx1.epil = getelementptr inbounds i16, ptr %b, i32 %i.012.epil1827  %3 = load i16, ptr %arrayidx1.epil, align 21828  %conv2.epil = sitofp i16 %3 to half1829  %mul.epil = fmul half %2, %conv2.epil1830  %conv3.epil = fpext half %mul.epil to float1831  %add.epil = fadd float %res.011.epil, %conv3.epil1832  %inc.epil = add nuw i32 %i.012.epil, 11833  %epil.iter.sub = add i32 %epil.iter, -11834  %epil.iter.cmp = icmp eq i32 %epil.iter.sub, 01835  br i1 %epil.iter.cmp, label %for.cond.cleanup, label %for.body.epil1836 1837for.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit.unr-lcssa, %for.body.epil, %entry1838  %res.0.lcssa = phi float [ 0.000000e+00, %entry ], [ %add.lcssa.ph, %for.cond.cleanup.loopexit.unr-lcssa ], [ %add.epil, %for.body.epil ]1839  ret float %res.0.lcssa1840 1841for.body:                                         ; preds = %for.body, %for.body.preheader.new1842  %i.012 = phi i32 [ 0, %for.body.preheader.new ], [ %inc.3, %for.body ]1843  %res.011 = phi float [ 0.000000e+00, %for.body.preheader.new ], [ %add.3, %for.body ]1844  %niter = phi i32 [ %unroll_iter, %for.body.preheader.new ], [ %niter.nsub.3, %for.body ]1845  %arrayidx = getelementptr inbounds half, ptr %a, i32 %i.0121846  %4 = load half, ptr %arrayidx, align 21847  %arrayidx1 = getelementptr inbounds i16, ptr %b, i32 %i.0121848  %5 = load i16, ptr %arrayidx1, align 21849  %conv2 = sitofp i16 %5 to half1850  %mul = fmul half %4, %conv21851  %conv3 = fpext half %mul to float1852  %add = fadd float %res.011, %conv31853  %inc = or disjoint i32 %i.012, 11854  %arrayidx.1 = getelementptr inbounds half, ptr %a, i32 %inc1855  %6 = load half, ptr %arrayidx.1, align 21856  %arrayidx1.1 = getelementptr inbounds i16, ptr %b, i32 %inc1857  %7 = load i16, ptr %arrayidx1.1, align 21858  %conv2.1 = sitofp i16 %7 to half1859  %mul.1 = fmul half %6, %conv2.11860  %conv3.1 = fpext half %mul.1 to float1861  %add.1 = fadd float %add, %conv3.11862  %inc.1 = or disjoint i32 %i.012, 21863  %arrayidx.2 = getelementptr inbounds half, ptr %a, i32 %inc.11864  %8 = load half, ptr %arrayidx.2, align 21865  %arrayidx1.2 = getelementptr inbounds i16, ptr %b, i32 %inc.11866  %9 = load i16, ptr %arrayidx1.2, align 21867  %conv2.2 = sitofp i16 %9 to half1868  %mul.2 = fmul half %8, %conv2.21869  %conv3.2 = fpext half %mul.2 to float1870  %add.2 = fadd float %add.1, %conv3.21871  %inc.2 = or disjoint i32 %i.012, 31872  %arrayidx.3 = getelementptr inbounds half, ptr %a, i32 %inc.21873  %10 = load half, ptr %arrayidx.3, align 21874  %arrayidx1.3 = getelementptr inbounds i16, ptr %b, i32 %inc.21875  %11 = load i16, ptr %arrayidx1.3, align 21876  %conv2.3 = sitofp i16 %11 to half1877  %mul.3 = fmul half %10, %conv2.31878  %conv3.3 = fpext half %mul.3 to float1879  %add.3 = fadd float %add.2, %conv3.31880  %inc.3 = add nuw i32 %i.012, 41881  %niter.nsub.3 = add i32 %niter, -41882  %niter.ncmp.3 = icmp eq i32 %niter.nsub.3, 01883  br i1 %niter.ncmp.3, label %for.cond.cleanup.loopexit.unr-lcssa, label %for.body1884}1885 1886