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