brintos

brintos / llvm-project-archived public Read only

0
0
Text · 74.0 KiB · 413c4a1 Raw
1727 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) {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:    movs r3, #1014; CHECK-NEXT:    dlstp.32 lr, r215; CHECK-NEXT:  .LBB0_2: @ %for.body16; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=117; CHECK-NEXT:    vldrw.u32 q0, [r0], #1618; CHECK-NEXT:    vadd.i32 q0, q0, r319; CHECK-NEXT:    vstrw.32 q0, [r1], #1620; CHECK-NEXT:    letp lr, .LBB0_221; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup22; CHECK-NEXT:    pop {r7, pc}23entry:24  %cmp11 = icmp sgt i32 %n, 025  br i1 %cmp11, label %for.body, label %for.cond.cleanup26 27for.cond.cleanup:                                 ; preds = %for.body, %entry28  ret void29 30for.body:                                         ; preds = %entry, %for.body31  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]32  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]33  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]34  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)35  %1 = bitcast ptr %x.addr.014 to ptr36  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)37  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 438  %3 = add <4 x i32> %2, <i32 10, i32 10, i32 10, i32 10>39  %4 = bitcast ptr %y.addr.013 to ptr40  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)41  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 442  %sub = add nsw i32 %i.012, -443  %cmp = icmp sgt i32 %i.012, 444  br i1 %cmp, label %for.body, label %for.cond.cleanup45}46 47define void @vadd(ptr %s1, i32 %c0, i32 %N) {48; CHECK-LABEL: vadd:49; CHECK:       @ %bb.0: @ %entry50; CHECK-NEXT:    .save {r7, lr}51; CHECK-NEXT:    push {r7, lr}52; CHECK-NEXT:    cmp r2, #153; CHECK-NEXT:    it lt54; CHECK-NEXT:    poplt {r7, pc}55; CHECK-NEXT:  .LBB1_1: @ %while.body.lr.ph56; CHECK-NEXT:    dlstp.32 lr, r257; CHECK-NEXT:  .LBB1_2: @ %while.body58; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=159; CHECK-NEXT:    vldrw.u32 q0, [r0]60; CHECK-NEXT:    vadd.i32 q0, q0, r161; CHECK-NEXT:    vstrw.32 q0, [r0], #1662; CHECK-NEXT:    letp lr, .LBB1_263; CHECK-NEXT:  @ %bb.3: @ %while.end64; CHECK-NEXT:    pop {r7, pc}65entry:66  %cmp11 = icmp sgt i32 %N, 067  br i1 %cmp11, label %while.body.lr.ph, label %while.end68 69while.body.lr.ph:                                 ; preds = %entry70  %.splatinsert = insertelement <4 x i32> undef, i32 %c0, i32 071  %.splat = shufflevector <4 x i32> %.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer72  br label %while.body73 74while.body:                                       ; preds = %while.body.lr.ph, %while.body75  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]76  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]77  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)78  %1 = bitcast ptr %s1.addr.013 to ptr79  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)80  %3 = tail call <4 x i32> @llvm.arm.mve.add.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> %.splat, <4 x i1> %0, <4 x i32> %2)81  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)82  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 483  %sub = add nsw i32 %N.addr.012, -484  %cmp = icmp sgt i32 %N.addr.012, 485  br i1 %cmp, label %while.body, label %while.end86 87while.end:                                        ; preds = %while.body, %entry88  ret void89}90 91define void @vsubq(ptr %x, ptr %y, i32 %n) {92; CHECK-LABEL: vsubq:93; CHECK:       @ %bb.0: @ %entry94; CHECK-NEXT:    .save {r7, lr}95; CHECK-NEXT:    push {r7, lr}96; CHECK-NEXT:    cmp r2, #197; CHECK-NEXT:    it lt98; CHECK-NEXT:    poplt {r7, pc}99; CHECK-NEXT:  .LBB2_1: @ %for.body.preheader100; CHECK-NEXT:    movs r3, #10101; CHECK-NEXT:    dlstp.32 lr, r2102; CHECK-NEXT:  .LBB2_2: @ %for.body103; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1104; CHECK-NEXT:    vldrw.u32 q0, [r0], #16105; CHECK-NEXT:    vsub.i32 q0, q0, r3106; CHECK-NEXT:    vstrw.32 q0, [r1], #16107; CHECK-NEXT:    letp lr, .LBB2_2108; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup109; CHECK-NEXT:    pop {r7, pc}110entry:111  %cmp11 = icmp sgt i32 %n, 0112  br i1 %cmp11, label %for.body, label %for.cond.cleanup113 114for.cond.cleanup:                                 ; preds = %for.body, %entry115  ret void116 117for.body:                                         ; preds = %entry, %for.body118  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]119  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]120  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]121  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)122  %1 = bitcast ptr %x.addr.014 to ptr123  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)124  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4125  %3 = sub <4 x i32> %2, <i32 10, i32 10, i32 10, i32 10>126  %4 = bitcast ptr %y.addr.013 to ptr127  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)128  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4129  %sub = add nsw i32 %i.012, -4130  %cmp = icmp sgt i32 %i.012, 4131  br i1 %cmp, label %for.body, label %for.cond.cleanup132}133 134define void @vsub(ptr %s1, i32 %N) {135; CHECK-LABEL: vsub:136; CHECK:       @ %bb.0: @ %entry137; CHECK-NEXT:    .save {r7, lr}138; CHECK-NEXT:    push {r7, lr}139; CHECK-NEXT:    cmp r1, #1140; CHECK-NEXT:    it lt141; CHECK-NEXT:    poplt {r7, pc}142; CHECK-NEXT:  .LBB3_1: @ %while.body.preheader143; CHECK-NEXT:    movs r2, #10144; CHECK-NEXT:    dlstp.32 lr, r1145; CHECK-NEXT:  .LBB3_2: @ %while.body146; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1147; CHECK-NEXT:    vldrw.u32 q0, [r0]148; CHECK-NEXT:    vsub.i32 q0, q0, r2149; CHECK-NEXT:    vstrw.32 q0, [r0], #16150; CHECK-NEXT:    letp lr, .LBB3_2151; CHECK-NEXT:  @ %bb.3: @ %while.end152; CHECK-NEXT:    pop {r7, pc}153entry:154  %cmp11 = icmp sgt i32 %N, 0155  br i1 %cmp11, label %while.body.lr.ph, label %while.end156 157while.body.lr.ph:                                 ; preds = %entry158  br label %while.body159 160while.body:                                       ; preds = %while.body.lr.ph, %while.body161  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]162  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]163  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)164  %1 = bitcast ptr %s1.addr.013 to ptr165  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)166  %3 = tail call <4 x i32> @llvm.arm.mve.sub.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, <4 x i1> %0, <4 x i32> %2)167  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)168  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4169  %sub = add nsw i32 %N.addr.012, -4170  %cmp = icmp sgt i32 %N.addr.012, 4171  br i1 %cmp, label %while.body, label %while.end172 173while.end:                                        ; preds = %while.body, %entry174  ret void175}176 177define void @vmulq(ptr %x, ptr %y, i32 %n) {178; CHECK-LABEL: vmulq:179; CHECK:       @ %bb.0: @ %entry180; CHECK-NEXT:    .save {r7, lr}181; CHECK-NEXT:    push {r7, lr}182; CHECK-NEXT:    cmp r2, #1183; CHECK-NEXT:    it lt184; CHECK-NEXT:    poplt {r7, pc}185; CHECK-NEXT:  .LBB4_1: @ %for.body.preheader186; CHECK-NEXT:    movs r3, #10187; CHECK-NEXT:    dlstp.32 lr, r2188; CHECK-NEXT:  .LBB4_2: @ %for.body189; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1190; CHECK-NEXT:    vldrw.u32 q0, [r0], #16191; CHECK-NEXT:    vmul.i32 q0, q0, r3192; CHECK-NEXT:    vstrw.32 q0, [r1], #16193; CHECK-NEXT:    letp lr, .LBB4_2194; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup195; CHECK-NEXT:    pop {r7, pc}196entry:197  %cmp11 = icmp sgt i32 %n, 0198  br i1 %cmp11, label %for.body, label %for.cond.cleanup199 200for.cond.cleanup:                                 ; preds = %for.body, %entry201  ret void202 203for.body:                                         ; preds = %entry, %for.body204  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]205  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]206  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]207  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)208  %1 = bitcast ptr %x.addr.014 to ptr209  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)210  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4211  %3 = mul <4 x i32> %2, <i32 10, i32 10, i32 10, i32 10>212  %4 = bitcast ptr %y.addr.013 to ptr213  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)214  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4215  %sub = add nsw i32 %i.012, -4216  %cmp = icmp sgt i32 %i.012, 4217  br i1 %cmp, label %for.body, label %for.cond.cleanup218}219 220define void @vmul(ptr %s1, i32 %N) {221; CHECK-LABEL: vmul:222; CHECK:       @ %bb.0: @ %entry223; CHECK-NEXT:    .save {r7, lr}224; CHECK-NEXT:    push {r7, lr}225; CHECK-NEXT:    cmp r1, #1226; CHECK-NEXT:    it lt227; CHECK-NEXT:    poplt {r7, pc}228; CHECK-NEXT:  .LBB5_1: @ %while.body.preheader229; CHECK-NEXT:    movs r2, #10230; CHECK-NEXT:    dlstp.32 lr, r1231; CHECK-NEXT:  .LBB5_2: @ %while.body232; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1233; CHECK-NEXT:    vldrw.u32 q0, [r0]234; CHECK-NEXT:    vmul.i32 q0, q0, r2235; CHECK-NEXT:    vstrw.32 q0, [r0], #16236; CHECK-NEXT:    letp lr, .LBB5_2237; CHECK-NEXT:  @ %bb.3: @ %while.end238; CHECK-NEXT:    pop {r7, pc}239entry:240  %cmp11 = icmp sgt i32 %N, 0241  br i1 %cmp11, label %while.body.lr.ph, label %while.end242 243while.body.lr.ph:                                 ; preds = %entry244  br label %while.body245 246while.body:                                       ; preds = %while.body.lr.ph, %while.body247  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]248  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]249  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)250  %1 = bitcast ptr %s1.addr.013 to ptr251  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)252  %3 = tail call <4 x i32> @llvm.arm.mve.mul.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, <4 x i1> %0, <4 x i32> %2)253  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)254  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4255  %sub = add nsw i32 %N.addr.012, -4256  %cmp = icmp sgt i32 %N.addr.012, 4257  br i1 %cmp, label %while.body, label %while.end258 259while.end:                                        ; preds = %while.body, %entry260  ret void261}262 263define void @vqaddq(ptr %x, ptr %y, i32 %n) {264; CHECK-LABEL: vqaddq:265; CHECK:       @ %bb.0: @ %entry266; CHECK-NEXT:    .save {r7, lr}267; CHECK-NEXT:    push {r7, lr}268; CHECK-NEXT:    cmp r2, #1269; CHECK-NEXT:    it lt270; CHECK-NEXT:    poplt {r7, pc}271; CHECK-NEXT:  .LBB6_1: @ %for.body.preheader272; CHECK-NEXT:    movs r3, #10273; CHECK-NEXT:    dlstp.32 lr, r2274; CHECK-NEXT:  .LBB6_2: @ %for.body275; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1276; CHECK-NEXT:    vldrw.u32 q0, [r0], #16277; CHECK-NEXT:    vqadd.s32 q0, q0, r3278; CHECK-NEXT:    vstrw.32 q0, [r1], #16279; CHECK-NEXT:    letp lr, .LBB6_2280; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup281; CHECK-NEXT:    pop {r7, pc}282entry:283  %cmp11 = icmp sgt i32 %n, 0284  br i1 %cmp11, label %for.body, label %for.cond.cleanup285 286for.cond.cleanup:                                 ; preds = %for.body, %entry287  ret void288 289for.body:                                         ; preds = %entry, %for.body290  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]291  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]292  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]293  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)294  %1 = bitcast ptr %x.addr.014 to ptr295  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)296  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4297  %3 = tail call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>)298  %4 = bitcast ptr %y.addr.013 to ptr299  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)300  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4301  %sub = add nsw i32 %i.012, -4302  %cmp = icmp sgt i32 %i.012, 4303  br i1 %cmp, label %for.body, label %for.cond.cleanup304}305 306define void @vqaddqu(ptr %x, ptr %y, i32 %n) {307; CHECK-LABEL: vqaddqu:308; CHECK:       @ %bb.0: @ %entry309; CHECK-NEXT:    .save {r7, lr}310; CHECK-NEXT:    push {r7, lr}311; CHECK-NEXT:    cmp r2, #1312; CHECK-NEXT:    it lt313; CHECK-NEXT:    poplt {r7, pc}314; CHECK-NEXT:  .LBB7_1: @ %for.body.preheader315; CHECK-NEXT:    movs r3, #10316; CHECK-NEXT:    dlstp.32 lr, r2317; CHECK-NEXT:  .LBB7_2: @ %for.body318; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1319; CHECK-NEXT:    vldrw.u32 q0, [r0], #16320; CHECK-NEXT:    vqadd.u32 q0, q0, r3321; CHECK-NEXT:    vstrw.32 q0, [r1], #16322; CHECK-NEXT:    letp lr, .LBB7_2323; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup324; CHECK-NEXT:    pop {r7, pc}325entry:326  %cmp11 = icmp sgt i32 %n, 0327  br i1 %cmp11, label %for.body, label %for.cond.cleanup328 329for.cond.cleanup:                                 ; preds = %for.body, %entry330  ret void331 332for.body:                                         ; preds = %entry, %for.body333  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]334  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]335  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]336  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)337  %1 = bitcast ptr %x.addr.014 to ptr338  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)339  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4340  %3 = tail call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>)341  %4 = bitcast ptr %y.addr.013 to ptr342  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)343  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4344  %sub = add nsw i32 %i.012, -4345  %cmp = icmp sgt i32 %i.012, 4346  br i1 %cmp, label %for.body, label %for.cond.cleanup347}348 349define void @vqadd(ptr %s1, i32 %N) {350; CHECK-LABEL: vqadd:351; CHECK:       @ %bb.0: @ %entry352; CHECK-NEXT:    .save {r7, lr}353; CHECK-NEXT:    push {r7, lr}354; CHECK-NEXT:    cmp r1, #1355; CHECK-NEXT:    it lt356; CHECK-NEXT:    poplt {r7, pc}357; CHECK-NEXT:  .LBB8_1: @ %while.body.preheader358; CHECK-NEXT:    movs r2, #10359; CHECK-NEXT:    dlstp.32 lr, r1360; CHECK-NEXT:  .LBB8_2: @ %while.body361; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1362; CHECK-NEXT:    vldrw.u32 q0, [r0]363; CHECK-NEXT:    vqadd.s32 q0, q0, r2364; CHECK-NEXT:    vstrw.32 q0, [r0], #16365; CHECK-NEXT:    letp lr, .LBB8_2366; CHECK-NEXT:  @ %bb.3: @ %while.end367; CHECK-NEXT:    pop {r7, pc}368entry:369  %cmp11 = icmp sgt i32 %N, 0370  br i1 %cmp11, label %while.body.lr.ph, label %while.end371 372while.body.lr.ph:                                 ; preds = %entry373  br label %while.body374 375while.body:                                       ; preds = %while.body.lr.ph, %while.body376  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]377  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]378  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)379  %1 = bitcast ptr %s1.addr.013 to ptr380  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)381  %3 = tail call <4 x i32> @llvm.arm.mve.qadd.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, i32 0, <4 x i1> %0, <4 x i32> %2)382  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)383  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4384  %sub = add nsw i32 %N.addr.012, -4385  %cmp = icmp sgt i32 %N.addr.012, 4386  br i1 %cmp, label %while.body, label %while.end387 388while.end:                                        ; preds = %while.body, %entry389  ret void390}391 392define void @vqsubq(ptr %x, ptr %y, i32 %n) {393; CHECK-LABEL: vqsubq:394; CHECK:       @ %bb.0: @ %entry395; CHECK-NEXT:    .save {r7, lr}396; CHECK-NEXT:    push {r7, lr}397; CHECK-NEXT:    cmp r2, #1398; CHECK-NEXT:    it lt399; CHECK-NEXT:    poplt {r7, pc}400; CHECK-NEXT:  .LBB9_1: @ %for.body.preheader401; CHECK-NEXT:    movs r3, #10402; CHECK-NEXT:    dlstp.32 lr, r2403; CHECK-NEXT:  .LBB9_2: @ %for.body404; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1405; CHECK-NEXT:    vldrw.u32 q0, [r0], #16406; CHECK-NEXT:    vqsub.s32 q0, q0, r3407; CHECK-NEXT:    vstrw.32 q0, [r1], #16408; CHECK-NEXT:    letp lr, .LBB9_2409; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup410; CHECK-NEXT:    pop {r7, pc}411entry:412  %cmp11 = icmp sgt i32 %n, 0413  br i1 %cmp11, label %for.body, label %for.cond.cleanup414 415for.cond.cleanup:                                 ; preds = %for.body, %entry416  ret void417 418for.body:                                         ; preds = %entry, %for.body419  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]420  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]421  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]422  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)423  %1 = bitcast ptr %x.addr.014 to ptr424  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)425  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4426  %3 = tail call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>)427  %4 = bitcast ptr %y.addr.013 to ptr428  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)429  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4430  %sub = add nsw i32 %i.012, -4431  %cmp = icmp sgt i32 %i.012, 4432  br i1 %cmp, label %for.body, label %for.cond.cleanup433}434 435define void @vqsubqu(ptr %x, ptr %y, i32 %n) {436; CHECK-LABEL: vqsubqu:437; CHECK:       @ %bb.0: @ %entry438; CHECK-NEXT:    .save {r7, lr}439; CHECK-NEXT:    push {r7, lr}440; CHECK-NEXT:    cmp r2, #1441; CHECK-NEXT:    it lt442; CHECK-NEXT:    poplt {r7, pc}443; CHECK-NEXT:  .LBB10_1: @ %for.body.preheader444; CHECK-NEXT:    movs r3, #10445; CHECK-NEXT:    dlstp.32 lr, r2446; CHECK-NEXT:  .LBB10_2: @ %for.body447; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1448; CHECK-NEXT:    vldrw.u32 q0, [r0], #16449; CHECK-NEXT:    vqsub.u32 q0, q0, r3450; CHECK-NEXT:    vstrw.32 q0, [r1], #16451; CHECK-NEXT:    letp lr, .LBB10_2452; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup453; CHECK-NEXT:    pop {r7, pc}454entry:455  %cmp11 = icmp sgt i32 %n, 0456  br i1 %cmp11, label %for.body, label %for.cond.cleanup457 458for.cond.cleanup:                                 ; preds = %for.body, %entry459  ret void460 461for.body:                                         ; preds = %entry, %for.body462  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]463  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]464  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]465  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)466  %1 = bitcast ptr %x.addr.014 to ptr467  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)468  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4469  %3 = tail call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>)470  %4 = bitcast ptr %y.addr.013 to ptr471  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)472  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4473  %sub = add nsw i32 %i.012, -4474  %cmp = icmp sgt i32 %i.012, 4475  br i1 %cmp, label %for.body, label %for.cond.cleanup476}477 478define void @vqsub(ptr %s1, i32 %N) {479; CHECK-LABEL: vqsub:480; CHECK:       @ %bb.0: @ %entry481; CHECK-NEXT:    .save {r7, lr}482; CHECK-NEXT:    push {r7, lr}483; CHECK-NEXT:    cmp r1, #1484; CHECK-NEXT:    it lt485; CHECK-NEXT:    poplt {r7, pc}486; CHECK-NEXT:  .LBB11_1: @ %while.body.preheader487; CHECK-NEXT:    movs r2, #10488; CHECK-NEXT:    dlstp.32 lr, r1489; CHECK-NEXT:  .LBB11_2: @ %while.body490; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1491; CHECK-NEXT:    vldrw.u32 q0, [r0]492; CHECK-NEXT:    vqsub.s32 q0, q0, r2493; CHECK-NEXT:    vstrw.32 q0, [r0], #16494; CHECK-NEXT:    letp lr, .LBB11_2495; CHECK-NEXT:  @ %bb.3: @ %while.end496; CHECK-NEXT:    pop {r7, pc}497entry:498  %cmp11 = icmp sgt i32 %N, 0499  br i1 %cmp11, label %while.body.lr.ph, label %while.end500 501while.body.lr.ph:                                 ; preds = %entry502  br label %while.body503 504while.body:                                       ; preds = %while.body.lr.ph, %while.body505  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]506  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]507  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)508  %1 = bitcast ptr %s1.addr.013 to ptr509  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)510  %3 = tail call <4 x i32> @llvm.arm.mve.qsub.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, i32 0, <4 x i1> %0, <4 x i32> %2)511  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)512  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4513  %sub = add nsw i32 %N.addr.012, -4514  %cmp = icmp sgt i32 %N.addr.012, 4515  br i1 %cmp, label %while.body, label %while.end516 517while.end:                                        ; preds = %while.body, %entry518  ret void519}520 521define void @vhaddq(ptr %x, ptr %y, i32 %n) {522; CHECK-LABEL: vhaddq:523; CHECK:       @ %bb.0: @ %entry524; CHECK-NEXT:    .save {r7, lr}525; CHECK-NEXT:    push {r7, lr}526; CHECK-NEXT:    cmp r2, #1527; CHECK-NEXT:    it lt528; CHECK-NEXT:    poplt {r7, pc}529; CHECK-NEXT:  .LBB12_1: @ %for.body.preheader530; CHECK-NEXT:    movs r3, #10531; CHECK-NEXT:    dlstp.32 lr, r2532; CHECK-NEXT:  .LBB12_2: @ %for.body533; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1534; CHECK-NEXT:    vldrw.u32 q0, [r0], #16535; CHECK-NEXT:    vhadd.s32 q0, q0, r3536; CHECK-NEXT:    vstrw.32 q0, [r1], #16537; CHECK-NEXT:    letp lr, .LBB12_2538; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup539; CHECK-NEXT:    pop {r7, pc}540entry:541  %cmp11 = icmp sgt i32 %n, 0542  br i1 %cmp11, label %for.body, label %for.cond.cleanup543 544for.cond.cleanup:                                 ; preds = %for.body, %entry545  ret void546 547for.body:                                         ; preds = %entry, %for.body548  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]549  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]550  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]551  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)552  %1 = bitcast ptr %x.addr.014 to ptr553  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)554  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4555  %3 = tail call <4 x i32> @llvm.arm.mve.vhadd.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, i32 0)556  %4 = bitcast ptr %y.addr.013 to ptr557  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)558  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4559  %sub = add nsw i32 %i.012, -4560  %cmp = icmp sgt i32 %i.012, 4561  br i1 %cmp, label %for.body, label %for.cond.cleanup562}563 564define void @vhadd(ptr %s1, i32 %N) {565; CHECK-LABEL: vhadd:566; CHECK:       @ %bb.0: @ %entry567; CHECK-NEXT:    .save {r7, lr}568; CHECK-NEXT:    push {r7, lr}569; CHECK-NEXT:    cmp r1, #1570; CHECK-NEXT:    it lt571; CHECK-NEXT:    poplt {r7, pc}572; CHECK-NEXT:  .LBB13_1: @ %while.body.preheader573; CHECK-NEXT:    movs r2, #10574; CHECK-NEXT:    dlstp.32 lr, r1575; CHECK-NEXT:  .LBB13_2: @ %while.body576; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1577; CHECK-NEXT:    vldrw.u32 q0, [r0]578; CHECK-NEXT:    vhadd.s32 q0, q0, r2579; CHECK-NEXT:    vstrw.32 q0, [r0], #16580; CHECK-NEXT:    letp lr, .LBB13_2581; CHECK-NEXT:  @ %bb.3: @ %while.end582; CHECK-NEXT:    pop {r7, pc}583entry:584  %cmp11 = icmp sgt i32 %N, 0585  br i1 %cmp11, label %while.body.lr.ph, label %while.end586 587while.body.lr.ph:                                 ; preds = %entry588  br label %while.body589 590while.body:                                       ; preds = %while.body.lr.ph, %while.body591  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]592  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]593  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)594  %1 = bitcast ptr %s1.addr.013 to ptr595  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)596  %3 = tail call <4 x i32> @llvm.arm.mve.hadd.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, i32 0, <4 x i1> %0, <4 x i32> %2)597  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)598  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4599  %sub = add nsw i32 %N.addr.012, -4600  %cmp = icmp sgt i32 %N.addr.012, 4601  br i1 %cmp, label %while.body, label %while.end602 603while.end:                                        ; preds = %while.body, %entry604  ret void605}606 607define void @vhsubq(ptr %x, ptr %y, i32 %n) {608; CHECK-LABEL: vhsubq:609; CHECK:       @ %bb.0: @ %entry610; CHECK-NEXT:    .save {r7, lr}611; CHECK-NEXT:    push {r7, lr}612; CHECK-NEXT:    cmp r2, #1613; CHECK-NEXT:    it lt614; CHECK-NEXT:    poplt {r7, pc}615; CHECK-NEXT:  .LBB14_1: @ %for.body.preheader616; CHECK-NEXT:    movs r3, #10617; CHECK-NEXT:    dlstp.32 lr, r2618; CHECK-NEXT:  .LBB14_2: @ %for.body619; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1620; CHECK-NEXT:    vldrw.u32 q0, [r0], #16621; CHECK-NEXT:    vhsub.s32 q0, q0, r3622; CHECK-NEXT:    vstrw.32 q0, [r1], #16623; CHECK-NEXT:    letp lr, .LBB14_2624; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup625; CHECK-NEXT:    pop {r7, pc}626entry:627  %cmp11 = icmp sgt i32 %n, 0628  br i1 %cmp11, label %for.body, label %for.cond.cleanup629 630for.cond.cleanup:                                 ; preds = %for.body, %entry631  ret void632 633for.body:                                         ; preds = %entry, %for.body634  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]635  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]636  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]637  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)638  %1 = bitcast ptr %x.addr.014 to ptr639  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)640  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4641  %3 = tail call <4 x i32> @llvm.arm.mve.vhsub.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, i32 0)642  %4 = bitcast ptr %y.addr.013 to ptr643  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)644  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4645  %sub = add nsw i32 %i.012, -4646  %cmp = icmp sgt i32 %i.012, 4647  br i1 %cmp, label %for.body, label %for.cond.cleanup648}649 650define void @vhsub(ptr %s1, i32 %N) {651; CHECK-LABEL: vhsub:652; CHECK:       @ %bb.0: @ %entry653; CHECK-NEXT:    .save {r7, lr}654; CHECK-NEXT:    push {r7, lr}655; CHECK-NEXT:    cmp r1, #1656; CHECK-NEXT:    it lt657; CHECK-NEXT:    poplt {r7, pc}658; CHECK-NEXT:  .LBB15_1: @ %while.body.preheader659; CHECK-NEXT:    movs r2, #10660; CHECK-NEXT:    dlstp.32 lr, r1661; CHECK-NEXT:  .LBB15_2: @ %while.body662; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1663; CHECK-NEXT:    vldrw.u32 q0, [r0]664; CHECK-NEXT:    vhsub.s32 q0, q0, r2665; CHECK-NEXT:    vstrw.32 q0, [r0], #16666; CHECK-NEXT:    letp lr, .LBB15_2667; CHECK-NEXT:  @ %bb.3: @ %while.end668; CHECK-NEXT:    pop {r7, pc}669entry:670  %cmp11 = icmp sgt i32 %N, 0671  br i1 %cmp11, label %while.body.lr.ph, label %while.end672 673while.body.lr.ph:                                 ; preds = %entry674  br label %while.body675 676while.body:                                       ; preds = %while.body.lr.ph, %while.body677  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]678  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]679  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)680  %1 = bitcast ptr %s1.addr.013 to ptr681  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)682  %3 = tail call <4 x i32> @llvm.arm.mve.hsub.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, i32 0, <4 x i1> %0, <4 x i32> %2)683  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)684  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4685  %sub = add nsw i32 %N.addr.012, -4686  %cmp = icmp sgt i32 %N.addr.012, 4687  br i1 %cmp, label %while.body, label %while.end688 689while.end:                                        ; preds = %while.body, %entry690  ret void691}692 693define void @vqdmullbq(ptr %x, ptr %y, i32 %n) {694; CHECK-LABEL: vqdmullbq:695; CHECK:       @ %bb.0: @ %entry696; CHECK-NEXT:    .save {r7, lr}697; CHECK-NEXT:    push {r7, lr}698; CHECK-NEXT:    cmp r2, #1699; CHECK-NEXT:    it lt700; CHECK-NEXT:    poplt {r7, pc}701; CHECK-NEXT:  .LBB16_1: @ %for.body.preheader702; CHECK-NEXT:    movs r3, #10703; CHECK-NEXT:    dlstp.32 lr, r2704; CHECK-NEXT:  .LBB16_2: @ %for.body705; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1706; CHECK-NEXT:    vldrw.u32 q0, [r0], #16707; CHECK-NEXT:    vqdmullb.s32 q1, q0, r3708; CHECK-NEXT:    vstrw.32 q1, [r1], #16709; CHECK-NEXT:    letp lr, .LBB16_2710; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup711; CHECK-NEXT:    pop {r7, pc}712entry:713  %cmp11 = icmp sgt i32 %n, 0714  br i1 %cmp11, label %for.body, label %for.cond.cleanup715 716for.cond.cleanup:                                 ; preds = %for.body, %entry717  ret void718 719for.body:                                         ; preds = %entry, %for.body720  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]721  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]722  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]723  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)724  %1 = bitcast ptr %x.addr.014 to ptr725  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)726  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4727  %3 = tail call <2 x i64> @llvm.arm.mve.vqdmull.v2i64.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, i32 0)728  %4 = bitcast <2 x i64> %3 to <4 x i32>729  %5 = bitcast ptr %y.addr.013 to ptr730  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %4, ptr %5, i32 4, <4 x i1> %0)731  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4732  %sub = add nsw i32 %i.012, -4733  %cmp = icmp sgt i32 %i.012, 4734  br i1 %cmp, label %for.body, label %for.cond.cleanup735}736 737 738define void @vqdmull(ptr %s1, i32 %N) {739; CHECK-LABEL: vqdmull:740; CHECK:       @ %bb.0: @ %entry741; CHECK-NEXT:    .save {r7, lr}742; CHECK-NEXT:    push {r7, lr}743; CHECK-NEXT:    cmp r1, #1744; CHECK-NEXT:    it lt745; CHECK-NEXT:    poplt {r7, pc}746; CHECK-NEXT:  .LBB17_1: @ %while.body.preheader747; CHECK-NEXT:    movs r2, #10748; CHECK-NEXT:    dlstp.32 lr, r1749; CHECK-NEXT:  .LBB17_2: @ %while.body750; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1751; CHECK-NEXT:    vldrh.s32 q0, [r0]752; CHECK-NEXT:    vqdmullb.s16 q0, q0, r2753; CHECK-NEXT:    vstrw.32 q0, [r0], #16754; CHECK-NEXT:    letp lr, .LBB17_2755; CHECK-NEXT:  @ %bb.3: @ %while.end756; CHECK-NEXT:    pop {r7, pc}757entry:758  %cmp11 = icmp sgt i32 %N, 0759  br i1 %cmp11, label %while.body.lr.ph, label %while.end760 761while.body.lr.ph:                                 ; preds = %entry762  br label %while.body763 764while.body:                                       ; preds = %while.body.lr.ph, %while.body765  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]766  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]767  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)768  %1 = bitcast ptr %s1.addr.013 to ptr769  %2 = tail call <4 x i16> @llvm.masked.load.v4i16.p0(ptr %1, i32 2, <4 x i1> %0, <4 x i16> zeroinitializer)770  %3 = sext <4 x i16> %2 to <4 x i32>771  %4 = bitcast <4 x i32> %3 to <8 x i16>772  %5 = tail call <4 x i32> @llvm.arm.mve.vqdmull.predicated.v4i32.v8i16.v4i1(<8 x i16> %4, <8 x i16> <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10>, i32 0, <4 x i1> %0, <4 x i32> %3)773  %6 = bitcast ptr %s1.addr.013 to ptr774  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %5, ptr %6, i32 4, <4 x i1> %0)775  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4776  %sub = add nsw i32 %N.addr.012, -4777  %cmp = icmp sgt i32 %N.addr.012, 4778  br i1 %cmp, label %while.body, label %while.end779 780while.end:                                        ; preds = %while.body, %entry781  ret void782}783 784define void @vqdmulhq(ptr %x, ptr %y, i32 %n) {785; CHECK-LABEL: vqdmulhq:786; CHECK:       @ %bb.0: @ %entry787; CHECK-NEXT:    .save {r7, lr}788; CHECK-NEXT:    push {r7, lr}789; CHECK-NEXT:    cmp r2, #1790; CHECK-NEXT:    it lt791; CHECK-NEXT:    poplt {r7, pc}792; CHECK-NEXT:  .LBB18_1: @ %for.body.preheader793; CHECK-NEXT:    movs r3, #10794; CHECK-NEXT:    dlstp.32 lr, r2795; CHECK-NEXT:  .LBB18_2: @ %for.body796; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1797; CHECK-NEXT:    vldrw.u32 q0, [r0], #16798; CHECK-NEXT:    vqdmulh.s32 q0, q0, r3799; CHECK-NEXT:    vstrw.32 q0, [r1], #16800; CHECK-NEXT:    letp lr, .LBB18_2801; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup802; CHECK-NEXT:    pop {r7, pc}803entry:804  %cmp11 = icmp sgt i32 %n, 0805  br i1 %cmp11, label %for.body, label %for.cond.cleanup806 807for.cond.cleanup:                                 ; preds = %for.body, %entry808  ret void809 810for.body:                                         ; preds = %entry, %for.body811  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]812  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]813  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]814  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)815  %1 = bitcast ptr %x.addr.014 to ptr816  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)817  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4818  %3 = tail call <4 x i32> @llvm.arm.mve.vqdmulh.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>)819  %4 = bitcast ptr %y.addr.013 to ptr820  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)821  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4822  %sub = add nsw i32 %i.012, -4823  %cmp = icmp sgt i32 %i.012, 4824  br i1 %cmp, label %for.body, label %for.cond.cleanup825}826 827define void @vqdmulh(ptr %s1, i32 %N) {828; CHECK-LABEL: vqdmulh:829; CHECK:       @ %bb.0: @ %entry830; CHECK-NEXT:    .save {r7, lr}831; CHECK-NEXT:    push {r7, lr}832; CHECK-NEXT:    cmp r1, #1833; CHECK-NEXT:    it lt834; CHECK-NEXT:    poplt {r7, pc}835; CHECK-NEXT:  .LBB19_1: @ %while.body.preheader836; CHECK-NEXT:    movs r2, #10837; CHECK-NEXT:    dlstp.32 lr, r1838; CHECK-NEXT:  .LBB19_2: @ %while.body839; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1840; CHECK-NEXT:    vldrw.u32 q0, [r0]841; CHECK-NEXT:    vqdmulh.s32 q0, q0, r2842; CHECK-NEXT:    vstrw.32 q0, [r0], #16843; CHECK-NEXT:    letp lr, .LBB19_2844; CHECK-NEXT:  @ %bb.3: @ %while.end845; CHECK-NEXT:    pop {r7, pc}846entry:847  %cmp11 = icmp sgt i32 %N, 0848  br i1 %cmp11, label %while.body.lr.ph, label %while.end849 850while.body.lr.ph:                                 ; preds = %entry851  br label %while.body852 853while.body:                                       ; preds = %while.body.lr.ph, %while.body854  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]855  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]856  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)857  %1 = bitcast ptr %s1.addr.013 to ptr858  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)859  %3 = tail call <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, <4 x i1> %0, <4 x i32> %2)860  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)861  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4862  %sub = add nsw i32 %N.addr.012, -4863  %cmp = icmp sgt i32 %N.addr.012, 4864  br i1 %cmp, label %while.body, label %while.end865 866while.end:                                        ; preds = %while.body, %entry867  ret void868}869 870define void @vqrdmulhq(ptr %x, ptr %y, i32 %n) {871; CHECK-LABEL: vqrdmulhq:872; CHECK:       @ %bb.0: @ %entry873; CHECK-NEXT:    .save {r7, lr}874; CHECK-NEXT:    push {r7, lr}875; CHECK-NEXT:    cmp r2, #1876; CHECK-NEXT:    it lt877; CHECK-NEXT:    poplt {r7, pc}878; CHECK-NEXT:  .LBB20_1: @ %for.body.preheader879; CHECK-NEXT:    movs r3, #10880; CHECK-NEXT:    dlstp.32 lr, r2881; CHECK-NEXT:  .LBB20_2: @ %for.body882; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1883; CHECK-NEXT:    vldrw.u32 q0, [r0], #16884; CHECK-NEXT:    vqrdmulh.s32 q0, q0, r3885; CHECK-NEXT:    vstrw.32 q0, [r1], #16886; CHECK-NEXT:    letp lr, .LBB20_2887; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup888; CHECK-NEXT:    pop {r7, pc}889entry:890  %cmp11 = icmp sgt i32 %n, 0891  br i1 %cmp11, label %for.body, label %for.cond.cleanup892 893for.cond.cleanup:                                 ; preds = %for.body, %entry894  ret void895 896for.body:                                         ; preds = %entry, %for.body897  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]898  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]899  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]900  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)901  %1 = bitcast ptr %x.addr.014 to ptr902  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)903  %add.ptr = getelementptr inbounds i32, ptr %x.addr.014, i32 4904  %3 = tail call <4 x i32> @llvm.arm.mve.vqrdmulh.v4i32(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>)905  %4 = bitcast ptr %y.addr.013 to ptr906  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %4, i32 4, <4 x i1> %0)907  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.013, i32 4908  %sub = add nsw i32 %i.012, -4909  %cmp = icmp sgt i32 %i.012, 4910  br i1 %cmp, label %for.body, label %for.cond.cleanup911}912 913define void @vqrdmulh(ptr %s1, i32 %N) {914; CHECK-LABEL: vqrdmulh:915; CHECK:       @ %bb.0: @ %entry916; CHECK-NEXT:    .save {r7, lr}917; CHECK-NEXT:    push {r7, lr}918; CHECK-NEXT:    cmp r1, #1919; CHECK-NEXT:    it lt920; CHECK-NEXT:    poplt {r7, pc}921; CHECK-NEXT:  .LBB21_1: @ %while.body.preheader922; CHECK-NEXT:    movs r2, #10923; CHECK-NEXT:    dlstp.32 lr, r1924; CHECK-NEXT:  .LBB21_2: @ %while.body925; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1926; CHECK-NEXT:    vldrw.u32 q0, [r0]927; CHECK-NEXT:    vqrdmulh.s32 q0, q0, r2928; CHECK-NEXT:    vstrw.32 q0, [r0], #16929; CHECK-NEXT:    letp lr, .LBB21_2930; CHECK-NEXT:  @ %bb.3: @ %while.end931; CHECK-NEXT:    pop {r7, pc}932entry:933  %cmp11 = icmp sgt i32 %N, 0934  br i1 %cmp11, label %while.body.lr.ph, label %while.end935 936while.body.lr.ph:                                 ; preds = %entry937  br label %while.body938 939while.body:                                       ; preds = %while.body.lr.ph, %while.body940  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]941  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]942  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)943  %1 = bitcast ptr %s1.addr.013 to ptr944  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)945  %3 = tail call <4 x i32> @llvm.arm.mve.qrdmulh.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> <i32 10, i32 10, i32 10, i32 10>, <4 x i1> %0, <4 x i32> %2)946  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %3, ptr %1, i32 4, <4 x i1> %0)947  %add.ptr = getelementptr inbounds i32, ptr %s1.addr.013, i32 4948  %sub = add nsw i32 %N.addr.012, -4949  %cmp = icmp sgt i32 %N.addr.012, 4950  br i1 %cmp, label %while.body, label %while.end951 952while.end:                                        ; preds = %while.body, %entry953  ret void954}955 956define void @vmlaq(ptr %x, ptr %y, i32 %n) {957; CHECK-LABEL: vmlaq:958; CHECK:       @ %bb.0: @ %entry959; CHECK-NEXT:    .save {r7, lr}960; CHECK-NEXT:    push {r7, lr}961; CHECK-NEXT:    cmp r2, #1962; CHECK-NEXT:    it lt963; CHECK-NEXT:    poplt {r7, pc}964; CHECK-NEXT:  .LBB22_1: @ %for.body.preheader965; CHECK-NEXT:    movs r3, #10966; CHECK-NEXT:    dlstp.32 lr, r2967; CHECK-NEXT:  .LBB22_2: @ %for.body968; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1969; CHECK-NEXT:    vldrw.u32 q0, [r1]970; CHECK-NEXT:    vldrw.u32 q1, [r0], #16971; CHECK-NEXT:    vmla.i32 q1, q0, r3972; CHECK-NEXT:    vstrw.32 q1, [r1], #16973; CHECK-NEXT:    letp lr, .LBB22_2974; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup975; CHECK-NEXT:    pop {r7, pc}976entry:977  %cmp14 = icmp sgt i32 %n, 0978  br i1 %cmp14, label %for.body, label %for.cond.cleanup979 980for.cond.cleanup:                                 ; preds = %for.body, %entry981  ret void982 983for.body:                                         ; preds = %entry, %for.body984  %x.addr.017 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]985  %y.addr.016 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]986  %i.015 = phi i32 [ %sub, %for.body ], [ %n, %entry ]987  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.015)988  %1 = bitcast ptr %x.addr.017 to ptr989  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)990  %add.ptr = getelementptr inbounds i32, ptr %x.addr.017, i32 4991  %3 = bitcast ptr %y.addr.016 to ptr992  %4 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %3, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)993  %5 = mul <4 x i32> %4, <i32 10, i32 10, i32 10, i32 10>994  %6 = add <4 x i32> %5, %2995  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %6, ptr %3, i32 4, <4 x i1> %0)996  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.016, i32 4997  %sub = add nsw i32 %i.015, -4998  %cmp = icmp sgt i32 %i.015, 4999  br i1 %cmp, label %for.body, label %for.cond.cleanup1000}1001 1002define void @vmlaqp(ptr %x, ptr %y, i32 %n) {1003; CHECK-LABEL: vmlaqp:1004; CHECK:       @ %bb.0: @ %entry1005; CHECK-NEXT:    .save {r7, lr}1006; CHECK-NEXT:    push {r7, lr}1007; CHECK-NEXT:    cmp r2, #11008; CHECK-NEXT:    it lt1009; CHECK-NEXT:    poplt {r7, pc}1010; CHECK-NEXT:  .LBB23_1: @ %for.body.preheader1011; CHECK-NEXT:    movs r3, #101012; CHECK-NEXT:    dlstp.32 lr, r21013; CHECK-NEXT:  .LBB23_2: @ %for.body1014; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11015; CHECK-NEXT:    vldrw.u32 q0, [r1]1016; CHECK-NEXT:    vldrw.u32 q1, [r0], #161017; CHECK-NEXT:    vmla.i32 q1, q0, r31018; CHECK-NEXT:    vstrw.32 q1, [r1], #161019; CHECK-NEXT:    letp lr, .LBB23_21020; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup1021; CHECK-NEXT:    pop {r7, pc}1022entry:1023  %cmp15 = icmp sgt i32 %n, 01024  br i1 %cmp15, label %for.body, label %for.cond.cleanup1025 1026for.cond.cleanup:                                 ; preds = %for.body, %entry1027  ret void1028 1029for.body:                                         ; preds = %entry, %for.body1030  %x.addr.018 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1031  %y.addr.017 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1032  %i.016 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1033  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.016)1034  %1 = bitcast ptr %x.addr.018 to ptr1035  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1036  %add.ptr = getelementptr inbounds i32, ptr %x.addr.018, i32 41037  %3 = bitcast ptr %y.addr.017 to ptr1038  %4 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %3, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1039  %5 = tail call <4 x i32> @llvm.arm.mve.vmla.n.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> %4, i32 10, <4 x i1> %0)1040  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %5, ptr %3, i32 4, <4 x i1> %0)1041  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.017, i32 41042  %sub = add nsw i32 %i.016, -41043  %cmp = icmp sgt i32 %i.016, 41044  br i1 %cmp, label %for.body, label %for.cond.cleanup1045}1046 1047define void @vmlasq(ptr %x, ptr %y, i32 %n) {1048; CHECK-LABEL: vmlasq:1049; CHECK:       @ %bb.0: @ %entry1050; CHECK-NEXT:    .save {r7, lr}1051; CHECK-NEXT:    push {r7, lr}1052; CHECK-NEXT:    cmp r2, #11053; CHECK-NEXT:    it lt1054; CHECK-NEXT:    poplt {r7, pc}1055; CHECK-NEXT:  .LBB24_1: @ %for.body.preheader1056; CHECK-NEXT:    movs r3, #101057; CHECK-NEXT:    dlstp.32 lr, r21058; CHECK-NEXT:  .LBB24_2: @ %for.body1059; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11060; CHECK-NEXT:    vldrw.u32 q0, [r0], #161061; CHECK-NEXT:    vldrw.u32 q1, [r1]1062; CHECK-NEXT:    vmlas.i32 q1, q0, r31063; CHECK-NEXT:    vstrw.32 q1, [r1], #161064; CHECK-NEXT:    letp lr, .LBB24_21065; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup1066; CHECK-NEXT:    pop {r7, pc}1067entry:1068  %cmp14 = icmp sgt i32 %n, 01069  br i1 %cmp14, label %for.body, label %for.cond.cleanup1070 1071for.cond.cleanup:                                 ; preds = %for.body, %entry1072  ret void1073 1074for.body:                                         ; preds = %entry, %for.body1075  %x.addr.017 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1076  %y.addr.016 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1077  %i.015 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1078  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.015)1079  %1 = bitcast ptr %x.addr.017 to ptr1080  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1081  %add.ptr = getelementptr inbounds i32, ptr %x.addr.017, i32 41082  %3 = bitcast ptr %y.addr.016 to ptr1083  %4 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %3, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1084  %5 = mul <4 x i32> %4, %21085  %6 = add <4 x i32> %5, <i32 10, i32 10, i32 10, i32 10>1086  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %6, ptr %3, i32 4, <4 x i1> %0)1087  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.016, i32 41088  %sub = add nsw i32 %i.015, -41089  %cmp = icmp sgt i32 %i.015, 41090  br i1 %cmp, label %for.body, label %for.cond.cleanup1091}1092 1093define void @vmlasqp(ptr %x, ptr %y, i32 %n) {1094; CHECK-LABEL: vmlasqp:1095; CHECK:       @ %bb.0: @ %entry1096; CHECK-NEXT:    .save {r7, lr}1097; CHECK-NEXT:    push {r7, lr}1098; CHECK-NEXT:    cmp r2, #11099; CHECK-NEXT:    it lt1100; CHECK-NEXT:    poplt {r7, pc}1101; CHECK-NEXT:  .LBB25_1: @ %for.body.preheader1102; CHECK-NEXT:    movs r3, #101103; CHECK-NEXT:    dlstp.32 lr, r21104; CHECK-NEXT:  .LBB25_2: @ %for.body1105; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11106; CHECK-NEXT:    vldrw.u32 q0, [r1]1107; CHECK-NEXT:    vldrw.u32 q1, [r0], #161108; CHECK-NEXT:    vmlas.i32 q1, q0, r31109; CHECK-NEXT:    vstrw.32 q1, [r1], #161110; CHECK-NEXT:    letp lr, .LBB25_21111; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup1112; CHECK-NEXT:    pop {r7, pc}1113entry:1114  %cmp15 = icmp sgt i32 %n, 01115  br i1 %cmp15, label %for.body, label %for.cond.cleanup1116 1117for.cond.cleanup:                                 ; preds = %for.body, %entry1118  ret void1119 1120for.body:                                         ; preds = %entry, %for.body1121  %x.addr.018 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1122  %y.addr.017 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1123  %i.016 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1124  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.016)1125  %1 = bitcast ptr %x.addr.018 to ptr1126  %2 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1127  %add.ptr = getelementptr inbounds i32, ptr %x.addr.018, i32 41128  %3 = bitcast ptr %y.addr.017 to ptr1129  %4 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %3, i32 4, <4 x i1> %0, <4 x i32> zeroinitializer)1130  %5 = tail call <4 x i32> @llvm.arm.mve.vmlas.n.predicated.v4i32.v4i1(<4 x i32> %2, <4 x i32> %4, i32 10, <4 x i1> %0)1131  tail call void @llvm.masked.store.v4i32.p0(<4 x i32> %5, ptr %3, i32 4, <4 x i1> %0)1132  %add.ptr1 = getelementptr inbounds i32, ptr %y.addr.017, i32 41133  %sub = add nsw i32 %i.016, -41134  %cmp = icmp sgt i32 %i.016, 41135  br i1 %cmp, label %for.body, label %for.cond.cleanup1136}1137 1138define void @vaddqf(ptr %x, ptr %y, i32 %n) {1139; CHECK-LABEL: vaddqf:1140; CHECK:       @ %bb.0: @ %entry1141; CHECK-NEXT:    .save {r7, lr}1142; CHECK-NEXT:    push {r7, lr}1143; CHECK-NEXT:    cmp r2, #11144; CHECK-NEXT:    it lt1145; CHECK-NEXT:    poplt {r7, pc}1146; CHECK-NEXT:  .LBB26_1: @ %for.body.preheader1147; CHECK-NEXT:    vmov.f32 q0, #1.000000e+011148; CHECK-NEXT:    dlstp.32 lr, r21149; CHECK-NEXT:  .LBB26_2: @ %for.body1150; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11151; CHECK-NEXT:    vldrw.u32 q1, [r0], #161152; CHECK-NEXT:    vadd.f32 q1, q1, q01153; CHECK-NEXT:    vstrw.32 q1, [r1], #161154; CHECK-NEXT:    letp lr, .LBB26_21155; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup1156; CHECK-NEXT:    pop {r7, pc}1157entry:1158  %cmp11 = icmp sgt i32 %n, 01159  br i1 %cmp11, label %for.body, label %for.cond.cleanup1160 1161for.cond.cleanup:                                 ; preds = %for.body, %entry1162  ret void1163 1164for.body:                                         ; preds = %entry, %for.body1165  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1166  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1167  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1168  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)1169  %1 = bitcast ptr %x.addr.014 to ptr1170  %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1171  %add.ptr = getelementptr inbounds float, ptr %x.addr.014, i32 41172  %3 = fadd fast <4 x float> %2, <float 10.0, float 10.0, float 10.0, float 10.0>1173  %4 = bitcast ptr %y.addr.013 to ptr1174  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %4, i32 4, <4 x i1> %0)1175  %add.ptr1 = getelementptr inbounds float, ptr %y.addr.013, i32 41176  %sub = add nsw i32 %i.012, -41177  %cmp = icmp sgt i32 %i.012, 41178  br i1 %cmp, label %for.body, label %for.cond.cleanup1179}1180 1181define void @vaddf(ptr %s1, i32 %N) {1182; CHECK-LABEL: vaddf:1183; CHECK:       @ %bb.0: @ %entry1184; CHECK-NEXT:    .save {r7, lr}1185; CHECK-NEXT:    push {r7, lr}1186; CHECK-NEXT:    cmp r1, #11187; CHECK-NEXT:    it lt1188; CHECK-NEXT:    poplt {r7, pc}1189; CHECK-NEXT:  .LBB27_1: @ %while.body.preheader1190; CHECK-NEXT:    movs r2, #01191; CHECK-NEXT:    movt r2, #166721192; CHECK-NEXT:    dlstp.32 lr, r11193; CHECK-NEXT:  .LBB27_2: @ %while.body1194; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11195; CHECK-NEXT:    vldrw.u32 q0, [r0]1196; CHECK-NEXT:    vadd.f32 q0, q0, r21197; CHECK-NEXT:    vstrw.32 q0, [r0], #161198; CHECK-NEXT:    letp lr, .LBB27_21199; CHECK-NEXT:  @ %bb.3: @ %while.end1200; CHECK-NEXT:    pop {r7, pc}1201entry:1202  %cmp11 = icmp sgt i32 %N, 01203  br i1 %cmp11, label %while.body.lr.ph, label %while.end1204 1205while.body.lr.ph:                                 ; preds = %entry1206  br label %while.body1207 1208while.body:                                       ; preds = %while.body.lr.ph, %while.body1209  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1210  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1211  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)1212  %1 = bitcast ptr %s1.addr.013 to ptr1213  %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1214  %3 = tail call fast <4 x float> @llvm.arm.mve.add.predicated.v4f32.v4i1(<4 x float> %2, <4 x float> <float 10.0, float 10.0, float 10.0, float 10.0>, <4 x i1> %0, <4 x float> %2)1215  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %1, i32 4, <4 x i1> %0)1216  %add.ptr = getelementptr inbounds float, ptr %s1.addr.013, i32 41217  %sub = add nsw i32 %N.addr.012, -41218  %cmp = icmp sgt i32 %N.addr.012, 41219  br i1 %cmp, label %while.body, label %while.end1220 1221while.end:                                        ; preds = %while.body, %entry1222  ret void1223}1224 1225define void @vsubqf(ptr %x, ptr %y, i32 %n) {1226; CHECK-LABEL: vsubqf:1227; CHECK:       @ %bb.0: @ %entry1228; CHECK-NEXT:    .save {r7, lr}1229; CHECK-NEXT:    push {r7, lr}1230; CHECK-NEXT:    cmp r2, #11231; CHECK-NEXT:    it lt1232; CHECK-NEXT:    poplt {r7, pc}1233; CHECK-NEXT:  .LBB28_1: @ %for.body.preheader1234; CHECK-NEXT:    vmov.f32 q0, #-1.000000e+011235; CHECK-NEXT:    dlstp.32 lr, r21236; CHECK-NEXT:  .LBB28_2: @ %for.body1237; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11238; CHECK-NEXT:    vldrw.u32 q1, [r0], #161239; CHECK-NEXT:    vadd.f32 q1, q1, q01240; CHECK-NEXT:    vstrw.32 q1, [r1], #161241; CHECK-NEXT:    letp lr, .LBB28_21242; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup1243; CHECK-NEXT:    pop {r7, pc}1244entry:1245  %cmp11 = icmp sgt i32 %n, 01246  br i1 %cmp11, label %for.body, label %for.cond.cleanup1247 1248for.cond.cleanup:                                 ; preds = %for.body, %entry1249  ret void1250 1251for.body:                                         ; preds = %entry, %for.body1252  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1253  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1254  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1255  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)1256  %1 = bitcast ptr %x.addr.014 to ptr1257  %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1258  %add.ptr = getelementptr inbounds float, ptr %x.addr.014, i32 41259  %3 = fsub fast <4 x float> %2, <float 10.0, float 10.0, float 10.0, float 10.0>1260  %4 = bitcast ptr %y.addr.013 to ptr1261  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %4, i32 4, <4 x i1> %0)1262  %add.ptr1 = getelementptr inbounds float, ptr %y.addr.013, i32 41263  %sub = add nsw i32 %i.012, -41264  %cmp = icmp sgt i32 %i.012, 41265  br i1 %cmp, label %for.body, label %for.cond.cleanup1266}1267 1268define void @vsubf(ptr %s1, i32 %N) {1269; CHECK-LABEL: vsubf:1270; CHECK:       @ %bb.0: @ %entry1271; CHECK-NEXT:    .save {r7, lr}1272; CHECK-NEXT:    push {r7, lr}1273; CHECK-NEXT:    cmp r1, #11274; CHECK-NEXT:    it lt1275; CHECK-NEXT:    poplt {r7, pc}1276; CHECK-NEXT:  .LBB29_1: @ %while.body.preheader1277; CHECK-NEXT:    movs r2, #01278; CHECK-NEXT:    movt r2, #166721279; CHECK-NEXT:    dlstp.32 lr, r11280; CHECK-NEXT:  .LBB29_2: @ %while.body1281; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11282; CHECK-NEXT:    vldrw.u32 q0, [r0]1283; CHECK-NEXT:    vsub.f32 q0, q0, r21284; CHECK-NEXT:    vstrw.32 q0, [r0], #161285; CHECK-NEXT:    letp lr, .LBB29_21286; CHECK-NEXT:  @ %bb.3: @ %while.end1287; CHECK-NEXT:    pop {r7, pc}1288entry:1289  %cmp11 = icmp sgt i32 %N, 01290  br i1 %cmp11, label %while.body.lr.ph, label %while.end1291 1292while.body.lr.ph:                                 ; preds = %entry1293  br label %while.body1294 1295while.body:                                       ; preds = %while.body.lr.ph, %while.body1296  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1297  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1298  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)1299  %1 = bitcast ptr %s1.addr.013 to ptr1300  %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1301  %3 = tail call fast <4 x float> @llvm.arm.mve.sub.predicated.v4f32.v4i1(<4 x float> %2, <4 x float> <float 10.0, float 10.0, float 10.0, float 10.0>, <4 x i1> %0, <4 x float> %2)1302  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %1, i32 4, <4 x i1> %0)1303  %add.ptr = getelementptr inbounds float, ptr %s1.addr.013, i32 41304  %sub = add nsw i32 %N.addr.012, -41305  %cmp = icmp sgt i32 %N.addr.012, 41306  br i1 %cmp, label %while.body, label %while.end1307 1308while.end:                                        ; preds = %while.body, %entry1309  ret void1310}1311 1312define void @vmulqf(ptr %x, ptr %y, i32 %n) {1313; CHECK-LABEL: vmulqf:1314; CHECK:       @ %bb.0: @ %entry1315; CHECK-NEXT:    .save {r7, lr}1316; CHECK-NEXT:    push {r7, lr}1317; CHECK-NEXT:    cmp r2, #11318; CHECK-NEXT:    it lt1319; CHECK-NEXT:    poplt {r7, pc}1320; CHECK-NEXT:  .LBB30_1: @ %for.body.preheader1321; CHECK-NEXT:    vmov.f32 q0, #1.000000e+011322; CHECK-NEXT:    dlstp.32 lr, r21323; CHECK-NEXT:  .LBB30_2: @ %for.body1324; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11325; CHECK-NEXT:    vldrw.u32 q1, [r0], #161326; CHECK-NEXT:    vmul.f32 q1, q1, q01327; CHECK-NEXT:    vstrw.32 q1, [r1], #161328; CHECK-NEXT:    letp lr, .LBB30_21329; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup1330; CHECK-NEXT:    pop {r7, pc}1331entry:1332  %cmp11 = icmp sgt i32 %n, 01333  br i1 %cmp11, label %for.body, label %for.cond.cleanup1334 1335for.cond.cleanup:                                 ; preds = %for.body, %entry1336  ret void1337 1338for.body:                                         ; preds = %entry, %for.body1339  %x.addr.014 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1340  %y.addr.013 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1341  %i.012 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1342  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.012)1343  %1 = bitcast ptr %x.addr.014 to ptr1344  %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1345  %add.ptr = getelementptr inbounds float, ptr %x.addr.014, i32 41346  %3 = fmul fast <4 x float> %2, <float 10.0, float 10.0, float 10.0, float 10.0>1347  %4 = bitcast ptr %y.addr.013 to ptr1348  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %4, i32 4, <4 x i1> %0)1349  %add.ptr1 = getelementptr inbounds float, ptr %y.addr.013, i32 41350  %sub = add nsw i32 %i.012, -41351  %cmp = icmp sgt i32 %i.012, 41352  br i1 %cmp, label %for.body, label %for.cond.cleanup1353}1354 1355define void @vmulf(ptr %s1, i32 %N) {1356; CHECK-LABEL: vmulf:1357; CHECK:       @ %bb.0: @ %entry1358; CHECK-NEXT:    .save {r7, lr}1359; CHECK-NEXT:    push {r7, lr}1360; CHECK-NEXT:    cmp r1, #11361; CHECK-NEXT:    it lt1362; CHECK-NEXT:    poplt {r7, pc}1363; CHECK-NEXT:  .LBB31_1: @ %while.body.preheader1364; CHECK-NEXT:    movs r2, #01365; CHECK-NEXT:    movt r2, #166721366; CHECK-NEXT:    dlstp.32 lr, r11367; CHECK-NEXT:  .LBB31_2: @ %while.body1368; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11369; CHECK-NEXT:    vldrw.u32 q0, [r0]1370; CHECK-NEXT:    vmul.f32 q0, q0, r21371; CHECK-NEXT:    vstrw.32 q0, [r0], #161372; CHECK-NEXT:    letp lr, .LBB31_21373; CHECK-NEXT:  @ %bb.3: @ %while.end1374; CHECK-NEXT:    pop {r7, pc}1375entry:1376  %cmp11 = icmp sgt i32 %N, 01377  br i1 %cmp11, label %while.body.lr.ph, label %while.end1378 1379while.body.lr.ph:                                 ; preds = %entry1380  br label %while.body1381 1382while.body:                                       ; preds = %while.body.lr.ph, %while.body1383  %s1.addr.013 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1384  %N.addr.012 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1385  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.012)1386  %1 = bitcast ptr %s1.addr.013 to ptr1387  %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1388  %3 = tail call fast <4 x float> @llvm.arm.mve.mul.predicated.v4f32.v4i1(<4 x float> %2, <4 x float> <float 10.0, float 10.0, float 10.0, float 10.0>, <4 x i1> %0, <4 x float> %2)1389  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %3, ptr %1, i32 4, <4 x i1> %0)1390  %add.ptr = getelementptr inbounds float, ptr %s1.addr.013, i32 41391  %sub = add nsw i32 %N.addr.012, -41392  %cmp = icmp sgt i32 %N.addr.012, 41393  br i1 %cmp, label %while.body, label %while.end1394 1395while.end:                                        ; preds = %while.body, %entry1396  ret void1397}1398 1399define void @vfmaq(ptr %x, ptr %y, i32 %n) {1400; CHECK-LABEL: vfmaq:1401; CHECK:       @ %bb.0: @ %entry1402; CHECK-NEXT:    .save {r7, lr}1403; CHECK-NEXT:    push {r7, lr}1404; CHECK-NEXT:    cmp r2, #11405; CHECK-NEXT:    it lt1406; CHECK-NEXT:    poplt {r7, pc}1407; CHECK-NEXT:  .LBB32_1: @ %for.body.preheader1408; CHECK-NEXT:    vmov.f32 q0, #1.000000e+011409; CHECK-NEXT:    dlstp.32 lr, r21410; CHECK-NEXT:  .LBB32_2: @ %for.body1411; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11412; CHECK-NEXT:    vldrw.u32 q1, [r1]1413; CHECK-NEXT:    vldrw.u32 q2, [r0], #161414; CHECK-NEXT:    vfma.f32 q2, q1, q01415; CHECK-NEXT:    vstrw.32 q2, [r1], #161416; CHECK-NEXT:    letp lr, .LBB32_21417; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup1418; CHECK-NEXT:    pop {r7, pc}1419entry:1420  %cmp14 = icmp sgt i32 %n, 01421  br i1 %cmp14, label %for.body, label %for.cond.cleanup1422 1423for.cond.cleanup:                                 ; preds = %for.body, %entry1424  ret void1425 1426for.body:                                         ; preds = %entry, %for.body1427  %x.addr.017 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1428  %y.addr.016 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1429  %i.015 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1430  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.015)1431  %1 = bitcast ptr %x.addr.017 to ptr1432  %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1433  %add.ptr = getelementptr inbounds float, ptr %x.addr.017, i32 41434  %3 = bitcast ptr %y.addr.016 to ptr1435  %4 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %3, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1436  %5 = tail call fast <4 x float> @llvm.fma.v4f32(<4 x float> %4, <4 x float> <float 10.0, float 10.0, float 10.0, float 10.0>, <4 x float> %2)1437  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %5, ptr %3, i32 4, <4 x i1> %0)1438  %add.ptr1 = getelementptr inbounds float, ptr %y.addr.016, i32 41439  %sub = add nsw i32 %i.015, -41440  %cmp = icmp sgt i32 %i.015, 41441  br i1 %cmp, label %for.body, label %for.cond.cleanup1442}1443 1444define void @vfma(ptr %s1, ptr %s2, i32 %N) {1445; CHECK-LABEL: vfma:1446; CHECK:       @ %bb.0: @ %entry1447; CHECK-NEXT:    .save {r7, lr}1448; CHECK-NEXT:    push {r7, lr}1449; CHECK-NEXT:    cmp r2, #11450; CHECK-NEXT:    it lt1451; CHECK-NEXT:    poplt {r7, pc}1452; CHECK-NEXT:  .LBB33_1: @ %while.body.lr.ph1453; CHECK-NEXT:    vmov.f32 q0, #1.000000e+011454; CHECK-NEXT:    dlstp.32 lr, r21455; CHECK-NEXT:  .LBB33_2: @ %while.body1456; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11457; CHECK-NEXT:    vldrw.u32 q1, [r1]1458; CHECK-NEXT:    vldrw.u32 q2, [r0]1459; CHECK-NEXT:    vfma.f32 q2, q1, q01460; CHECK-NEXT:    vstrw.32 q2, [r0], #161461; CHECK-NEXT:    letp lr, .LBB33_21462; CHECK-NEXT:  @ %bb.3: @ %while.end1463; CHECK-NEXT:    pop {r7, pc}1464entry:1465  %cmp12 = icmp sgt i32 %N, 01466  br i1 %cmp12, label %while.body.lr.ph, label %while.end1467 1468while.body.lr.ph:                                 ; preds = %entry1469  %0 = bitcast ptr %s2 to ptr1470  br label %while.body1471 1472while.body:                                       ; preds = %while.body.lr.ph, %while.body1473  %s1.addr.014 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1474  %N.addr.013 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1475  %1 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.013)1476  %2 = bitcast ptr %s1.addr.014 to ptr1477  %3 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %2, i32 4, <4 x i1> %1, <4 x float> zeroinitializer)1478  %4 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %0, i32 4, <4 x i1> %1, <4 x float> zeroinitializer)1479  %5 = tail call fast <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> %4, <4 x float> <float 10.0, float 10.0, float 10.0, float 10.0>, <4 x float> %3, <4 x i1> %1)1480  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %5, ptr %2, i32 4, <4 x i1> %1)1481  %add.ptr = getelementptr inbounds float, ptr %s1.addr.014, i32 41482  %sub = add nsw i32 %N.addr.013, -41483  %cmp = icmp sgt i32 %N.addr.013, 41484  br i1 %cmp, label %while.body, label %while.end1485 1486while.end:                                        ; preds = %while.body, %entry1487  ret void1488}1489 1490define void @vfmasq(ptr %x, ptr %y, i32 %n) {1491; CHECK-LABEL: vfmasq:1492; CHECK:       @ %bb.0: @ %entry1493; CHECK-NEXT:    .save {r7, lr}1494; CHECK-NEXT:    push {r7, lr}1495; CHECK-NEXT:    cmp r2, #11496; CHECK-NEXT:    it lt1497; CHECK-NEXT:    poplt {r7, pc}1498; CHECK-NEXT:  .LBB34_1: @ %for.body.preheader1499; CHECK-NEXT:    dlstp.32 lr, r21500; CHECK-NEXT:  .LBB34_2: @ %for.body1501; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11502; CHECK-NEXT:    vmov.f32 q2, #1.000000e+011503; CHECK-NEXT:    vldrw.u32 q0, [r1]1504; CHECK-NEXT:    vldrw.u32 q1, [r0], #161505; CHECK-NEXT:    vfma.f32 q2, q1, q01506; CHECK-NEXT:    vstrw.32 q2, [r1], #161507; CHECK-NEXT:    letp lr, .LBB34_21508; CHECK-NEXT:  @ %bb.3: @ %for.cond.cleanup1509; CHECK-NEXT:    pop {r7, pc}1510entry:1511  %cmp14 = icmp sgt i32 %n, 01512  br i1 %cmp14, label %for.body, label %for.cond.cleanup1513 1514for.cond.cleanup:                                 ; preds = %for.body, %entry1515  ret void1516 1517for.body:                                         ; preds = %entry, %for.body1518  %x.addr.017 = phi ptr [ %add.ptr, %for.body ], [ %x, %entry ]1519  %y.addr.016 = phi ptr [ %add.ptr1, %for.body ], [ %y, %entry ]1520  %i.015 = phi i32 [ %sub, %for.body ], [ %n, %entry ]1521  %0 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %i.015)1522  %1 = bitcast ptr %x.addr.017 to ptr1523  %2 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %1, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1524  %add.ptr = getelementptr inbounds float, ptr %x.addr.017, i32 41525  %3 = bitcast ptr %y.addr.016 to ptr1526  %4 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %3, i32 4, <4 x i1> %0, <4 x float> zeroinitializer)1527  %5 = tail call fast <4 x float> @llvm.fma.v4f32(<4 x float> %2, <4 x float> %4, <4 x float> <float 10.0, float 10.0, float 10.0, float 10.0>)1528  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %5, ptr %3, i32 4, <4 x i1> %0)1529  %add.ptr1 = getelementptr inbounds float, ptr %y.addr.016, i32 41530  %sub = add nsw i32 %i.015, -41531  %cmp = icmp sgt i32 %i.015, 41532  br i1 %cmp, label %for.body, label %for.cond.cleanup1533}1534 1535define void @vfmas(ptr %s1, ptr %s2, i32 %N) {1536; CHECK-LABEL: vfmas:1537; CHECK:       @ %bb.0: @ %entry1538; CHECK-NEXT:    .save {r7, lr}1539; CHECK-NEXT:    push {r7, lr}1540; CHECK-NEXT:    cmp r2, #11541; CHECK-NEXT:    it lt1542; CHECK-NEXT:    poplt {r7, pc}1543; CHECK-NEXT:  .LBB35_1: @ %while.body.lr.ph1544; CHECK-NEXT:    dlstp.32 lr, r21545; CHECK-NEXT:  .LBB35_2: @ %while.body1546; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=11547; CHECK-NEXT:    vmov.f32 q2, #1.000000e+011548; CHECK-NEXT:    vldrw.u32 q0, [r1]1549; CHECK-NEXT:    vldrw.u32 q1, [r0]1550; CHECK-NEXT:    vfma.f32 q2, q1, q01551; CHECK-NEXT:    vstrw.32 q2, [r0], #161552; CHECK-NEXT:    letp lr, .LBB35_21553; CHECK-NEXT:  @ %bb.3: @ %while.end1554; CHECK-NEXT:    pop {r7, pc}1555entry:1556  %cmp12 = icmp sgt i32 %N, 01557  br i1 %cmp12, label %while.body.lr.ph, label %while.end1558 1559while.body.lr.ph:                                 ; preds = %entry1560  %0 = bitcast ptr %s2 to ptr1561  br label %while.body1562 1563while.body:                                       ; preds = %while.body.lr.ph, %while.body1564  %s1.addr.014 = phi ptr [ %s1, %while.body.lr.ph ], [ %add.ptr, %while.body ]1565  %N.addr.013 = phi i32 [ %N, %while.body.lr.ph ], [ %sub, %while.body ]1566  %1 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %N.addr.013)1567  %2 = bitcast ptr %s1.addr.014 to ptr1568  %3 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %2, i32 4, <4 x i1> %1, <4 x float> zeroinitializer)1569  %4 = tail call fast <4 x float> @llvm.masked.load.v4f32.p0(ptr %0, i32 4, <4 x i1> %1, <4 x float> zeroinitializer)1570  %5 = tail call fast <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float> %3, <4 x float> %4, <4 x float> <float 10.0, float 10.0, float 10.0, float 10.0>, <4 x i1> %1)1571  tail call void @llvm.masked.store.v4f32.p0(<4 x float> %5, ptr %2, i32 4, <4 x i1> %1)1572  %add.ptr = getelementptr inbounds float, ptr %s1.addr.014, i32 41573  %sub = add nsw i32 %N.addr.013, -41574  %cmp = icmp sgt i32 %N.addr.013, 41575  br i1 %cmp, label %while.body, label %while.end1576 1577while.end:                                        ; preds = %while.body, %entry1578  ret void1579}1580 1581define void @rgbconvert(ptr noalias %pwSourceBase, i16 signext %iSourceStride, ptr noalias %phwTargetBase, i16 signext %iTargetStride, i16 %iHeight, i16 %iWidth) {1582; CHECK-LABEL: rgbconvert:1583; CHECK:       @ %bb.0: @ %entry1584; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}1585; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}1586; CHECK-NEXT:    .pad #41587; CHECK-NEXT:    sub sp, #41588; CHECK-NEXT:    .vsave {d8, d9, d10, d11}1589; CHECK-NEXT:    vpush {d8, d9, d10, d11}1590; CHECK-NEXT:    .pad #81591; CHECK-NEXT:    sub sp, #81592; CHECK-NEXT:    str r3, [sp, #4] @ 4-byte Spill1593; CHECK-NEXT:    ldrsh.w r3, [sp, #80]1594; CHECK-NEXT:    cmp r3, #11595; CHECK-NEXT:    blt .LBB36_51596; CHECK-NEXT:  @ %bb.1: @ %for.body.lr.ph1597; CHECK-NEXT:    mov r9, r21598; CHECK-NEXT:    ldr r2, [sp, #84]1599; CHECK-NEXT:    mov.w r10, #01600; CHECK-NEXT:    mov.w r11, #83886081601; CHECK-NEXT:    mov.w r4, #671088641602; CHECK-NEXT:    sxth.w r12, r21603; CHECK-NEXT:    vmov.i32 q0, #0xf8001604; CHECK-NEXT:    vmov.i32 q1, #0x1f1605; CHECK-NEXT:    mov.w r2, #20161606; CHECK-NEXT:    mov.w r7, #2684354561607; CHECK-NEXT:    vdup.32 q2, r21608; CHECK-NEXT:  .LBB36_2: @ %for.body1609; CHECK-NEXT:    @ =>This Loop Header: Depth=11610; CHECK-NEXT:    @ Child Loop BB36_3 Depth 21611; CHECK-NEXT:    mov r2, r91612; CHECK-NEXT:    mov r5, r01613; CHECK-NEXT:    dlstp.32 lr, r121614; CHECK-NEXT:  .LBB36_3: @ %do.body1615; CHECK-NEXT:    @ Parent Loop BB36_2 Depth=11616; CHECK-NEXT:    @ => This Inner Loop Header: Depth=21617; CHECK-NEXT:    vldrw.u32 q3, [r5], #161618; CHECK-NEXT:    vqdmulh.s32 q4, q3, r41619; CHECK-NEXT:    vqdmulh.s32 q5, q3, r71620; CHECK-NEXT:    vqdmulh.s32 q3, q3, r111621; CHECK-NEXT:    vand q4, q4, q21622; CHECK-NEXT:    vand q5, q5, q11623; CHECK-NEXT:    vand q3, q3, q01624; CHECK-NEXT:    vorr q4, q4, q51625; CHECK-NEXT:    vorr q3, q4, q31626; CHECK-NEXT:    vstrh.32 q3, [r2], #81627; CHECK-NEXT:    letp lr, .LBB36_31628; CHECK-NEXT:  @ %bb.4: @ %do.end1629; CHECK-NEXT:    @ in Loop: Header=BB36_2 Depth=11630; CHECK-NEXT:    ldr r2, [sp, #4] @ 4-byte Reload1631; CHECK-NEXT:    add.w r10, r10, #11632; CHECK-NEXT:    add.w r0, r0, r1, lsl #21633; CHECK-NEXT:    cmp r10, r31634; CHECK-NEXT:    add.w r9, r9, r2, lsl #11635; CHECK-NEXT:    bne .LBB36_21636; CHECK-NEXT:  .LBB36_5: @ %for.cond.cleanup1637; CHECK-NEXT:    add sp, #81638; CHECK-NEXT:    vpop {d8, d9, d10, d11}1639; CHECK-NEXT:    add sp, #41640; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}1641entry:1642  %conv = sext i16 %iHeight to i321643  %conv9 = sext i16 %iSourceStride to i321644  %conv11 = sext i16 %iTargetStride to i321645  %cmp37 = icmp sgt i16 %iHeight, 01646  br i1 %cmp37, label %for.body.lr.ph, label %for.cond.cleanup1647 1648for.body.lr.ph:                                   ; preds = %entry1649  %conv2 = sext i16 %iWidth to i321650  br label %for.body1651 1652for.cond.cleanup:                                 ; preds = %do.end, %entry1653  ret void1654 1655for.body:                                         ; preds = %for.body.lr.ph, %do.end1656  %pwSourceBase.addr.040 = phi ptr [ %pwSourceBase, %for.body.lr.ph ], [ %add.ptr10, %do.end ]1657  %phwTargetBase.addr.039 = phi ptr [ %phwTargetBase, %for.body.lr.ph ], [ %add.ptr12, %do.end ]1658  %y.038 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %do.end ]1659  br label %do.body1660 1661do.body:                                          ; preds = %do.body, %for.body1662  %pTarget.0 = phi ptr [ %phwTargetBase.addr.039, %for.body ], [ %add.ptr6, %do.body ]1663  %pSource.0 = phi ptr [ %pwSourceBase.addr.040, %for.body ], [ %add.ptr, %do.body ]1664  %blkCnt.0 = phi i32 [ %conv2, %for.body ], [ %sub, %do.body ]1665  %l2 = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %blkCnt.0)1666  %l3 = bitcast ptr %pSource.0 to ptr1667  %l4 = tail call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %l3, i32 4, <4 x i1> %l2, <4 x i32> zeroinitializer)1668  %l5 = tail call <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32> %l4, <4 x i32> <i32 268435456, i32 268435456, i32 268435456, i32 268435456>, <4 x i1> %l2, <4 x i32> undef)1669  %and = and <4 x i32> %l5, <i32 31, i32 31, i32 31, i32 31>1670  %l6 = tail call <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32> %l4, <4 x i32> <i32 67108864, i32 67108864, i32 67108864, i32 67108864>, <4 x i1> %l2, <4 x i32> undef)1671  %and3 = and <4 x i32> %l6, <i32 2016, i32 2016, i32 2016, i32 2016>1672  %l7 = tail call <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32> %l4, <4 x i32> <i32 8388608, i32 8388608, i32 8388608, i32 8388608>, <4 x i1> %l2, <4 x i32> undef)1673  %and4 = and <4 x i32> %l7, <i32 63488, i32 63488, i32 63488, i32 63488>1674  %or = or <4 x i32> %and3, %and1675  %or5 = or <4 x i32> %or, %and41676  %l8 = trunc <4 x i32> %or5 to <4 x i16>1677  %l9 = bitcast ptr %pTarget.0 to ptr1678  tail call void @llvm.masked.store.v4i16.p0(<4 x i16> %l8, ptr %l9, i32 2, <4 x i1> %l2)1679  %add.ptr = getelementptr inbounds i32, ptr %pSource.0, i32 41680  %add.ptr6 = getelementptr inbounds i16, ptr %pTarget.0, i32 41681  %sub = add nsw i32 %blkCnt.0, -41682  %cmp7 = icmp sgt i32 %blkCnt.0, 41683  br i1 %cmp7, label %do.body, label %do.end1684 1685do.end:                                           ; preds = %do.body1686  %add.ptr10 = getelementptr inbounds i32, ptr %pwSourceBase.addr.040, i32 %conv91687  %add.ptr12 = getelementptr inbounds i16, ptr %phwTargetBase.addr.039, i32 %conv111688  %inc = add nuw nsw i32 %y.038, 11689  %exitcond.not = icmp eq i32 %inc, %conv1690  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1691}1692 1693declare <4 x i1> @llvm.arm.mve.vctp32(i32)1694declare <4 x i16> @llvm.masked.load.v4i16.p0(ptr, i32 immarg, <4 x i1>, <4 x i16>)1695declare <4 x i32> @llvm.masked.load.v4i32.p0(ptr, i32 immarg, <4 x i1>, <4 x i32>)1696declare <4 x float> @llvm.masked.load.v4f32.p0(ptr, i32 immarg, <4 x i1>, <4 x float>)1697declare void @llvm.masked.store.v4i32.p0(<4 x i32>, ptr, i32 immarg, <4 x i1>)1698declare void @llvm.masked.store.v4f32.p0(<4 x float>, ptr, i32 immarg, <4 x i1>)1699declare void @llvm.masked.store.v4i16.p0(<4 x i16>, ptr, i32 immarg, <4 x i1>) #31700 1701declare <4 x i32> @llvm.arm.mve.add.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1702declare <4 x i32> @llvm.arm.mve.sub.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1703declare <4 x i32> @llvm.arm.mve.mul.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1704declare <4 x i32> @llvm.arm.mve.qadd.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>, <4 x i32>)1705declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32>, <4 x i32>)1706declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>)1707declare <4 x i32> @llvm.arm.mve.qsub.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>, <4 x i32>)1708declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>)1709declare <4 x i32> @llvm.usub.sat.v4i32(<4 x i32>, <4 x i32>)1710declare <4 x i32> @llvm.arm.mve.hadd.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>, <4 x i32>)1711declare <4 x i32> @llvm.arm.mve.vhadd.v4i32(<4 x i32>, <4 x i32>, i32)1712declare <4 x i32> @llvm.arm.mve.hsub.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>, <4 x i32>)1713declare <4 x i32> @llvm.arm.mve.vhsub.v4i32(<4 x i32>, <4 x i32>, i32)1714declare <2 x i64> @llvm.arm.mve.vqdmull.v2i64.v4i32(<4 x i32>, <4 x i32>, i32) #11715declare <4 x i32> @llvm.arm.mve.vqdmull.predicated.v4i32.v8i16.v4i1(<8 x i16>, <8 x i16>, i32, <4 x i1>, <4 x i32>)1716declare <4 x i32> @llvm.arm.mve.qdmulh.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1717declare <4 x i32> @llvm.arm.mve.vqdmulh.v4i32(<4 x i32>, <4 x i32>)1718declare <4 x i32> @llvm.arm.mve.qrdmulh.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>)1719declare <4 x i32> @llvm.arm.mve.vqrdmulh.v4i32(<4 x i32>, <4 x i32>)1720declare <4 x i32> @llvm.arm.mve.vmla.n.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>)1721declare <4 x i32> @llvm.arm.mve.vmlas.n.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, i32, <4 x i1>)1722declare <4 x float> @llvm.arm.mve.add.predicated.v4f32.v4i1(<4 x float>, <4 x float>, <4 x i1>, <4 x float>)1723declare <4 x float> @llvm.arm.mve.sub.predicated.v4f32.v4i1(<4 x float>, <4 x float>, <4 x i1>, <4 x float>)1724declare <4 x float> @llvm.arm.mve.mul.predicated.v4f32.v4i1(<4 x float>, <4 x float>, <4 x i1>, <4 x float>)1725declare <4 x float> @llvm.arm.mve.fma.predicated.v4f32.v4i1(<4 x float>, <4 x float>, <4 x float>, <4 x i1>)1726declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>)1727