1584 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -verify-machineinstrs %s -o - | FileCheck %s3 4define void @vaddq(ptr %x, ptr %y, i32 %n, i32 %z) {5; CHECK-LABEL: vaddq:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: .save {r7, lr}8; CHECK-NEXT: push {r7, lr}9; CHECK-NEXT: cmp r2, #110; CHECK-NEXT: it lt11; CHECK-NEXT: poplt {r7, pc}12; CHECK-NEXT: .LBB0_1: @ %for.body.preheader13; CHECK-NEXT: dlstp.32 lr, r214; CHECK-NEXT: .LBB0_2: @ %for.body15; CHECK-NEXT: @ =>This Inner Loop Header: Depth=116; CHECK-NEXT: vldrw.u32 q0, [r0], #1617; CHECK-NEXT: vadd.i32 q0, q0, r318; CHECK-NEXT: vstrw.32 q0, [r1], #1619; CHECK-NEXT: letp lr, .LBB0_220; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup21; CHECK-NEXT: pop {r7, pc}22entry:23 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 024 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer25 %cmp11 = icmp sgt i32 %n, 026 br i1 %cmp11, label %for.body, label %for.cond.cleanup27 28for.cond.cleanup: ; preds = %for.body, %entry29 ret void30 31for.body: ; preds = %entry, %for.body32 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]33 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]34 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]35 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)36 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)37 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 438 %2 = add <4 x i32> %1, %.splat39 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)40 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 441 %sub = add nsw i32 %i.012, -442 %cmp = icmp sgt i32 %i.012, 443 br i1 %cmp, label %for.body, label %for.cond.cleanup44}45 46define void @vadd(ptr %s1, i32 %c0, i32 %N) {47; CHECK-LABEL: vadd:48; CHECK: @ %bb.0: @ %entry49; CHECK-NEXT: .save {r7, lr}50; CHECK-NEXT: push {r7, lr}51; CHECK-NEXT: cmp r2, #152; CHECK-NEXT: it lt53; CHECK-NEXT: poplt {r7, pc}54; CHECK-NEXT: .LBB1_1: @ %while.body.lr.ph55; CHECK-NEXT: dlstp.32 lr, r256; CHECK-NEXT: .LBB1_2: @ %while.body57; CHECK-NEXT: @ =>This Inner Loop Header: Depth=158; CHECK-NEXT: vldrw.u32 q0, [r0]59; CHECK-NEXT: vadd.i32 q0, q0, r160; CHECK-NEXT: vstrw.32 q0, [r0], #1661; CHECK-NEXT: letp lr, .LBB1_262; CHECK-NEXT: @ %bb.3: @ %while.end63; CHECK-NEXT: pop {r7, pc}64entry:65 %cmp11 = icmp sgt i32 %N, 066 br i1 %cmp11, label %while.body.lr.ph, label %while.end67 68while.body.lr.ph: ; preds = %entry69 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 070 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer71 br label %while.body72 73while.body: ; preds = %while.body.lr.ph, %while.body74 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]75 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]76 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)77 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)78 %2 = tail call <4 x i32> @llvm.arm.mve.add.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, <4 x i1> %0, <4 x i32> %1)79 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)80 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 481 %sub = add nsw i32 %N.addr.012, -482 %cmp = icmp sgt i32 %N.addr.012, 483 br i1 %cmp, label %while.body, label %while.end84 85while.end: ; preds = %while.body, %entry86 ret void87}88 89define void @vsubq(ptr %x, ptr %y, i32 %n, i32 %z) {90; CHECK-LABEL: vsubq:91; CHECK: @ %bb.0: @ %entry92; CHECK-NEXT: .save {r7, lr}93; CHECK-NEXT: push {r7, lr}94; CHECK-NEXT: cmp r2, #195; CHECK-NEXT: it lt96; CHECK-NEXT: poplt {r7, pc}97; CHECK-NEXT: .LBB2_1: @ %for.body.preheader98; CHECK-NEXT: dlstp.32 lr, r299; CHECK-NEXT: .LBB2_2: @ %for.body100; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1101; CHECK-NEXT: vldrw.u32 q0, [r0], #16102; CHECK-NEXT: vsub.i32 q0, q0, r3103; CHECK-NEXT: vstrw.32 q0, [r1], #16104; CHECK-NEXT: letp lr, .LBB2_2105; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup106; CHECK-NEXT: pop {r7, pc}107entry:108 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0109 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer110 %cmp11 = icmp sgt i32 %n, 0111 br i1 %cmp11, label %for.body, label %for.cond.cleanup112 113for.cond.cleanup: ; preds = %for.body, %entry114 ret void115 116for.body: ; preds = %entry, %for.body117 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]118 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]119 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]120 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)121 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)122 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4123 %2 = sub <4 x i32> %1, %.splat124 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)125 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4126 %sub = add nsw i32 %i.012, -4127 %cmp = icmp sgt i32 %i.012, 4128 br i1 %cmp, label %for.body, label %for.cond.cleanup129}130 131define void @vsub(ptr %s1, i32 %c0, i32 %N) {132; CHECK-LABEL: vsub:133; CHECK: @ %bb.0: @ %entry134; CHECK-NEXT: .save {r7, lr}135; CHECK-NEXT: push {r7, lr}136; CHECK-NEXT: cmp r2, #1137; CHECK-NEXT: it lt138; CHECK-NEXT: poplt {r7, pc}139; CHECK-NEXT: .LBB3_1: @ %while.body.lr.ph140; CHECK-NEXT: dlstp.32 lr, r2141; CHECK-NEXT: .LBB3_2: @ %while.body142; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1143; CHECK-NEXT: vldrw.u32 q0, [r0]144; CHECK-NEXT: vsub.i32 q0, q0, r1145; CHECK-NEXT: vstrw.32 q0, [r0], #16146; CHECK-NEXT: letp lr, .LBB3_2147; CHECK-NEXT: @ %bb.3: @ %while.end148; CHECK-NEXT: pop {r7, pc}149entry:150 %cmp11 = icmp sgt i32 %N, 0151 br i1 %cmp11, label %while.body.lr.ph, label %while.end152 153while.body.lr.ph: ; preds = %entry154 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 0155 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer156 br label %while.body157 158while.body: ; preds = %while.body.lr.ph, %while.body159 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]160 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]161 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)162 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)163 %2 = tail call <4 x i32> @llvm.arm.mve.sub.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, <4 x i1> %0, <4 x i32> %1)164 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)165 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4166 %sub = add nsw i32 %N.addr.012, -4167 %cmp = icmp sgt i32 %N.addr.012, 4168 br i1 %cmp, label %while.body, label %while.end169 170while.end: ; preds = %while.body, %entry171 ret void172}173 174define void @vmulq(ptr %x, ptr %y, i32 %n, i32 %z) {175; CHECK-LABEL: vmulq:176; CHECK: @ %bb.0: @ %entry177; CHECK-NEXT: .save {r7, lr}178; CHECK-NEXT: push {r7, lr}179; CHECK-NEXT: cmp r2, #1180; CHECK-NEXT: it lt181; CHECK-NEXT: poplt {r7, pc}182; CHECK-NEXT: .LBB4_1: @ %for.body.preheader183; CHECK-NEXT: dlstp.32 lr, r2184; CHECK-NEXT: .LBB4_2: @ %for.body185; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1186; CHECK-NEXT: vldrw.u32 q0, [r0], #16187; CHECK-NEXT: vmul.i32 q0, q0, r3188; CHECK-NEXT: vstrw.32 q0, [r1], #16189; CHECK-NEXT: letp lr, .LBB4_2190; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup191; CHECK-NEXT: pop {r7, pc}192entry:193 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0194 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer195 %cmp11 = icmp sgt i32 %n, 0196 br i1 %cmp11, label %for.body, label %for.cond.cleanup197 198for.cond.cleanup: ; preds = %for.body, %entry199 ret void200 201for.body: ; preds = %entry, %for.body202 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]203 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]204 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]205 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)206 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)207 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4208 %2 = mul <4 x i32> %1, %.splat209 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)210 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4211 %sub = add nsw i32 %i.012, -4212 %cmp = icmp sgt i32 %i.012, 4213 br i1 %cmp, label %for.body, label %for.cond.cleanup214}215 216define void @vmul(ptr %s1, i32 %c0, i32 %N) {217; CHECK-LABEL: vmul:218; CHECK: @ %bb.0: @ %entry219; CHECK-NEXT: .save {r7, lr}220; CHECK-NEXT: push {r7, lr}221; CHECK-NEXT: cmp r2, #1222; CHECK-NEXT: it lt223; CHECK-NEXT: poplt {r7, pc}224; CHECK-NEXT: .LBB5_1: @ %while.body.lr.ph225; CHECK-NEXT: dlstp.32 lr, r2226; CHECK-NEXT: .LBB5_2: @ %while.body227; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1228; CHECK-NEXT: vldrw.u32 q0, [r0]229; CHECK-NEXT: vmul.i32 q0, q0, r1230; CHECK-NEXT: vstrw.32 q0, [r0], #16231; CHECK-NEXT: letp lr, .LBB5_2232; CHECK-NEXT: @ %bb.3: @ %while.end233; CHECK-NEXT: pop {r7, pc}234entry:235 %cmp11 = icmp sgt i32 %N, 0236 br i1 %cmp11, label %while.body.lr.ph, label %while.end237 238while.body.lr.ph: ; preds = %entry239 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 0240 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer241 br label %while.body242 243while.body: ; preds = %while.body.lr.ph, %while.body244 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]245 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]246 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)247 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)248 %2 = tail call <4 x i32> @llvm.arm.mve.mul.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, <4 x i1> %0, <4 x i32> %1)249 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)250 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4251 %sub = add nsw i32 %N.addr.012, -4252 %cmp = icmp sgt i32 %N.addr.012, 4253 br i1 %cmp, label %while.body, label %while.end254 255while.end: ; preds = %while.body, %entry256 ret void257}258 259define void @vqaddq(ptr %x, ptr %y, i32 %n, i32 %z) {260; CHECK-LABEL: vqaddq:261; CHECK: @ %bb.0: @ %entry262; CHECK-NEXT: .save {r7, lr}263; CHECK-NEXT: push {r7, lr}264; CHECK-NEXT: cmp r2, #1265; CHECK-NEXT: it lt266; CHECK-NEXT: poplt {r7, pc}267; CHECK-NEXT: .LBB6_1: @ %for.body.preheader268; CHECK-NEXT: dlstp.32 lr, r2269; CHECK-NEXT: .LBB6_2: @ %for.body270; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1271; CHECK-NEXT: vldrw.u32 q0, [r0], #16272; CHECK-NEXT: vqadd.s32 q0, q0, r3273; CHECK-NEXT: vstrw.32 q0, [r1], #16274; CHECK-NEXT: letp lr, .LBB6_2275; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup276; CHECK-NEXT: pop {r7, pc}277entry:278 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0279 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer280 %cmp11 = icmp sgt i32 %n, 0281 br i1 %cmp11, label %for.body, label %for.cond.cleanup282 283for.cond.cleanup: ; preds = %for.body, %entry284 ret void285 286for.body: ; preds = %entry, %for.body287 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]288 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]289 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]290 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)291 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)292 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4293 %2 = tail call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %1, <4 x i32> %.splat)294 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)295 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4296 %sub = add nsw i32 %i.012, -4297 %cmp = icmp sgt i32 %i.012, 4298 br i1 %cmp, label %for.body, label %for.cond.cleanup299}300 301define void @vqaddqu(ptr %x, ptr %y, i32 %n, i32 %z) {302; CHECK-LABEL: vqaddqu:303; CHECK: @ %bb.0: @ %entry304; CHECK-NEXT: .save {r7, lr}305; CHECK-NEXT: push {r7, lr}306; CHECK-NEXT: cmp r2, #1307; CHECK-NEXT: it lt308; CHECK-NEXT: poplt {r7, pc}309; CHECK-NEXT: .LBB7_1: @ %for.body.preheader310; CHECK-NEXT: dlstp.32 lr, r2311; CHECK-NEXT: .LBB7_2: @ %for.body312; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1313; CHECK-NEXT: vldrw.u32 q0, [r0], #16314; CHECK-NEXT: vqadd.u32 q0, q0, r3315; CHECK-NEXT: vstrw.32 q0, [r1], #16316; CHECK-NEXT: letp lr, .LBB7_2317; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup318; CHECK-NEXT: pop {r7, pc}319entry:320 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0321 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer322 %cmp11 = icmp sgt i32 %n, 0323 br i1 %cmp11, label %for.body, label %for.cond.cleanup324 325for.cond.cleanup: ; preds = %for.body, %entry326 ret void327 328for.body: ; preds = %entry, %for.body329 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]330 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]331 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]332 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)333 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)334 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4335 %2 = tail call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %1, <4 x i32> %.splat)336 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)337 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4338 %sub = add nsw i32 %i.012, -4339 %cmp = icmp sgt i32 %i.012, 4340 br i1 %cmp, label %for.body, label %for.cond.cleanup341}342 343define void @vqadd(ptr %s1, i32 %c0, i32 %N) {344; CHECK-LABEL: vqadd:345; CHECK: @ %bb.0: @ %entry346; CHECK-NEXT: .save {r7, lr}347; CHECK-NEXT: push {r7, lr}348; CHECK-NEXT: cmp r2, #1349; CHECK-NEXT: it lt350; CHECK-NEXT: poplt {r7, pc}351; CHECK-NEXT: .LBB8_1: @ %while.body.lr.ph352; CHECK-NEXT: dlstp.32 lr, r2353; CHECK-NEXT: .LBB8_2: @ %while.body354; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1355; CHECK-NEXT: vldrw.u32 q0, [r0]356; CHECK-NEXT: vqadd.s32 q0, q0, r1357; CHECK-NEXT: vstrw.32 q0, [r0], #16358; CHECK-NEXT: letp lr, .LBB8_2359; CHECK-NEXT: @ %bb.3: @ %while.end360; CHECK-NEXT: pop {r7, pc}361entry:362 %cmp11 = icmp sgt i32 %N, 0363 br i1 %cmp11, label %while.body.lr.ph, label %while.end364 365while.body.lr.ph: ; preds = %entry366 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 0367 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer368 br label %while.body369 370while.body: ; preds = %while.body.lr.ph, %while.body371 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]372 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]373 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)374 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)375 %2 = tail call <4 x i32> @llvm.arm.mve.qadd.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, i32 0, <4 x i1> %0, <4 x i32> %1)376 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)377 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4378 %sub = add nsw i32 %N.addr.012, -4379 %cmp = icmp sgt i32 %N.addr.012, 4380 br i1 %cmp, label %while.body, label %while.end381 382while.end: ; preds = %while.body, %entry383 ret void384}385 386define void @vqsubq(ptr %x, ptr %y, i32 %n, i32 %z) {387; CHECK-LABEL: vqsubq:388; CHECK: @ %bb.0: @ %entry389; CHECK-NEXT: .save {r7, lr}390; CHECK-NEXT: push {r7, lr}391; CHECK-NEXT: cmp r2, #1392; CHECK-NEXT: it lt393; CHECK-NEXT: poplt {r7, pc}394; CHECK-NEXT: .LBB9_1: @ %for.body.preheader395; CHECK-NEXT: dlstp.32 lr, r2396; CHECK-NEXT: .LBB9_2: @ %for.body397; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1398; CHECK-NEXT: vldrw.u32 q0, [r0], #16399; CHECK-NEXT: vqsub.s32 q0, q0, r3400; CHECK-NEXT: vstrw.32 q0, [r1], #16401; CHECK-NEXT: letp lr, .LBB9_2402; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup403; CHECK-NEXT: pop {r7, pc}404entry:405 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0406 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer407 %cmp11 = icmp sgt i32 %n, 0408 br i1 %cmp11, label %for.body, label %for.cond.cleanup409 410for.cond.cleanup: ; preds = %for.body, %entry411 ret void412 413for.body: ; preds = %entry, %for.body414 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]415 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]416 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]417 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)418 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)419 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4420 %2 = tail call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %1, <4 x i32> %.splat)421 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)422 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4423 %sub = add nsw i32 %i.012, -4424 %cmp = icmp sgt i32 %i.012, 4425 br i1 %cmp, label %for.body, label %for.cond.cleanup426}427 428define void @vqsubqu(ptr %x, ptr %y, i32 %n, i32 %z) {429; CHECK-LABEL: vqsubqu:430; CHECK: @ %bb.0: @ %entry431; CHECK-NEXT: .save {r7, lr}432; CHECK-NEXT: push {r7, lr}433; CHECK-NEXT: cmp r2, #1434; CHECK-NEXT: it lt435; CHECK-NEXT: poplt {r7, pc}436; CHECK-NEXT: .LBB10_1: @ %for.body.preheader437; CHECK-NEXT: dlstp.32 lr, r2438; CHECK-NEXT: .LBB10_2: @ %for.body439; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1440; CHECK-NEXT: vldrw.u32 q0, [r0], #16441; CHECK-NEXT: vqsub.u32 q0, q0, r3442; CHECK-NEXT: vstrw.32 q0, [r1], #16443; CHECK-NEXT: letp lr, .LBB10_2444; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup445; CHECK-NEXT: pop {r7, pc}446entry:447 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0448 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer449 %cmp11 = icmp sgt i32 %n, 0450 br i1 %cmp11, label %for.body, label %for.cond.cleanup451 452for.cond.cleanup: ; preds = %for.body, %entry453 ret void454 455for.body: ; preds = %entry, %for.body456 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]457 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]458 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]459 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)460 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)461 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4462 %2 = tail call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %1, <4 x i32> %.splat)463 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)464 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4465 %sub = add nsw i32 %i.012, -4466 %cmp = icmp sgt i32 %i.012, 4467 br i1 %cmp, label %for.body, label %for.cond.cleanup468}469 470define void @vqsub(ptr %s1, i32 %c0, i32 %N) {471; CHECK-LABEL: vqsub:472; CHECK: @ %bb.0: @ %entry473; CHECK-NEXT: .save {r7, lr}474; CHECK-NEXT: push {r7, lr}475; CHECK-NEXT: cmp r2, #1476; CHECK-NEXT: it lt477; CHECK-NEXT: poplt {r7, pc}478; CHECK-NEXT: .LBB11_1: @ %while.body.lr.ph479; CHECK-NEXT: dlstp.32 lr, r2480; CHECK-NEXT: .LBB11_2: @ %while.body481; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1482; CHECK-NEXT: vldrw.u32 q0, [r0]483; CHECK-NEXT: vqsub.s32 q0, q0, r1484; CHECK-NEXT: vstrw.32 q0, [r0], #16485; CHECK-NEXT: letp lr, .LBB11_2486; CHECK-NEXT: @ %bb.3: @ %while.end487; CHECK-NEXT: pop {r7, pc}488entry:489 %cmp11 = icmp sgt i32 %N, 0490 br i1 %cmp11, label %while.body.lr.ph, label %while.end491 492while.body.lr.ph: ; preds = %entry493 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 0494 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer495 br label %while.body496 497while.body: ; preds = %while.body.lr.ph, %while.body498 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]499 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]500 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)501 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)502 %2 = tail call <4 x i32> @llvm.arm.mve.qsub.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, i32 0, <4 x i1> %0, <4 x i32> %1)503 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)504 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4505 %sub = add nsw i32 %N.addr.012, -4506 %cmp = icmp sgt i32 %N.addr.012, 4507 br i1 %cmp, label %while.body, label %while.end508 509while.end: ; preds = %while.body, %entry510 ret void511}512 513define void @vhaddq(ptr %x, ptr %y, i32 %n, i32 %z) {514; CHECK-LABEL: vhaddq:515; CHECK: @ %bb.0: @ %entry516; CHECK-NEXT: .save {r7, lr}517; CHECK-NEXT: push {r7, lr}518; CHECK-NEXT: cmp r2, #1519; CHECK-NEXT: it lt520; CHECK-NEXT: poplt {r7, pc}521; CHECK-NEXT: .LBB12_1: @ %for.body.preheader522; CHECK-NEXT: dlstp.32 lr, r2523; CHECK-NEXT: .LBB12_2: @ %for.body524; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1525; CHECK-NEXT: vldrw.u32 q0, [r0], #16526; CHECK-NEXT: vhadd.s32 q0, q0, r3527; CHECK-NEXT: vstrw.32 q0, [r1], #16528; CHECK-NEXT: letp lr, .LBB12_2529; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup530; CHECK-NEXT: pop {r7, pc}531entry:532 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0533 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer534 %cmp11 = icmp sgt i32 %n, 0535 br i1 %cmp11, label %for.body, label %for.cond.cleanup536 537for.cond.cleanup: ; preds = %for.body, %entry538 ret void539 540for.body: ; preds = %entry, %for.body541 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]542 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]543 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]544 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)545 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)546 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4547 %2 = tail call <4 x i32> @llvm.arm.mve.vhadd.v4i32(<4 x i32> %1, <4 x i32> %.splat, i32 0)548 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)549 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4550 %sub = add nsw i32 %i.012, -4551 %cmp = icmp sgt i32 %i.012, 4552 br i1 %cmp, label %for.body, label %for.cond.cleanup553}554 555define void @vhadd(ptr %s1, i32 %c0, i32 %N) {556; CHECK-LABEL: vhadd:557; CHECK: @ %bb.0: @ %entry558; CHECK-NEXT: .save {r7, lr}559; CHECK-NEXT: push {r7, lr}560; CHECK-NEXT: cmp r2, #1561; CHECK-NEXT: it lt562; CHECK-NEXT: poplt {r7, pc}563; CHECK-NEXT: .LBB13_1: @ %while.body.lr.ph564; CHECK-NEXT: dlstp.32 lr, r2565; CHECK-NEXT: .LBB13_2: @ %while.body566; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1567; CHECK-NEXT: vldrw.u32 q0, [r0]568; CHECK-NEXT: vhadd.s32 q0, q0, r1569; CHECK-NEXT: vstrw.32 q0, [r0], #16570; CHECK-NEXT: letp lr, .LBB13_2571; CHECK-NEXT: @ %bb.3: @ %while.end572; CHECK-NEXT: pop {r7, pc}573entry:574 %cmp11 = icmp sgt i32 %N, 0575 br i1 %cmp11, label %while.body.lr.ph, label %while.end576 577while.body.lr.ph: ; preds = %entry578 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 0579 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer580 br label %while.body581 582while.body: ; preds = %while.body.lr.ph, %while.body583 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]584 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]585 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)586 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)587 %2 = tail call <4 x i32> @llvm.arm.mve.hadd.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, i32 0, <4 x i1> %0, <4 x i32> %1)588 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)589 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4590 %sub = add nsw i32 %N.addr.012, -4591 %cmp = icmp sgt i32 %N.addr.012, 4592 br i1 %cmp, label %while.body, label %while.end593 594while.end: ; preds = %while.body, %entry595 ret void596}597 598define void @vhsubq(ptr %x, ptr %y, i32 %n, i32 %z) {599; CHECK-LABEL: vhsubq:600; CHECK: @ %bb.0: @ %entry601; CHECK-NEXT: .save {r7, lr}602; CHECK-NEXT: push {r7, lr}603; CHECK-NEXT: cmp r2, #1604; CHECK-NEXT: it lt605; CHECK-NEXT: poplt {r7, pc}606; CHECK-NEXT: .LBB14_1: @ %for.body.preheader607; CHECK-NEXT: dlstp.32 lr, r2608; CHECK-NEXT: .LBB14_2: @ %for.body609; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1610; CHECK-NEXT: vldrw.u32 q0, [r0], #16611; CHECK-NEXT: vhsub.s32 q0, q0, r3612; CHECK-NEXT: vstrw.32 q0, [r1], #16613; CHECK-NEXT: letp lr, .LBB14_2614; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup615; CHECK-NEXT: pop {r7, pc}616entry:617 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0618 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer619 %cmp11 = icmp sgt i32 %n, 0620 br i1 %cmp11, label %for.body, label %for.cond.cleanup621 622for.cond.cleanup: ; preds = %for.body, %entry623 ret void624 625for.body: ; preds = %entry, %for.body626 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]627 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]628 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]629 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)630 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)631 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4632 %2 = tail call <4 x i32> @llvm.arm.mve.vhsub.v4i32(<4 x i32> %1, <4 x i32> %.splat, i32 0)633 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)634 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4635 %sub = add nsw i32 %i.012, -4636 %cmp = icmp sgt i32 %i.012, 4637 br i1 %cmp, label %for.body, label %for.cond.cleanup638}639 640define void @vhsub(ptr %s1, i32 %c0, i32 %N) {641; CHECK-LABEL: vhsub:642; CHECK: @ %bb.0: @ %entry643; CHECK-NEXT: .save {r7, lr}644; CHECK-NEXT: push {r7, lr}645; CHECK-NEXT: cmp r2, #1646; CHECK-NEXT: it lt647; CHECK-NEXT: poplt {r7, pc}648; CHECK-NEXT: .LBB15_1: @ %while.body.lr.ph649; CHECK-NEXT: dlstp.32 lr, r2650; CHECK-NEXT: .LBB15_2: @ %while.body651; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1652; CHECK-NEXT: vldrw.u32 q0, [r0]653; CHECK-NEXT: vhsub.s32 q0, q0, r1654; CHECK-NEXT: vstrw.32 q0, [r0], #16655; CHECK-NEXT: letp lr, .LBB15_2656; CHECK-NEXT: @ %bb.3: @ %while.end657; CHECK-NEXT: pop {r7, pc}658entry:659 %cmp11 = icmp sgt i32 %N, 0660 br i1 %cmp11, label %while.body.lr.ph, label %while.end661 662while.body.lr.ph: ; preds = %entry663 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 0664 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer665 br label %while.body666 667while.body: ; preds = %while.body.lr.ph, %while.body668 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]669 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]670 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)671 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)672 %2 = tail call <4 x i32> @llvm.arm.mve.hsub.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, i32 0, <4 x i1> %0, <4 x i32> %1)673 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)674 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4675 %sub = add nsw i32 %N.addr.012, -4676 %cmp = icmp sgt i32 %N.addr.012, 4677 br i1 %cmp, label %while.body, label %while.end678 679while.end: ; preds = %while.body, %entry680 ret void681}682 683define void @vqdmullbq(ptr %x, ptr %y, i32 %n, i32 %z) {684; CHECK-LABEL: vqdmullbq:685; CHECK: @ %bb.0: @ %entry686; CHECK-NEXT: .save {r7, lr}687; CHECK-NEXT: push {r7, lr}688; CHECK-NEXT: cmp r2, #1689; CHECK-NEXT: it lt690; CHECK-NEXT: poplt {r7, pc}691; CHECK-NEXT: .LBB16_1: @ %for.body.preheader692; CHECK-NEXT: dlstp.32 lr, r2693; CHECK-NEXT: .LBB16_2: @ %for.body694; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1695; CHECK-NEXT: vldrw.u32 q0, [r0], #16696; CHECK-NEXT: vqdmullb.s32 q1, q0, r3697; CHECK-NEXT: vstrw.32 q1, [r1], #16698; CHECK-NEXT: letp lr, .LBB16_2699; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup700; CHECK-NEXT: pop {r7, pc}701entry:702 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0703 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer704 %cmp11 = icmp sgt i32 %n, 0705 br i1 %cmp11, label %for.body, label %for.cond.cleanup706 707for.cond.cleanup: ; preds = %for.body, %entry708 ret void709 710for.body: ; preds = %entry, %for.body711 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]712 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]713 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]714 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)715 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)716 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4717 %2 = tail call <2 x i64> @llvm.arm.mve.vqdmull.v2i64.v4i32(<4 x i32> %1, <4 x i32> %.splat, i32 0)718 %3 = bitcast <2 x i64> %2 to <4 x i32>719 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %y.addr.013, i32 4, <4 x i1> %0)720 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4721 %sub = add nsw i32 %i.012, -4722 %cmp = icmp sgt i32 %i.012, 4723 br i1 %cmp, label %for.body, label %for.cond.cleanup724}725 726 727define void @vqdmull(ptr %s1, i32 %c0, i32 %N) {728; CHECK-LABEL: vqdmull:729; CHECK: @ %bb.0: @ %entry730; CHECK-NEXT: .save {r7, lr}731; CHECK-NEXT: push {r7, lr}732; CHECK-NEXT: cmp r2, #1733; CHECK-NEXT: it lt734; CHECK-NEXT: poplt {r7, pc}735; CHECK-NEXT: .LBB17_1: @ %while.body.lr.ph736; CHECK-NEXT: dlstp.32 lr, r2737; CHECK-NEXT: .LBB17_2: @ %while.body738; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1739; CHECK-NEXT: vldrh.s32 q0, [r0]740; CHECK-NEXT: vqdmullb.s16 q0, q0, r1741; CHECK-NEXT: vstrw.32 q0, [r0], #16742; CHECK-NEXT: letp lr, .LBB17_2743; CHECK-NEXT: @ %bb.3: @ %while.end744; CHECK-NEXT: pop {r7, pc}745entry:746 %cmp11 = icmp sgt i32 %N, 0747 br i1 %cmp11, label %while.body.lr.ph, label %while.end748 749while.body.lr.ph: ; preds = %entry750 %conv = trunc i32 %c0 to i16751 %.splatinsert = insertelement <8 x i16> undef, i16 %conv, i32 0752 %.splat = shufflevector <8 x i16> %.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer753 br label %while.body754 755while.body: ; preds = %while.body.lr.ph, %while.body756 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]757 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]758 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)759 %1 = tail call <4 x i16> @llvm.masked.load.v4i16.p0(ptr %s1.addr.013, i32 2, <4 x i1> %0, <4 x i16> zeroinitializer)760 %2 = sext <4 x i16> %1 to <4 x i32>761 %3 = bitcast <4 x i32> %2 to <8 x i16>762 %4 = tail call <4 x i32> @llvm.arm.mve.vqdmull.predicated.v4i32.v8i16.v4i1(<8 x i16> %3, <8 x i16> %.splat, i32 0, <4 x i1> %0, <4 x i32> %2)763 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %4, ptr %s1.addr.013, i32 4, <4 x i1> %0)764 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4765 %sub = add nsw i32 %N.addr.012, -4766 %cmp = icmp sgt i32 %N.addr.012, 4767 br i1 %cmp, label %while.body, label %while.end768 769while.end: ; preds = %while.body, %entry770 ret void771}772 773define void @vqdmulhq(ptr %x, ptr %y, i32 %n, i32 %z) {774; CHECK-LABEL: vqdmulhq:775; CHECK: @ %bb.0: @ %entry776; CHECK-NEXT: .save {r7, lr}777; CHECK-NEXT: push {r7, lr}778; CHECK-NEXT: cmp r2, #1779; CHECK-NEXT: it lt780; CHECK-NEXT: poplt {r7, pc}781; CHECK-NEXT: .LBB18_1: @ %for.body.preheader782; CHECK-NEXT: dlstp.32 lr, r2783; CHECK-NEXT: .LBB18_2: @ %for.body784; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1785; CHECK-NEXT: vldrw.u32 q0, [r0], #16786; CHECK-NEXT: vqdmulh.s32 q0, q0, r3787; CHECK-NEXT: vstrw.32 q0, [r1], #16788; CHECK-NEXT: letp lr, .LBB18_2789; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup790; CHECK-NEXT: pop {r7, pc}791entry:792 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0793 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer794 %cmp11 = icmp sgt i32 %n, 0795 br i1 %cmp11, label %for.body, label %for.cond.cleanup796 797for.cond.cleanup: ; preds = %for.body, %entry798 ret void799 800for.body: ; preds = %entry, %for.body801 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]802 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]803 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]804 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)805 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)806 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4807 %2 = tail call <4 x i32> @llvm.arm.mve.vqdmulh.v4i32(<4 x i32> %1, <4 x i32> %.splat)808 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)809 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4810 %sub = add nsw i32 %i.012, -4811 %cmp = icmp sgt i32 %i.012, 4812 br i1 %cmp, label %for.body, label %for.cond.cleanup813}814 815define void @vqdmulh(ptr %s1, i32 %c0, i32 %N) {816; CHECK-LABEL: vqdmulh:817; CHECK: @ %bb.0: @ %entry818; CHECK-NEXT: .save {r7, lr}819; CHECK-NEXT: push {r7, lr}820; CHECK-NEXT: cmp r2, #1821; CHECK-NEXT: it lt822; CHECK-NEXT: poplt {r7, pc}823; CHECK-NEXT: .LBB19_1: @ %while.body.lr.ph824; CHECK-NEXT: dlstp.32 lr, r2825; CHECK-NEXT: .LBB19_2: @ %while.body826; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1827; CHECK-NEXT: vldrw.u32 q0, [r0]828; CHECK-NEXT: vqdmulh.s32 q0, q0, r1829; CHECK-NEXT: vstrw.32 q0, [r0], #16830; CHECK-NEXT: letp lr, .LBB19_2831; CHECK-NEXT: @ %bb.3: @ %while.end832; CHECK-NEXT: pop {r7, pc}833entry:834 %cmp11 = icmp sgt i32 %N, 0835 br i1 %cmp11, label %while.body.lr.ph, label %while.end836 837while.body.lr.ph: ; preds = %entry838 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 0839 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer840 br label %while.body841 842while.body: ; preds = %while.body.lr.ph, %while.body843 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]844 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]845 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)846 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)847 %2 = tail call <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, <4 x i1> %0, <4 x i32> %1)848 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)849 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4850 %sub = add nsw i32 %N.addr.012, -4851 %cmp = icmp sgt i32 %N.addr.012, 4852 br i1 %cmp, label %while.body, label %while.end853 854while.end: ; preds = %while.body, %entry855 ret void856}857 858define void @vqrdmulhq(ptr %x, ptr %y, i32 %n, i32 %z) {859; CHECK-LABEL: vqrdmulhq:860; CHECK: @ %bb.0: @ %entry861; CHECK-NEXT: .save {r7, lr}862; CHECK-NEXT: push {r7, lr}863; CHECK-NEXT: cmp r2, #1864; CHECK-NEXT: it lt865; CHECK-NEXT: poplt {r7, pc}866; CHECK-NEXT: .LBB20_1: @ %for.body.preheader867; CHECK-NEXT: dlstp.32 lr, r2868; CHECK-NEXT: .LBB20_2: @ %for.body869; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1870; CHECK-NEXT: vldrw.u32 q0, [r0], #16871; CHECK-NEXT: vqrdmulh.s32 q0, q0, r3872; CHECK-NEXT: vstrw.32 q0, [r1], #16873; CHECK-NEXT: letp lr, .LBB20_2874; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup875; CHECK-NEXT: pop {r7, pc}876entry:877 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0878 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer879 %cmp11 = icmp sgt i32 %n, 0880 br i1 %cmp11, label %for.body, label %for.cond.cleanup881 882for.cond.cleanup: ; preds = %for.body, %entry883 ret void884 885for.body: ; preds = %entry, %for.body886 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]887 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]888 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]889 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)890 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)891 %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4892 %2 = tail call <4 x i32> @llvm.arm.mve.vqrdmulh.v4i32(<4 x i32> %1, <4 x i32> %.splat)893 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)894 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4895 %sub = add nsw i32 %i.012, -4896 %cmp = icmp sgt i32 %i.012, 4897 br i1 %cmp, label %for.body, label %for.cond.cleanup898}899 900define void @vqrdmulh(ptr %s1, i32 %c0, i32 %N) {901; CHECK-LABEL: vqrdmulh:902; CHECK: @ %bb.0: @ %entry903; CHECK-NEXT: .save {r7, lr}904; CHECK-NEXT: push {r7, lr}905; CHECK-NEXT: cmp r2, #1906; CHECK-NEXT: it lt907; CHECK-NEXT: poplt {r7, pc}908; CHECK-NEXT: .LBB21_1: @ %while.body.lr.ph909; CHECK-NEXT: dlstp.32 lr, r2910; CHECK-NEXT: .LBB21_2: @ %while.body911; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1912; CHECK-NEXT: vldrw.u32 q0, [r0]913; CHECK-NEXT: vqrdmulh.s32 q0, q0, r1914; CHECK-NEXT: vstrw.32 q0, [r0], #16915; CHECK-NEXT: letp lr, .LBB21_2916; CHECK-NEXT: @ %bb.3: @ %while.end917; CHECK-NEXT: pop {r7, pc}918entry:919 %cmp11 = icmp sgt i32 %N, 0920 br i1 %cmp11, label %while.body.lr.ph, label %while.end921 922while.body.lr.ph: ; preds = %entry923 %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 0924 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer925 br label %while.body926 927while.body: ; preds = %while.body.lr.ph, %while.body928 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]929 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]930 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)931 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)932 %2 = tail call <4 x i32> @llvm.arm.mve.qrdmulh.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %.splat, <4 x i1> %0, <4 x i32> %1)933 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)934 %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4935 %sub = add nsw i32 %N.addr.012, -4936 %cmp = icmp sgt i32 %N.addr.012, 4937 br i1 %cmp, label %while.body, label %while.end938 939while.end: ; preds = %while.body, %entry940 ret void941}942 943define void @vmlaq(ptr %x, ptr %y, i32 %n, i32 %z) {944; CHECK-LABEL: vmlaq:945; CHECK: @ %bb.0: @ %entry946; CHECK-NEXT: .save {r7, lr}947; CHECK-NEXT: push {r7, lr}948; CHECK-NEXT: cmp r2, #1949; CHECK-NEXT: it lt950; CHECK-NEXT: poplt {r7, pc}951; CHECK-NEXT: .LBB22_1: @ %for.body.preheader952; CHECK-NEXT: dlstp.32 lr, r2953; CHECK-NEXT: .LBB22_2: @ %for.body954; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1955; CHECK-NEXT: vldrw.u32 q0, [r1]956; CHECK-NEXT: vldrw.u32 q1, [r0], #16957; CHECK-NEXT: vmla.i32 q1, q0, r3958; CHECK-NEXT: vstrw.32 q1, [r1], #16959; CHECK-NEXT: letp lr, .LBB22_2960; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup961; CHECK-NEXT: pop {r7, pc}962entry:963 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 0964 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer965 %cmp14 = icmp sgt i32 %n, 0966 br i1 %cmp14, label %for.body, label %for.cond.cleanup967 968for.cond.cleanup: ; preds = %for.body, %entry969 ret void970 971for.body: ; preds = %entry, %for.body972 %x.addr.017 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]973 %y.addr.016 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]974 %i.015 = phi i32 [ %sub, %for.body ], [ %n, %entry ]975 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.015)976 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.017, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)977 %add.ptr = getelementptr inbounds i32, ptr %x.addr.017, i32 4978 %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %y.addr.016, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)979 %3 = mul <4 x i32> %2, %.splat980 %4 = add <4 x i32> %3, %1981 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %4, ptr %y.addr.016, i32 4, <4 x i1> %0)982 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.016, i32 4983 %sub = add nsw i32 %i.015, -4984 %cmp = icmp sgt i32 %i.015, 4985 br i1 %cmp, label %for.body, label %for.cond.cleanup986}987 988define void @vmlaqp(ptr %x, ptr %y, i32 %n, i32 %z) {989; CHECK-LABEL: vmlaqp:990; CHECK: @ %bb.0: @ %entry991; CHECK-NEXT: .save {r7, lr}992; CHECK-NEXT: push {r7, lr}993; CHECK-NEXT: cmp r2, #1994; CHECK-NEXT: it lt995; CHECK-NEXT: poplt {r7, pc}996; CHECK-NEXT: .LBB23_1: @ %for.body.preheader997; CHECK-NEXT: dlstp.32 lr, r2998; CHECK-NEXT: .LBB23_2: @ %for.body999; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11000; CHECK-NEXT: vldrw.u32 q0, [r1]1001; CHECK-NEXT: vldrw.u32 q1, [r0], #161002; CHECK-NEXT: vmla.i32 q1, q0, r31003; CHECK-NEXT: vstrw.32 q1, [r1], #161004; CHECK-NEXT: letp lr, .LBB23_21005; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1006; CHECK-NEXT: pop {r7, pc}1007entry:1008 %cmp15 = icmp sgt i32 %n, 01009 br i1 %cmp15, label %for.body, label %for.cond.cleanup1010 1011for.cond.cleanup: ; preds = %for.body, %entry1012 ret void1013 1014for.body: ; preds = %entry, %for.body1015 %x.addr.018 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1016 %y.addr.017 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1017 %i.016 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1018 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.016)1019 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.018, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1020 %add.ptr = getelementptr inbounds i32, ptr %x.addr.018, i32 41021 %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %y.addr.017, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1022 %3 = tail call <4 x i32> @llvm.arm.mve.vmla.n.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %2, i32 %z, <4 x i1> %0)1023 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %y.addr.017, i32 4, <4 x i1> %0)1024 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.017, i32 41025 %sub = add nsw i32 %i.016, -41026 %cmp = icmp sgt i32 %i.016, 41027 br i1 %cmp, label %for.body, label %for.cond.cleanup1028}1029 1030define void @vmlasq(ptr %x, ptr %y, i32 %n, i32 %z) {1031; CHECK-LABEL: vmlasq:1032; CHECK: @ %bb.0: @ %entry1033; CHECK-NEXT: .save {r7, lr}1034; CHECK-NEXT: push {r7, lr}1035; CHECK-NEXT: cmp r2, #11036; CHECK-NEXT: it lt1037; CHECK-NEXT: poplt {r7, pc}1038; CHECK-NEXT: .LBB24_1: @ %for.body.preheader1039; CHECK-NEXT: dlstp.32 lr, r21040; CHECK-NEXT: .LBB24_2: @ %for.body1041; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11042; CHECK-NEXT: vldrw.u32 q0, [r0], #161043; CHECK-NEXT: vldrw.u32 q1, [r1]1044; CHECK-NEXT: vmlas.i32 q1, q0, r31045; CHECK-NEXT: vstrw.32 q1, [r1], #161046; CHECK-NEXT: letp lr, .LBB24_21047; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1048; CHECK-NEXT: pop {r7, pc}1049entry:1050 %.splatinsert = insertelement <4 x i32> poison, i32 %z, i32 01051 %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer1052 %cmp14 = icmp sgt i32 %n, 01053 br i1 %cmp14, label %for.body, label %for.cond.cleanup1054 1055for.cond.cleanup: ; preds = %for.body, %entry1056 ret void1057 1058for.body: ; preds = %entry, %for.body1059 %x.addr.017 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1060 %y.addr.016 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1061 %i.015 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1062 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.015)1063 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.017, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1064 %add.ptr = getelementptr inbounds i32, ptr %x.addr.017, i32 41065 %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %y.addr.016, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1066 %3 = mul <4 x i32> %2, %11067 %4 = add <4 x i32> %3, %.splat1068 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %4, ptr %y.addr.016, i32 4, <4 x i1> %0)1069 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.016, i32 41070 %sub = add nsw i32 %i.015, -41071 %cmp = icmp sgt i32 %i.015, 41072 br i1 %cmp, label %for.body, label %for.cond.cleanup1073}1074 1075define void @vmlasqp(ptr %x, ptr %y, i32 %n, i32 %z) {1076; CHECK-LABEL: vmlasqp:1077; CHECK: @ %bb.0: @ %entry1078; CHECK-NEXT: .save {r7, lr}1079; CHECK-NEXT: push {r7, lr}1080; CHECK-NEXT: cmp r2, #11081; CHECK-NEXT: it lt1082; CHECK-NEXT: poplt {r7, pc}1083; CHECK-NEXT: .LBB25_1: @ %for.body.preheader1084; CHECK-NEXT: dlstp.32 lr, r21085; CHECK-NEXT: .LBB25_2: @ %for.body1086; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11087; CHECK-NEXT: vldrw.u32 q0, [r1]1088; CHECK-NEXT: vldrw.u32 q1, [r0], #161089; CHECK-NEXT: vmlas.i32 q1, q0, r31090; CHECK-NEXT: vstrw.32 q1, [r1], #161091; CHECK-NEXT: letp lr, .LBB25_21092; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1093; CHECK-NEXT: pop {r7, pc}1094entry:1095 %cmp15 = icmp sgt i32 %n, 01096 br i1 %cmp15, label %for.body, label %for.cond.cleanup1097 1098for.cond.cleanup: ; preds = %for.body, %entry1099 ret void1100 1101for.body: ; preds = %entry, %for.body1102 %x.addr.018 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1103 %y.addr.017 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1104 %i.016 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1105 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.016)1106 %1 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %x.addr.018, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1107 %add.ptr = getelementptr inbounds i32, ptr %x.addr.018, i32 41108 %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %y.addr.017, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1109 %3 = tail call <4 x i32> @llvm.arm.mve.vmlas.n.predicated.v4i32.v4i1(<4 x i32> %1, <4 x i32> %2, i32 %z, <4 x i1> %0)1110 tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %y.addr.017, i32 4, <4 x i1> %0)1111 %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.017, i32 41112 %sub = add nsw i32 %i.016, -41113 %cmp = icmp sgt i32 %i.016, 41114 br i1 %cmp, label %for.body, label %for.cond.cleanup1115}1116 1117define void @vaddqf(ptr %x, ptr %y, i32 %n, float %z) {1118; CHECK-LABEL: vaddqf:1119; CHECK: @ %bb.0: @ %entry1120; CHECK-NEXT: .save {r7, lr}1121; CHECK-NEXT: push {r7, lr}1122; CHECK-NEXT: cmp r2, #11123; CHECK-NEXT: it lt1124; CHECK-NEXT: poplt {r7, pc}1125; CHECK-NEXT: .LBB26_1: @ %for.body.preheader1126; CHECK-NEXT: dlstp.32 lr, r21127; CHECK-NEXT: .LBB26_2: @ %for.body1128; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11129; CHECK-NEXT: vldrw.u32 q0, [r0], #161130; CHECK-NEXT: vadd.f32 q0, q0, r31131; CHECK-NEXT: vstrw.32 q0, [r1], #161132; CHECK-NEXT: letp lr, .LBB26_21133; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1134; CHECK-NEXT: pop {r7, pc}1135entry:1136 %.splatinsert = insertelement <4 x float> poison, float %z, i32 01137 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1138 %cmp11 = icmp sgt i32 %n, 01139 br i1 %cmp11, label %for.body, label %for.cond.cleanup1140 1141for.cond.cleanup: ; preds = %for.body, %entry1142 ret void1143 1144for.body: ; preds = %entry, %for.body1145 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1146 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1147 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1148 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)1149 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1150 %add.ptr = getelementptr inbounds float, ptr %x.addr.014, i32 41151 %2 = fadd fast <4 x float> %1, %.splat1152 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)1153 %add.ptr1 = getelementptr inbounds float, ptr %y.addr.013, i32 41154 %sub = add nsw i32 %i.012, -41155 %cmp = icmp sgt i32 %i.012, 41156 br i1 %cmp, label %for.body, label %for.cond.cleanup1157}1158 1159define void @vaddf(ptr %s1, float %c0, i32 %N) {1160; CHECK-LABEL: vaddf:1161; CHECK: @ %bb.0: @ %entry1162; CHECK-NEXT: .save {r7, lr}1163; CHECK-NEXT: push {r7, lr}1164; CHECK-NEXT: cmp r2, #11165; CHECK-NEXT: it lt1166; CHECK-NEXT: poplt {r7, pc}1167; CHECK-NEXT: .LBB27_1: @ %while.body.lr.ph1168; CHECK-NEXT: dlstp.32 lr, r21169; CHECK-NEXT: .LBB27_2: @ %while.body1170; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11171; CHECK-NEXT: vldrw.u32 q0, [r0]1172; CHECK-NEXT: vadd.f32 q0, q0, r11173; CHECK-NEXT: vstrw.32 q0, [r0], #161174; CHECK-NEXT: letp lr, .LBB27_21175; CHECK-NEXT: @ %bb.3: @ %while.end1176; CHECK-NEXT: pop {r7, pc}1177entry:1178 %cmp11 = icmp sgt i32 %N, 01179 br i1 %cmp11, label %while.body.lr.ph, label %while.end1180 1181while.body.lr.ph: ; preds = %entry1182 %.splatinsert = insertelement <4 x float> undef, float %c0, i32 01183 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer1184 br label %while.body1185 1186while.body: ; preds = %while.body.lr.ph, %while.body1187 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1188 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1189 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)1190 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1191 %2 = tail call fast <4 x float> @llvm.arm.mve.add.predicated.v4f32.v4i1(<4 x float> %1, <4 x float> %.splat, <4 x i1> %0, <4 x float> %1)1192 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)1193 %add.ptr = getelementptr inbounds float, ptr %s1.addr.013, i32 41194 %sub = add nsw i32 %N.addr.012, -41195 %cmp = icmp sgt i32 %N.addr.012, 41196 br i1 %cmp, label %while.body, label %while.end1197 1198while.end: ; preds = %while.body, %entry1199 ret void1200}1201 1202define void @vsubqf(ptr %x, ptr %y, i32 %n, float %z) {1203; CHECK-LABEL: vsubqf:1204; CHECK: @ %bb.0: @ %entry1205; CHECK-NEXT: .save {r7, lr}1206; CHECK-NEXT: push {r7, lr}1207; CHECK-NEXT: cmp r2, #11208; CHECK-NEXT: it lt1209; CHECK-NEXT: poplt {r7, pc}1210; CHECK-NEXT: .LBB28_1: @ %for.body.preheader1211; CHECK-NEXT: dlstp.32 lr, r21212; CHECK-NEXT: .LBB28_2: @ %for.body1213; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11214; CHECK-NEXT: vldrw.u32 q0, [r0], #161215; CHECK-NEXT: vsub.f32 q0, q0, r31216; CHECK-NEXT: vstrw.32 q0, [r1], #161217; CHECK-NEXT: letp lr, .LBB28_21218; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1219; CHECK-NEXT: pop {r7, pc}1220entry:1221 %.splatinsert = insertelement <4 x float> poison, float %z, i32 01222 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1223 %cmp11 = icmp sgt i32 %n, 01224 br i1 %cmp11, label %for.body, label %for.cond.cleanup1225 1226for.cond.cleanup: ; preds = %for.body, %entry1227 ret void1228 1229for.body: ; preds = %entry, %for.body1230 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1231 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1232 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1233 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)1234 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1235 %add.ptr = getelementptr inbounds float, ptr %x.addr.014, i32 41236 %2 = fsub fast <4 x float> %1, %.splat1237 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)1238 %add.ptr1 = getelementptr inbounds float, ptr %y.addr.013, i32 41239 %sub = add nsw i32 %i.012, -41240 %cmp = icmp sgt i32 %i.012, 41241 br i1 %cmp, label %for.body, label %for.cond.cleanup1242}1243 1244define void @vsubf(ptr %s1, float %c0, i32 %N) {1245; CHECK-LABEL: vsubf:1246; CHECK: @ %bb.0: @ %entry1247; CHECK-NEXT: .save {r7, lr}1248; CHECK-NEXT: push {r7, lr}1249; CHECK-NEXT: cmp r2, #11250; CHECK-NEXT: it lt1251; CHECK-NEXT: poplt {r7, pc}1252; CHECK-NEXT: .LBB29_1: @ %while.body.lr.ph1253; CHECK-NEXT: dlstp.32 lr, r21254; CHECK-NEXT: .LBB29_2: @ %while.body1255; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11256; CHECK-NEXT: vldrw.u32 q0, [r0]1257; CHECK-NEXT: vsub.f32 q0, q0, r11258; CHECK-NEXT: vstrw.32 q0, [r0], #161259; CHECK-NEXT: letp lr, .LBB29_21260; CHECK-NEXT: @ %bb.3: @ %while.end1261; CHECK-NEXT: pop {r7, pc}1262entry:1263 %cmp11 = icmp sgt i32 %N, 01264 br i1 %cmp11, label %while.body.lr.ph, label %while.end1265 1266while.body.lr.ph: ; preds = %entry1267 %.splatinsert = insertelement <4 x float> undef, float %c0, i32 01268 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer1269 br label %while.body1270 1271while.body: ; preds = %while.body.lr.ph, %while.body1272 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1273 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1274 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)1275 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1276 %2 = tail call fast <4 x float> @llvm.arm.mve.sub.predicated.v4f32.v4i1(<4 x float> %1, <4 x float> %.splat, <4 x i1> %0, <4 x float> %1)1277 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)1278 %add.ptr = getelementptr inbounds float, ptr %s1.addr.013, i32 41279 %sub = add nsw i32 %N.addr.012, -41280 %cmp = icmp sgt i32 %N.addr.012, 41281 br i1 %cmp, label %while.body, label %while.end1282 1283while.end: ; preds = %while.body, %entry1284 ret void1285}1286 1287define void @vmulqf(ptr %x, ptr %y, i32 %n, float %z) {1288; CHECK-LABEL: vmulqf:1289; CHECK: @ %bb.0: @ %entry1290; CHECK-NEXT: .save {r7, lr}1291; CHECK-NEXT: push {r7, lr}1292; CHECK-NEXT: cmp r2, #11293; CHECK-NEXT: it lt1294; CHECK-NEXT: poplt {r7, pc}1295; CHECK-NEXT: .LBB30_1: @ %for.body.preheader1296; CHECK-NEXT: dlstp.32 lr, r21297; CHECK-NEXT: .LBB30_2: @ %for.body1298; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11299; CHECK-NEXT: vldrw.u32 q0, [r0], #161300; CHECK-NEXT: vmul.f32 q0, q0, r31301; CHECK-NEXT: vstrw.32 q0, [r1], #161302; CHECK-NEXT: letp lr, .LBB30_21303; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1304; CHECK-NEXT: pop {r7, pc}1305entry:1306 %.splatinsert = insertelement <4 x float> poison, float %z, i32 01307 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1308 %cmp11 = icmp sgt i32 %n, 01309 br i1 %cmp11, label %for.body, label %for.cond.cleanup1310 1311for.cond.cleanup: ; preds = %for.body, %entry1312 ret void1313 1314for.body: ; preds = %entry, %for.body1315 %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1316 %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1317 %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1318 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)1319 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %x.addr.014, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1320 %add.ptr = getelementptr inbounds float, ptr %x.addr.014, i32 41321 %2 = fmul fast <4 x float> %1, %.splat1322 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %2, ptr %y.addr.013, i32 4, <4 x i1> %0)1323 %add.ptr1 = getelementptr inbounds float, ptr %y.addr.013, i32 41324 %sub = add nsw i32 %i.012, -41325 %cmp = icmp sgt i32 %i.012, 41326 br i1 %cmp, label %for.body, label %for.cond.cleanup1327}1328 1329define void @vmulf(ptr %s1, float %c0, i32 %N) {1330; CHECK-LABEL: vmulf:1331; CHECK: @ %bb.0: @ %entry1332; CHECK-NEXT: .save {r7, lr}1333; CHECK-NEXT: push {r7, lr}1334; CHECK-NEXT: cmp r2, #11335; CHECK-NEXT: it lt1336; CHECK-NEXT: poplt {r7, pc}1337; CHECK-NEXT: .LBB31_1: @ %while.body.lr.ph1338; CHECK-NEXT: dlstp.32 lr, r21339; CHECK-NEXT: .LBB31_2: @ %while.body1340; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11341; CHECK-NEXT: vldrw.u32 q0, [r0]1342; CHECK-NEXT: vmul.f32 q0, q0, r11343; CHECK-NEXT: vstrw.32 q0, [r0], #161344; CHECK-NEXT: letp lr, .LBB31_21345; CHECK-NEXT: @ %bb.3: @ %while.end1346; CHECK-NEXT: pop {r7, pc}1347entry:1348 %cmp11 = icmp sgt i32 %N, 01349 br i1 %cmp11, label %while.body.lr.ph, label %while.end1350 1351while.body.lr.ph: ; preds = %entry1352 %.splatinsert = insertelement <4 x float> undef, float %c0, i32 01353 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer1354 br label %while.body1355 1356while.body: ; preds = %while.body.lr.ph, %while.body1357 %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1358 %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1359 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)1360 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %s1.addr.013, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1361 %2 = tail call fast <4 x float> @llvm.arm.mve.mul.predicated.v4f32.v4i1(<4 x float> %1, <4 x float> %.splat, <4 x i1> %0, <4 x float> %1)1362 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %2, ptr %s1.addr.013, i32 4, <4 x i1> %0)1363 %add.ptr = getelementptr inbounds float, ptr %s1.addr.013, i32 41364 %sub = add nsw i32 %N.addr.012, -41365 %cmp = icmp sgt i32 %N.addr.012, 41366 br i1 %cmp, label %while.body, label %while.end1367 1368while.end: ; preds = %while.body, %entry1369 ret void1370}1371 1372define void @vfmaq(ptr %x, ptr %y, i32 %n, float %z) {1373; CHECK-LABEL: vfmaq:1374; CHECK: @ %bb.0: @ %entry1375; CHECK-NEXT: .save {r7, lr}1376; CHECK-NEXT: push {r7, lr}1377; CHECK-NEXT: cmp r2, #11378; CHECK-NEXT: it lt1379; CHECK-NEXT: poplt {r7, pc}1380; CHECK-NEXT: .LBB32_1: @ %for.body.preheader1381; CHECK-NEXT: dlstp.32 lr, r21382; CHECK-NEXT: .LBB32_2: @ %for.body1383; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11384; CHECK-NEXT: vldrw.u32 q0, [r1]1385; CHECK-NEXT: vldrw.u32 q1, [r0], #161386; CHECK-NEXT: vfma.f32 q1, q0, r31387; CHECK-NEXT: vstrw.32 q1, [r1], #161388; CHECK-NEXT: letp lr, .LBB32_21389; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1390; CHECK-NEXT: pop {r7, pc}1391entry:1392 %.splatinsert = insertelement <4 x float> poison, float %z, i32 01393 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1394 %cmp14 = icmp sgt i32 %n, 01395 br i1 %cmp14, label %for.body, label %for.cond.cleanup1396 1397for.cond.cleanup: ; preds = %for.body, %entry1398 ret void1399 1400for.body: ; preds = %entry, %for.body1401 %x.addr.017 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1402 %y.addr.016 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1403 %i.015 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1404 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.015)1405 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %x.addr.017, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1406 %add.ptr = getelementptr inbounds float, ptr %x.addr.017, i32 41407 %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %y.addr.016, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1408 %3 = tail call fast <4 x float> @llvm.fma.v4f32(<4 x float> %2, <4 x float> %.splat, <4 x float> %1)1409 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %y.addr.016, i32 4, <4 x i1> %0)1410 %add.ptr1 = getelementptr inbounds float, ptr %y.addr.016, i32 41411 %sub = add nsw i32 %i.015, -41412 %cmp = icmp sgt i32 %i.015, 41413 br i1 %cmp, label %for.body, label %for.cond.cleanup1414}1415 1416define void @vfma(ptr %s1, ptr %s2, float %c0, i32 %N) {1417; CHECK-LABEL: vfma:1418; CHECK: @ %bb.0: @ %entry1419; CHECK-NEXT: .save {r7, lr}1420; CHECK-NEXT: push {r7, lr}1421; CHECK-NEXT: cmp r3, #11422; CHECK-NEXT: it lt1423; CHECK-NEXT: poplt {r7, pc}1424; CHECK-NEXT: .LBB33_1: @ %while.body.lr.ph1425; CHECK-NEXT: dlstp.32 lr, r31426; CHECK-NEXT: .LBB33_2: @ %while.body1427; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11428; CHECK-NEXT: vldrw.u32 q0, [r1]1429; CHECK-NEXT: vldrw.u32 q1, [r0]1430; CHECK-NEXT: vfma.f32 q1, q0, r21431; CHECK-NEXT: vstrw.32 q1, [r0], #161432; CHECK-NEXT: letp lr, .LBB33_21433; CHECK-NEXT: @ %bb.3: @ %while.end1434; CHECK-NEXT: pop {r7, pc}1435entry:1436 %cmp12 = icmp sgt i32 %N, 01437 br i1 %cmp12, label %while.body.lr.ph, label %while.end1438 1439while.body.lr.ph: ; preds = %entry1440 %.splatinsert = insertelement <4 x float> undef, float %c0, i32 01441 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer1442 br label %while.body1443 1444while.body: ; preds = %while.body.lr.ph, %while.body1445 %s1.addr.014 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1446 %N.addr.013 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1447 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.013)1448 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %s1.addr.014, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1449 %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %s2, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1450 %3 = tail call fast <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> %2, <4 x float> %.splat, <4 x float> %1, <4 x i1> %0)1451 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %s1.addr.014, i32 4, <4 x i1> %0)1452 %add.ptr = getelementptr inbounds float, ptr %s1.addr.014, i32 41453 %sub = add nsw i32 %N.addr.013, -41454 %cmp = icmp sgt i32 %N.addr.013, 41455 br i1 %cmp, label %while.body, label %while.end1456 1457while.end: ; preds = %while.body, %entry1458 ret void1459}1460 1461define void @vfmasq(ptr %x, ptr %y, i32 %n, float %z) {1462; CHECK-LABEL: vfmasq:1463; CHECK: @ %bb.0: @ %entry1464; CHECK-NEXT: .save {r7, lr}1465; CHECK-NEXT: push {r7, lr}1466; CHECK-NEXT: cmp r2, #11467; CHECK-NEXT: it lt1468; CHECK-NEXT: poplt {r7, pc}1469; CHECK-NEXT: .LBB34_1: @ %for.body.preheader1470; CHECK-NEXT: dlstp.32 lr, r21471; CHECK-NEXT: .LBB34_2: @ %for.body1472; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11473; CHECK-NEXT: vldrw.u32 q0, [r1]1474; CHECK-NEXT: vldrw.u32 q1, [r0], #161475; CHECK-NEXT: vfmas.f32 q1, q0, r31476; CHECK-NEXT: vstrw.32 q1, [r1], #161477; CHECK-NEXT: letp lr, .LBB34_21478; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1479; CHECK-NEXT: pop {r7, pc}1480entry:1481 %.splatinsert = insertelement <4 x float> poison, float %z, i32 01482 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1483 %cmp14 = icmp sgt i32 %n, 01484 br i1 %cmp14, label %for.body, label %for.cond.cleanup1485 1486for.cond.cleanup: ; preds = %for.body, %entry1487 ret void1488 1489for.body: ; preds = %entry, %for.body1490 %x.addr.017 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1491 %y.addr.016 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1492 %i.015 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1493 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.015)1494 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %x.addr.017, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1495 %add.ptr = getelementptr inbounds float, ptr %x.addr.017, i32 41496 %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %y.addr.016, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1497 %3 = tail call fast <4 x float> @llvm.fma.v4f32(<4 x float> %1, <4 x float> %2, <4 x float> %.splat)1498 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %y.addr.016, i32 4, <4 x i1> %0)1499 %add.ptr1 = getelementptr inbounds float, ptr %y.addr.016, i32 41500 %sub = add nsw i32 %i.015, -41501 %cmp = icmp sgt i32 %i.015, 41502 br i1 %cmp, label %for.body, label %for.cond.cleanup1503}1504 1505define void @vfmas(ptr %s1, ptr %s2, float %c0, i32 %N) {1506; CHECK-LABEL: vfmas:1507; CHECK: @ %bb.0: @ %entry1508; CHECK-NEXT: .save {r7, lr}1509; CHECK-NEXT: push {r7, lr}1510; CHECK-NEXT: cmp r3, #11511; CHECK-NEXT: it lt1512; CHECK-NEXT: poplt {r7, pc}1513; CHECK-NEXT: .LBB35_1: @ %while.body.lr.ph1514; CHECK-NEXT: dlstp.32 lr, r31515; CHECK-NEXT: .LBB35_2: @ %while.body1516; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11517; CHECK-NEXT: vldrw.u32 q0, [r1]1518; CHECK-NEXT: vldrw.u32 q1, [r0]1519; CHECK-NEXT: vfmas.f32 q1, q0, r21520; CHECK-NEXT: vstrw.32 q1, [r0], #161521; CHECK-NEXT: letp lr, .LBB35_21522; CHECK-NEXT: @ %bb.3: @ %while.end1523; CHECK-NEXT: pop {r7, pc}1524entry:1525 %cmp12 = icmp sgt i32 %N, 01526 br i1 %cmp12, label %while.body.lr.ph, label %while.end1527 1528while.body.lr.ph: ; preds = %entry1529 %.splatinsert = insertelement <4 x float> undef, float %c0, i32 01530 %.splat = shufflevector <4 x float> %.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer1531 br label %while.body1532 1533while.body: ; preds = %while.body.lr.ph, %while.body1534 %s1.addr.014 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1535 %N.addr.013 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1536 %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.013)1537 %1 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %s1.addr.014, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1538 %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %s2, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1539 %3 = tail call fast <4 x float> @llvm.fma.v4f32(<4 x float> %1, <4 x float> %2, <4 x float> %.splat)1540 %4 = select <4 x i1> %0, <4 x float> %3, <4 x float> %11541 tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %s1.addr.014, i32 4, <4 x i1> %0)1542 %add.ptr = getelementptr inbounds float, ptr %s1.addr.014, i32 41543 %sub = add nsw i32 %N.addr.013, -41544 %cmp = icmp sgt i32 %N.addr.013, 41545 br i1 %cmp, label %while.body, label %while.end1546 1547while.end: ; preds = %while.body, %entry1548 ret void1549}1550 1551declare <4 x i1> @llvm.arm.mve.vctp32(i32)1552declare <4 x i16> @llvm.masked.load.v4i16.p0(ptr, i32 immarg, <4 x i1>, <4 x i16>)1553declare <4 x i32> @llvm.masked.load.v4i32.p0(ptr, i32 immarg, <4 x i1>, <4 x i32>)1554declare <4 x float> @llvm.masked.load.v4f32.p0(ptr, i32 immarg, <4 x i1>, <4 x float>)1555declare void @llvm.masked.store.v4i32.p0(<4 x i32>, ptr, i32 immarg, <4 x i1>)1556declare void @llvm.masked.store.v4f32.p0(<4 x float>, ptr, i32 immarg, <4 x i1>)1557 1558declare <4 x i32> @llvm.arm.mve.add.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1559declare <4 x i32> @llvm.arm.mve.sub.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1560declare <4 x i32> @llvm.arm.mve.mul.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1561declare <4 x i32> @llvm.arm.mve.qadd.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>, <4 x i32>)1562declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32>, <4 x i32>)1563declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>)1564declare <4 x i32> @llvm.arm.mve.qsub.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>, <4 x i32>)1565declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>)1566declare <4 x i32> @llvm.usub.sat.v4i32(<4 x i32>, <4 x i32>)1567declare <4 x i32> @llvm.arm.mve.hadd.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>, <4 x i32>)1568declare <4 x i32> @llvm.arm.mve.vhadd.v4i32(<4 x i32>, <4 x i32>, i32)1569declare <4 x i32> @llvm.arm.mve.hsub.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>, <4 x i32>)1570declare <4 x i32> @llvm.arm.mve.vhsub.v4i32(<4 x i32>, <4 x i32>, i32)1571declare <2 x i64> @llvm.arm.mve.vqdmull.v2i64.v4i32(<4 x i32>, <4 x i32>, i32) #11572declare <4 x i32> @llvm.arm.mve.vqdmull.predicated.v4i32.v8i16.v4i1(<8 x i16>, <8 x i16>, i32, <4 x i1>, <4 x i32>)1573declare <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1574declare <4 x i32> @llvm.arm.mve.vqdmulh.v4i32(<4 x i32>, <4 x i32>)1575declare <4 x i32> @llvm.arm.mve.qrdmulh.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1576declare <4 x i32> @llvm.arm.mve.vqrdmulh.v4i32(<4 x i32>, <4 x i32>)1577declare <4 x i32> @llvm.arm.mve.vmla.n.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>)1578declare <4 x i32> @llvm.arm.mve.vmlas.n.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>)1579declare <4 x float> @llvm.arm.mve.add.predicated.v4f32.v4i1(<4 x float>, <4 x float>, <4 x i1>, <4 x float>)1580declare <4 x float> @llvm.arm.mve.sub.predicated.v4f32.v4i1(<4 x float>, <4 x float>, <4 x i1>, <4 x float>)1581declare <4 x float> @llvm.arm.mve.mul.predicated.v4f32.v4i1(<4 x float>, <4 x float>, <4 x i1>, <4 x float>)1582declare <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float>, <4 x float>, <4 x float>, <4 x i1>)1583declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>)1584