brintos

brintos / llvm-project-archived public Read only

0
0
Text · 45.2 KiB · 96aff02 Raw
1002 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 %s -o - | FileCheck %s3 4define void @ptr_iv_v4i32(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {5; CHECK-LABEL: ptr_iv_v4i32:6; CHECK:       @ %bb.0: @ %vector.ph7; CHECK-NEXT:    .save {r7, lr}8; CHECK-NEXT:    push {r7, lr}9; CHECK-NEXT:    mov.w lr, #24910; CHECK-NEXT:    adr r3, .LCPI0_011; CHECK-NEXT:    vldrw.u32 q0, [r3]12; CHECK-NEXT:  .LBB0_1: @ %vector.body13; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=114; CHECK-NEXT:    vldrw.u32 q1, [r0, q0, uxtw #2]15; CHECK-NEXT:    adds r0, #6416; CHECK-NEXT:    vadd.i32 q1, q1, r217; CHECK-NEXT:    vstrw.32 q1, [r1, q0, uxtw #2]18; CHECK-NEXT:    adds r1, #6419; CHECK-NEXT:    le lr, .LBB0_120; CHECK-NEXT:  @ %bb.2: @ %end21; CHECK-NEXT:    pop {r7, pc}22; CHECK-NEXT:    .p2align 423; CHECK-NEXT:  @ %bb.3:24; CHECK-NEXT:  .LCPI0_0:25; CHECK-NEXT:    .long 0 @ 0x026; CHECK-NEXT:    .long 4 @ 0x427; CHECK-NEXT:    .long 8 @ 0x828; CHECK-NEXT:    .long 12 @ 0xc29vector.ph:30  %broadcast.splatinsert = insertelement <4 x i32> undef, i32 %y, i32 031  %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer32  br label %vector.body33 34vector.body:35  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]36  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]37  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]38  %0 = getelementptr i32, ptr %pointer.phi, i32 1639  %1 = getelementptr i32, ptr %pointer.phi, <4 x i32> <i32 0, i32 4, i32 8, i32 12>40  %2 = getelementptr i32, ptr %pointer.phi13, i32 1641  %3 = getelementptr i32, ptr %pointer.phi13, <4 x i32> <i32 0, i32 4, i32 8, i32 12>42  %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %1, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)43  %4 = add nsw <4 x i32> %wide.masked.gather, %broadcast.splat44  call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %4, <4 x ptr> %3, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)45  %index.next = add i32 %index, 446  %5 = icmp eq i32 %index.next, 99647  br i1 %5, label %end, label %vector.body48 49end:50  ret void51}52 53define void @ptr_iv_v4i32_mult(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i32 %y) {54; CHECK-LABEL: ptr_iv_v4i32_mult:55; CHECK:       @ %bb.0: @ %vector.ph56; CHECK-NEXT:    .save {r7, lr}57; CHECK-NEXT:    push {r7, lr}58; CHECK-NEXT:    mov.w lr, #24959; CHECK-NEXT:    adr r1, .LCPI1_060; CHECK-NEXT:    adr r3, .LCPI1_161; CHECK-NEXT:    vldrw.u32 q0, [r3]62; CHECK-NEXT:    vldrw.u32 q1, [r1]63; CHECK-NEXT:  .LBB1_1: @ %vector.body64; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=165; CHECK-NEXT:    vldrw.u32 q2, [r0, q0]66; CHECK-NEXT:    vadd.i32 q2, q2, r267; CHECK-NEXT:    vstrw.32 q2, [r0, q1]68; CHECK-NEXT:    adds r0, #6469; CHECK-NEXT:    le lr, .LBB1_170; CHECK-NEXT:  @ %bb.2: @ %end71; CHECK-NEXT:    pop {r7, pc}72; CHECK-NEXT:    .p2align 473; CHECK-NEXT:  @ %bb.3:74; CHECK-NEXT:  .LCPI1_0:75; CHECK-NEXT:    .long 20 @ 0x1476; CHECK-NEXT:    .long 36 @ 0x2477; CHECK-NEXT:    .long 52 @ 0x3478; CHECK-NEXT:    .long 68 @ 0x4479; CHECK-NEXT:  .LCPI1_1:80; CHECK-NEXT:    .long 12 @ 0xc81; CHECK-NEXT:    .long 28 @ 0x1c82; CHECK-NEXT:    .long 44 @ 0x2c83; CHECK-NEXT:    .long 60 @ 0x3c84vector.ph:85  %broadcast.splatinsert = insertelement <4 x i32> undef, i32 %y, i32 086  %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer87  br label %vector.body88 89vector.body:90  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]91  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]92  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]93  %0 = getelementptr i32, ptr %pointer.phi, i32 1694  %1 = getelementptr i32, ptr %pointer.phi, <4 x i32> <i32 0, i32 4, i32 8, i32 12>95  %gather.address = getelementptr i32, <4 x ptr> %1, i32 396  %2 = getelementptr i32, ptr %pointer.phi13, i32 1697  %3 = getelementptr i32, ptr %pointer.phi13, <4 x i32> <i32 0, i32 4, i32 8, i32 12>98  %scatter.address = getelementptr i32, <4 x ptr> %1, i32 599  %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %gather.address, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)100  %4 = add nsw <4 x i32> %wide.masked.gather, %broadcast.splat101  call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %4, <4 x ptr> %scatter.address, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)102  %index.next = add i32 %index, 4103  %5 = icmp eq i32 %index.next, 996104  br i1 %5, label %end, label %vector.body105 106end:107  ret void108}109 110define void @ptr_iv_v8i16(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i16 %y) {111; CHECK-LABEL: ptr_iv_v8i16:112; CHECK:       @ %bb.0: @ %vector.ph113; CHECK-NEXT:    .save {r7, lr}114; CHECK-NEXT:    push {r7, lr}115; CHECK-NEXT:    mov.w lr, #249116; CHECK-NEXT:    adr r3, .LCPI2_0117; CHECK-NEXT:    vldrw.u32 q0, [r3]118; CHECK-NEXT:  .LBB2_1: @ %vector.body119; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1120; CHECK-NEXT:    vldrh.u16 q1, [r0, q0, uxtw #1]121; CHECK-NEXT:    adds r0, #64122; CHECK-NEXT:    vadd.i16 q1, q1, r2123; CHECK-NEXT:    vstrh.16 q1, [r1, q0, uxtw #1]124; CHECK-NEXT:    adds r1, #64125; CHECK-NEXT:    le lr, .LBB2_1126; CHECK-NEXT:  @ %bb.2: @ %end127; CHECK-NEXT:    pop {r7, pc}128; CHECK-NEXT:    .p2align 4129; CHECK-NEXT:  @ %bb.3:130; CHECK-NEXT:  .LCPI2_0:131; CHECK-NEXT:    .short 0 @ 0x0132; CHECK-NEXT:    .short 4 @ 0x4133; CHECK-NEXT:    .short 8 @ 0x8134; CHECK-NEXT:    .short 12 @ 0xc135; CHECK-NEXT:    .short 16 @ 0x10136; CHECK-NEXT:    .short 20 @ 0x14137; CHECK-NEXT:    .short 24 @ 0x18138; CHECK-NEXT:    .short 28 @ 0x1c139vector.ph:140  %broadcast.splatinsert = insertelement <8 x i16> undef, i16 %y, i32 0141  %broadcast.splat = shufflevector <8 x i16> %broadcast.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer142  br label %vector.body143 144vector.body:145  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]146  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]147  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]148  %0 = getelementptr i16, ptr %pointer.phi, i32 32149  %1 = getelementptr i16, ptr %pointer.phi, <8 x i16> <i16 0, i16 4, i16 8, i16 12, i16 16, i16 20, i16 24, i16 28>150  %2 = getelementptr i16, ptr %pointer.phi13, i32 32151  %3 = getelementptr i16, ptr %pointer.phi13, <8 x i16> <i16 0, i16 4, i16 8, i16 12, i16 16, i16 20, i16 24, i16 28>152  %wide.masked.gather = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %1, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)153  %4 = add nsw <8 x i16> %wide.masked.gather, %broadcast.splat154  call void @llvm.masked.scatter.v8i16.v8p0(<8 x i16> %4, <8 x ptr> %3, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)155  %index.next = add i32 %index, 4156  %5 = icmp eq i32 %index.next, 996157  br i1 %5, label %end, label %vector.body158 159end:160  ret void161}162 163 164define void @ptr_iv_v8i16_mult(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i16 %y) {165; CHECK-LABEL: ptr_iv_v8i16_mult:166; CHECK:       @ %bb.0: @ %vector.ph167; CHECK-NEXT:    .save {r7, lr}168; CHECK-NEXT:    push {r7, lr}169; CHECK-NEXT:    mov.w lr, #249170; CHECK-NEXT:    adr.w r12, .LCPI3_0171; CHECK-NEXT:    adr r3, .LCPI3_1172; CHECK-NEXT:    vldrw.u32 q0, [r3]173; CHECK-NEXT:    vldrw.u32 q1, [r12]174; CHECK-NEXT:  .LBB3_1: @ %vector.body175; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1176; CHECK-NEXT:    vldrh.u16 q2, [r0, q0]177; CHECK-NEXT:    adds r0, #64178; CHECK-NEXT:    vadd.i16 q2, q2, r2179; CHECK-NEXT:    vstrh.16 q2, [r1, q1]180; CHECK-NEXT:    adds r1, #64181; CHECK-NEXT:    le lr, .LBB3_1182; CHECK-NEXT:  @ %bb.2: @ %end183; CHECK-NEXT:    pop {r7, pc}184; CHECK-NEXT:    .p2align 4185; CHECK-NEXT:  @ %bb.3:186; CHECK-NEXT:  .LCPI3_0:187; CHECK-NEXT:    .short 10 @ 0xa188; CHECK-NEXT:    .short 18 @ 0x12189; CHECK-NEXT:    .short 26 @ 0x1a190; CHECK-NEXT:    .short 34 @ 0x22191; CHECK-NEXT:    .short 42 @ 0x2a192; CHECK-NEXT:    .short 50 @ 0x32193; CHECK-NEXT:    .short 58 @ 0x3a194; CHECK-NEXT:    .short 66 @ 0x42195; CHECK-NEXT:  .LCPI3_1:196; CHECK-NEXT:    .short 6 @ 0x6197; CHECK-NEXT:    .short 14 @ 0xe198; CHECK-NEXT:    .short 22 @ 0x16199; CHECK-NEXT:    .short 30 @ 0x1e200; CHECK-NEXT:    .short 38 @ 0x26201; CHECK-NEXT:    .short 46 @ 0x2e202; CHECK-NEXT:    .short 54 @ 0x36203; CHECK-NEXT:    .short 62 @ 0x3e204vector.ph:205  %broadcast.splatinsert = insertelement <8 x i16> undef, i16 %y, i32 0206  %broadcast.splat = shufflevector <8 x i16> %broadcast.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer207  br label %vector.body208 209vector.body:210  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]211  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]212  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]213  %0 = getelementptr i16, ptr %pointer.phi, i32 32214  %1 = getelementptr i16, ptr %pointer.phi, <8 x i16> <i16 0, i16 4, i16 8, i16 12, i16 16, i16 20, i16 24, i16 28>215  %gather.address = getelementptr i16, <8 x ptr> %1, i16 3216  %2 = getelementptr i16, ptr %pointer.phi13, i32 32217  %3 = getelementptr i16, ptr %pointer.phi13, <8 x i16> <i16 0, i16 4, i16 8, i16 12, i16 16, i16 20, i16 24, i16 28>218  %scatter.address = getelementptr i16, <8 x ptr> %3, i16 5219  %wide.masked.gather = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %gather.address, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)220  %4 = add nsw <8 x i16> %wide.masked.gather, %broadcast.splat221  call void @llvm.masked.scatter.v8i16.v8p0(<8 x i16> %4, <8 x ptr> %scatter.address, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)222  %index.next = add i32 %index, 4223  %5 = icmp eq i32 %index.next, 996224  br i1 %5, label %end, label %vector.body225 226end:227  ret void228}229 230define void @ptr_iv_v16i8(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i8 %y) {231; CHECK-LABEL: ptr_iv_v16i8:232; CHECK:       @ %bb.0: @ %vector.ph233; CHECK-NEXT:    .save {r7, lr}234; CHECK-NEXT:    push {r7, lr}235; CHECK-NEXT:    mov.w lr, #249236; CHECK-NEXT:    adr r3, .LCPI4_0237; CHECK-NEXT:    vldrw.u32 q0, [r3]238; CHECK-NEXT:  .LBB4_1: @ %vector.body239; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1240; CHECK-NEXT:    vldrb.u8 q1, [r0, q0]241; CHECK-NEXT:    adds r0, #64242; CHECK-NEXT:    vadd.i8 q1, q1, r2243; CHECK-NEXT:    vstrb.8 q1, [r1, q0]244; CHECK-NEXT:    adds r1, #64245; CHECK-NEXT:    le lr, .LBB4_1246; CHECK-NEXT:  @ %bb.2: @ %end247; CHECK-NEXT:    pop {r7, pc}248; CHECK-NEXT:    .p2align 4249; CHECK-NEXT:  @ %bb.3:250; CHECK-NEXT:  .LCPI4_0:251; CHECK-NEXT:    .byte 0 @ 0x0252; CHECK-NEXT:    .byte 4 @ 0x4253; CHECK-NEXT:    .byte 8 @ 0x8254; CHECK-NEXT:    .byte 12 @ 0xc255; CHECK-NEXT:    .byte 16 @ 0x10256; CHECK-NEXT:    .byte 20 @ 0x14257; CHECK-NEXT:    .byte 24 @ 0x18258; CHECK-NEXT:    .byte 28 @ 0x1c259; CHECK-NEXT:    .byte 32 @ 0x20260; CHECK-NEXT:    .byte 36 @ 0x24261; CHECK-NEXT:    .byte 40 @ 0x28262; CHECK-NEXT:    .byte 44 @ 0x2c263; CHECK-NEXT:    .byte 48 @ 0x30264; CHECK-NEXT:    .byte 52 @ 0x34265; CHECK-NEXT:    .byte 56 @ 0x38266; CHECK-NEXT:    .byte 60 @ 0x3c267vector.ph:                                        ; preds = %entry268  %broadcast.splatinsert = insertelement <16 x i8> undef, i8 %y, i32 0269  %broadcast.splat = shufflevector <16 x i8> %broadcast.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer270  br label %vector.body271 272vector.body:273  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]274  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]275  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]276  %0 = getelementptr i8, ptr %pointer.phi, i32 64277  %1 = getelementptr i8, ptr %pointer.phi, <16 x i8> <i8 0, i8 4, i8 8, i8 12, i8 16, i8 20, i8 24, i8 28, i8 32, i8 36, i8 40, i8 44, i8 48, i8 52, i8 56, i8 60>278  %2 = getelementptr i8, ptr %pointer.phi13, i32 64279  %3 = getelementptr i8, ptr %pointer.phi13, <16 x i8> <i8 0, i8 4, i8 8, i8 12, i8 16, i8 20, i8 24, i8 28, i8 32, i8 36, i8 40, i8 44, i8 48, i8 52, i8 56, i8 60>280  %wide.masked.gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %1, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)281  %4 = add nsw <16 x i8> %wide.masked.gather, %broadcast.splat282  call void @llvm.masked.scatter.v16i8.v16p0(<16 x i8> %4, <16 x ptr> %3, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)283  %index.next = add i32 %index, 4284  %5 = icmp eq i32 %index.next, 996285  br i1 %5, label %end, label %vector.body286 287end:288  ret void289}290 291 292define void @ptr_iv_v16i8_mult(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, i8 %y) {293; CHECK-LABEL: ptr_iv_v16i8_mult:294; CHECK:       @ %bb.0: @ %vector.ph295; CHECK-NEXT:    .save {r7, lr}296; CHECK-NEXT:    push {r7, lr}297; CHECK-NEXT:    mov.w lr, #249298; CHECK-NEXT:    adr.w r12, .LCPI5_0299; CHECK-NEXT:    adr r3, .LCPI5_1300; CHECK-NEXT:    vldrw.u32 q0, [r3]301; CHECK-NEXT:    vldrw.u32 q1, [r12]302; CHECK-NEXT:  .LBB5_1: @ %vector.body303; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1304; CHECK-NEXT:    vldrb.u8 q2, [r0, q0]305; CHECK-NEXT:    adds r0, #64306; CHECK-NEXT:    vadd.i8 q2, q2, r2307; CHECK-NEXT:    vstrb.8 q2, [r1, q1]308; CHECK-NEXT:    adds r1, #64309; CHECK-NEXT:    le lr, .LBB5_1310; CHECK-NEXT:  @ %bb.2: @ %end311; CHECK-NEXT:    pop {r7, pc}312; CHECK-NEXT:    .p2align 4313; CHECK-NEXT:  @ %bb.3:314; CHECK-NEXT:  .LCPI5_0:315; CHECK-NEXT:    .byte 5 @ 0x5316; CHECK-NEXT:    .byte 9 @ 0x9317; CHECK-NEXT:    .byte 13 @ 0xd318; CHECK-NEXT:    .byte 17 @ 0x11319; CHECK-NEXT:    .byte 21 @ 0x15320; CHECK-NEXT:    .byte 25 @ 0x19321; CHECK-NEXT:    .byte 29 @ 0x1d322; CHECK-NEXT:    .byte 33 @ 0x21323; CHECK-NEXT:    .byte 37 @ 0x25324; CHECK-NEXT:    .byte 41 @ 0x29325; CHECK-NEXT:    .byte 45 @ 0x2d326; CHECK-NEXT:    .byte 49 @ 0x31327; CHECK-NEXT:    .byte 53 @ 0x35328; CHECK-NEXT:    .byte 57 @ 0x39329; CHECK-NEXT:    .byte 61 @ 0x3d330; CHECK-NEXT:    .byte 65 @ 0x41331; CHECK-NEXT:  .LCPI5_1:332; CHECK-NEXT:    .byte 3 @ 0x3333; CHECK-NEXT:    .byte 7 @ 0x7334; CHECK-NEXT:    .byte 11 @ 0xb335; CHECK-NEXT:    .byte 15 @ 0xf336; CHECK-NEXT:    .byte 19 @ 0x13337; CHECK-NEXT:    .byte 23 @ 0x17338; CHECK-NEXT:    .byte 27 @ 0x1b339; CHECK-NEXT:    .byte 31 @ 0x1f340; CHECK-NEXT:    .byte 35 @ 0x23341; CHECK-NEXT:    .byte 39 @ 0x27342; CHECK-NEXT:    .byte 43 @ 0x2b343; CHECK-NEXT:    .byte 47 @ 0x2f344; CHECK-NEXT:    .byte 51 @ 0x33345; CHECK-NEXT:    .byte 55 @ 0x37346; CHECK-NEXT:    .byte 59 @ 0x3b347; CHECK-NEXT:    .byte 63 @ 0x3f348vector.ph:                                        ; preds = %entry349  %broadcast.splatinsert = insertelement <16 x i8> undef, i8 %y, i32 0350  %broadcast.splat = shufflevector <16 x i8> %broadcast.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer351  br label %vector.body352 353vector.body:354  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]355  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]356  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]357  %0 = getelementptr i8, ptr %pointer.phi, i32 64358  %1 = getelementptr i8, ptr %pointer.phi, <16 x i8> <i8 0, i8 4, i8 8, i8 12, i8 16, i8 20, i8 24, i8 28, i8 32, i8 36, i8 40, i8 44, i8 48, i8 52, i8 56, i8 60>359  %gather.address = getelementptr i8, <16 x ptr> %1, i8 3360  %2 = getelementptr i8, ptr %pointer.phi13, i32 64361  %3 = getelementptr i8, ptr %pointer.phi13, <16 x i8> <i8 0, i8 4, i8 8, i8 12, i8 16, i8 20, i8 24, i8 28, i8 32, i8 36, i8 40, i8 44, i8 48, i8 52, i8 56, i8 60>362  %scatter.address = getelementptr i8, <16 x ptr> %3, i8 5363  %wide.masked.gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %gather.address, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)364  %4 = add nsw <16 x i8> %wide.masked.gather, %broadcast.splat365  call void @llvm.masked.scatter.v16i8.v16p0(<16 x i8> %4, <16 x ptr> %scatter.address, i32 4, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)366  %index.next = add i32 %index, 4367  %5 = icmp eq i32 %index.next, 996368  br i1 %5, label %end, label %vector.body369 370end:371  ret void372}373 374define void @ptr_iv_v4f32(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, float %y) {375; CHECK-LABEL: ptr_iv_v4f32:376; CHECK:       @ %bb.0: @ %vector.ph377; CHECK-NEXT:    .save {r7, lr}378; CHECK-NEXT:    push {r7, lr}379; CHECK-NEXT:    mov.w lr, #249380; CHECK-NEXT:    adr r3, .LCPI6_0381; CHECK-NEXT:    vldrw.u32 q0, [r3]382; CHECK-NEXT:  .LBB6_1: @ %vector.body383; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1384; CHECK-NEXT:    vldrw.u32 q1, [r0, q0, uxtw #2]385; CHECK-NEXT:    adds r0, #64386; CHECK-NEXT:    vadd.f32 q1, q1, r2387; CHECK-NEXT:    vstrw.32 q1, [r1, q0, uxtw #2]388; CHECK-NEXT:    adds r1, #64389; CHECK-NEXT:    le lr, .LBB6_1390; CHECK-NEXT:  @ %bb.2: @ %end391; CHECK-NEXT:    pop {r7, pc}392; CHECK-NEXT:    .p2align 4393; CHECK-NEXT:  @ %bb.3:394; CHECK-NEXT:  .LCPI6_0:395; CHECK-NEXT:    .long 0 @ 0x0396; CHECK-NEXT:    .long 4 @ 0x4397; CHECK-NEXT:    .long 8 @ 0x8398; CHECK-NEXT:    .long 12 @ 0xc399vector.ph:                                        ; preds = %entry400  %broadcast.splatinsert = insertelement <4 x float> undef, float %y, i32 0401  %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer402  br label %vector.body403 404vector.body:405  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]406  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]407  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]408  %0 = getelementptr float, ptr %pointer.phi, i32 16409  %1 = getelementptr float, ptr %pointer.phi, <4 x i32> <i32 0, i32 4, i32 8, i32 12>410  %2 = getelementptr float, ptr %pointer.phi13, i32 16411  %3 = getelementptr float, ptr %pointer.phi13, <4 x i32> <i32 0, i32 4, i32 8, i32 12>412  %wide.masked.gather = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %1, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x float> undef)413  %4 = fadd <4 x float> %wide.masked.gather, %broadcast.splat414  call void @llvm.masked.scatter.v4f32.v4p0(<4 x float> %4, <4 x ptr> %3, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)415  %index.next = add i32 %index, 4416  %5 = icmp eq i32 %index.next, 996417  br i1 %5, label %end, label %vector.body418 419end:420  ret void421}422 423define void @ptr_iv_v4f32_mult(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, float %y) {424; CHECK-LABEL: ptr_iv_v4f32_mult:425; CHECK:       @ %bb.0: @ %vector.ph426; CHECK-NEXT:    .save {r7, lr}427; CHECK-NEXT:    push {r7, lr}428; CHECK-NEXT:    mov.w lr, #249429; CHECK-NEXT:    adr r1, .LCPI7_0430; CHECK-NEXT:    adr r3, .LCPI7_1431; CHECK-NEXT:    vldrw.u32 q0, [r3]432; CHECK-NEXT:    vldrw.u32 q1, [r1]433; CHECK-NEXT:  .LBB7_1: @ %vector.body434; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1435; CHECK-NEXT:    vldrw.u32 q2, [r0, q0]436; CHECK-NEXT:    vadd.f32 q2, q2, r2437; CHECK-NEXT:    vstrw.32 q2, [r0, q1]438; CHECK-NEXT:    adds r0, #64439; CHECK-NEXT:    le lr, .LBB7_1440; CHECK-NEXT:  @ %bb.2: @ %end441; CHECK-NEXT:    pop {r7, pc}442; CHECK-NEXT:    .p2align 4443; CHECK-NEXT:  @ %bb.3:444; CHECK-NEXT:  .LCPI7_0:445; CHECK-NEXT:    .long 20 @ 0x14446; CHECK-NEXT:    .long 36 @ 0x24447; CHECK-NEXT:    .long 52 @ 0x34448; CHECK-NEXT:    .long 68 @ 0x44449; CHECK-NEXT:  .LCPI7_1:450; CHECK-NEXT:    .long 12 @ 0xc451; CHECK-NEXT:    .long 28 @ 0x1c452; CHECK-NEXT:    .long 44 @ 0x2c453; CHECK-NEXT:    .long 60 @ 0x3c454vector.ph:                                        ; preds = %entry455  %broadcast.splatinsert = insertelement <4 x float> undef, float %y, i32 0456  %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer457  br label %vector.body458 459vector.body:460  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]461  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]462  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]463  %0 = getelementptr float, ptr %pointer.phi, i32 16464  %1 = getelementptr float, ptr %pointer.phi, <4 x i32> <i32 0, i32 4, i32 8, i32 12>465  %gather.address = getelementptr float, <4 x ptr> %1, i32 3466  %2 = getelementptr float, ptr %pointer.phi13, i32 16467  %3 = getelementptr float, ptr %pointer.phi13, <4 x i32> <i32 0, i32 4, i32 8, i32 12>468  %scatter.address = getelementptr float, <4 x ptr> %1, i32 5469  %wide.masked.gather = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %gather.address, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x float> undef)470  %4 = fadd <4 x float> %wide.masked.gather, %broadcast.splat471  call void @llvm.masked.scatter.v4f32.v4p0(<4 x float> %4, <4 x ptr> %scatter.address, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)472  %index.next = add i32 %index, 4473  %5 = icmp eq i32 %index.next, 996474  br i1 %5, label %end, label %vector.body475 476end:477  ret void478}479 480define void @ptr_iv_v8f16(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, float %y) {481; CHECK-LABEL: ptr_iv_v8f16:482; CHECK:       @ %bb.0: @ %vector.ph483; CHECK-NEXT:    .save {r7, lr}484; CHECK-NEXT:    push {r7, lr}485; CHECK-NEXT:    vmov s0, r2486; CHECK-NEXT:    mov.w lr, #249487; CHECK-NEXT:    vcvtb.f16.f32 s0, s0488; CHECK-NEXT:    adr r3, .LCPI8_0489; CHECK-NEXT:    vmov.f16 r2, s0490; CHECK-NEXT:    vldrw.u32 q0, [r3]491; CHECK-NEXT:  .LBB8_1: @ %vector.body492; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1493; CHECK-NEXT:    vldrh.u16 q1, [r0, q0, uxtw #1]494; CHECK-NEXT:    adds r0, #64495; CHECK-NEXT:    vadd.f16 q1, q1, r2496; CHECK-NEXT:    vstrh.16 q1, [r1, q0, uxtw #1]497; CHECK-NEXT:    adds r1, #64498; CHECK-NEXT:    le lr, .LBB8_1499; CHECK-NEXT:  @ %bb.2: @ %end500; CHECK-NEXT:    pop {r7, pc}501; CHECK-NEXT:    .p2align 4502; CHECK-NEXT:  @ %bb.3:503; CHECK-NEXT:  .LCPI8_0:504; CHECK-NEXT:    .short 0 @ 0x0505; CHECK-NEXT:    .short 4 @ 0x4506; CHECK-NEXT:    .short 8 @ 0x8507; CHECK-NEXT:    .short 12 @ 0xc508; CHECK-NEXT:    .short 16 @ 0x10509; CHECK-NEXT:    .short 20 @ 0x14510; CHECK-NEXT:    .short 24 @ 0x18511; CHECK-NEXT:    .short 28 @ 0x1c512vector.ph:513  %y.trunc = fptrunc float %y to half514  %broadcast.splatinsert = insertelement <8 x half> undef, half %y.trunc, i32 0515  %broadcast.splat = shufflevector <8 x half> %broadcast.splatinsert, <8 x half> undef, <8 x i32> zeroinitializer516  br label %vector.body517 518vector.body:519  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]520  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]521  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]522  %0 = getelementptr half, ptr %pointer.phi, i32 32523  %1 = getelementptr half, ptr %pointer.phi, <8 x i16> <i16 0, i16 4, i16 8, i16 12, i16 16, i16 20, i16 24, i16 28>524  %2 = getelementptr half, ptr %pointer.phi13, i32 32525  %3 = getelementptr half, ptr %pointer.phi13, <8 x i16> <i16 0, i16 4, i16 8, i16 12, i16 16, i16 20, i16 24, i16 28>526  %wide.masked.gather = call <8 x half> @llvm.masked.gather.v8f16.v8p0(<8 x ptr> %1, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x half> undef)527  %4 = fadd <8 x half> %wide.masked.gather, %broadcast.splat528  call void @llvm.masked.scatter.v8f16.v8p0(<8 x half> %4, <8 x ptr> %3, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)529  %index.next = add i32 %index, 4530  %5 = icmp eq i32 %index.next, 996531  br i1 %5, label %end, label %vector.body532 533end:534  ret void535}536 537define void @ptr_iv_v8f16_mult(ptr noalias nocapture readonly %A, ptr noalias nocapture %B, float %y) {538; CHECK-LABEL: ptr_iv_v8f16_mult:539; CHECK:       @ %bb.0: @ %vector.ph540; CHECK-NEXT:    .save {r7, lr}541; CHECK-NEXT:    push {r7, lr}542; CHECK-NEXT:    vmov s0, r2543; CHECK-NEXT:    adr r2, .LCPI9_0544; CHECK-NEXT:    vcvtb.f16.f32 s0, s0545; CHECK-NEXT:    mov.w lr, #249546; CHECK-NEXT:    vmov.f16 r1, s0547; CHECK-NEXT:    vldrw.u32 q0, [r2]548; CHECK-NEXT:    adr r2, .LCPI9_1549; CHECK-NEXT:    vldrw.u32 q1, [r2]550; CHECK-NEXT:  .LBB9_1: @ %vector.body551; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1552; CHECK-NEXT:    vldrh.u16 q2, [r0, q0]553; CHECK-NEXT:    vadd.f16 q2, q2, r1554; CHECK-NEXT:    vstrh.16 q2, [r0, q1]555; CHECK-NEXT:    adds r0, #64556; CHECK-NEXT:    le lr, .LBB9_1557; CHECK-NEXT:  @ %bb.2: @ %end558; CHECK-NEXT:    pop {r7, pc}559; CHECK-NEXT:    .p2align 4560; CHECK-NEXT:  @ %bb.3:561; CHECK-NEXT:  .LCPI9_0:562; CHECK-NEXT:    .short 6 @ 0x6563; CHECK-NEXT:    .short 14 @ 0xe564; CHECK-NEXT:    .short 22 @ 0x16565; CHECK-NEXT:    .short 30 @ 0x1e566; CHECK-NEXT:    .short 38 @ 0x26567; CHECK-NEXT:    .short 46 @ 0x2e568; CHECK-NEXT:    .short 54 @ 0x36569; CHECK-NEXT:    .short 62 @ 0x3e570; CHECK-NEXT:  .LCPI9_1:571; CHECK-NEXT:    .short 10 @ 0xa572; CHECK-NEXT:    .short 18 @ 0x12573; CHECK-NEXT:    .short 26 @ 0x1a574; CHECK-NEXT:    .short 34 @ 0x22575; CHECK-NEXT:    .short 42 @ 0x2a576; CHECK-NEXT:    .short 50 @ 0x32577; CHECK-NEXT:    .short 58 @ 0x3a578; CHECK-NEXT:    .short 66 @ 0x42579vector.ph:580  %y.trunc = fptrunc float %y to half581  %broadcast.splatinsert = insertelement <8 x half> undef, half %y.trunc, i32 0582  %broadcast.splat = shufflevector <8 x half> %broadcast.splatinsert, <8 x half> undef, <8 x i32> zeroinitializer583  br label %vector.body584 585vector.body:586  %pointer.phi = phi ptr [ %A, %vector.ph ], [ %0, %vector.body ]587  %pointer.phi13 = phi ptr [ %B, %vector.ph ], [ %2, %vector.body ]588  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]589  %0 = getelementptr half, ptr %pointer.phi, i32 32590  %1 = getelementptr half, ptr %pointer.phi, <8 x i16> <i16 0, i16 4, i16 8, i16 12, i16 16, i16 20, i16 24, i16 28>591  %gather.address = getelementptr half, <8 x ptr> %1, i32 3592  %2 = getelementptr half, ptr %pointer.phi13, i32 32593  %3 = getelementptr half, ptr %pointer.phi13, <8 x i16> <i16 0, i16 4, i16 8, i16 12, i16 16, i16 20, i16 24, i16 28>594  %scatter.address = getelementptr half, <8 x ptr> %1, i32 5595  %wide.masked.gather = call <8 x half> @llvm.masked.gather.v8f16.v8p0(<8 x ptr> %gather.address, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x half> undef)596  %4 = fadd <8 x half> %wide.masked.gather, %broadcast.splat597  call void @llvm.masked.scatter.v8f16.v8p0(<8 x half> %4, <8 x ptr> %scatter.address, i32 4, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)598  %index.next = add i32 %index, 4599  %5 = icmp eq i32 %index.next, 996600  br i1 %5, label %end, label %vector.body601 602end:603  ret void604}605 606 607define arm_aapcs_vfpcc void @three_pointer_iv_v4i32(ptr nocapture readonly %x, ptr nocapture %z, i32 %n) {608; CHECK-LABEL: three_pointer_iv_v4i32:609; CHECK:       @ %bb.0: @ %vector.ph610; CHECK-NEXT:    .save {r4, lr}611; CHECK-NEXT:    push {r4, lr}612; CHECK-NEXT:    .vsave {d8, d9, d10, d11}613; CHECK-NEXT:    vpush {d8, d9, d10, d11}614; CHECK-NEXT:    adr.w r12, .LCPI10_0615; CHECK-NEXT:    adr.w lr, .LCPI10_1616; CHECK-NEXT:    adr r4, .LCPI10_2617; CHECK-NEXT:    vldrw.u32 q1, [lr]618; CHECK-NEXT:    vldrw.u32 q0, [r4]619; CHECK-NEXT:    vldrw.u32 q2, [r12]620; CHECK-NEXT:    movs r3, #10621; CHECK-NEXT:  .LBB10_1: @ %vector.body622; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1623; CHECK-NEXT:    vldrw.u32 q3, [r0, q0]624; CHECK-NEXT:    vldrw.u32 q4, [r0, q1, uxtw #2]625; CHECK-NEXT:    vldrw.u32 q5, [r0, q2]626; CHECK-NEXT:    adds r0, #48627; CHECK-NEXT:    vmul.i32 q3, q4, q3628; CHECK-NEXT:    subs r2, #4629; CHECK-NEXT:    vmul.i32 q5, q4, q5630; CHECK-NEXT:    vmul.i32 q4, q4, r3631; CHECK-NEXT:    vstrw.32 q4, [r1, q1, uxtw #2]632; CHECK-NEXT:    vstrw.32 q5, [r1, q2]633; CHECK-NEXT:    vstrw.32 q3, [r1, q0]634; CHECK-NEXT:    add.w r1, r1, #48635; CHECK-NEXT:    bne .LBB10_1636; CHECK-NEXT:  @ %bb.2: @ %end637; CHECK-NEXT:    vpop {d8, d9, d10, d11}638; CHECK-NEXT:    pop {r4, pc}639; CHECK-NEXT:    .p2align 4640; CHECK-NEXT:  @ %bb.3:641; CHECK-NEXT:  .LCPI10_0:642; CHECK-NEXT:    .long 4 @ 0x4643; CHECK-NEXT:    .long 16 @ 0x10644; CHECK-NEXT:    .long 28 @ 0x1c645; CHECK-NEXT:    .long 40 @ 0x28646; CHECK-NEXT:  .LCPI10_1:647; CHECK-NEXT:    .long 0 @ 0x0648; CHECK-NEXT:    .long 3 @ 0x3649; CHECK-NEXT:    .long 6 @ 0x6650; CHECK-NEXT:    .long 9 @ 0x9651; CHECK-NEXT:  .LCPI10_2:652; CHECK-NEXT:    .long 8 @ 0x8653; CHECK-NEXT:    .long 20 @ 0x14654; CHECK-NEXT:    .long 32 @ 0x20655; CHECK-NEXT:    .long 44 @ 0x2c656vector.ph:657  br label %vector.body658 659vector.body:660  %pointer.phi = phi ptr [ %x, %vector.ph ], [ %v3, %vector.body ]661  %pointer.phi55 = phi ptr [ %z, %vector.ph ], [ %v4, %vector.body ]662  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]663  %vector.gep = getelementptr i32, ptr %pointer.phi, <4 x i32> <i32 0, i32 3, i32 6, i32 9>664  %v3 = getelementptr i32, ptr %pointer.phi, i32 12665  %vector.gep56 = getelementptr i32, ptr %pointer.phi55, <4 x i32> <i32 0, i32 3, i32 6, i32 9>666  %v4 = getelementptr i32, ptr %pointer.phi55, i32 12667  %v5 = add i32 %index, 0668  %v6 = getelementptr inbounds i32, <4 x ptr> %vector.gep, i32 1669  %wide.masked.gather = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %vector.gep, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)670  %v7 = getelementptr inbounds i32, <4 x ptr> %vector.gep, i32 2671  %wide.masked.gather57 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %v6, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)672  %wide.masked.gather58 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %v7, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)673  %v11 = mul nuw nsw <4 x i32> %wide.masked.gather, <i32 10, i32 10, i32 10, i32 10>674  %v13 = mul nuw nsw <4 x i32> %wide.masked.gather, %wide.masked.gather57675  %v15 = mul nuw nsw <4 x i32> %wide.masked.gather, %wide.masked.gather58676  %v17 = getelementptr inbounds i32, <4 x ptr> %vector.gep56, i32 1677  call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %v11, <4 x ptr> %vector.gep56, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)678  %v18 = getelementptr inbounds i32, <4 x ptr> %vector.gep56, i32 2679  call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %v13, <4 x ptr> %v17, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)680  call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %v15, <4 x ptr> %v18, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)681  %index.next = add i32 %index, 4682  %v37 = icmp eq i32 %index.next, %n683  br i1 %v37, label %end, label %vector.body684 685end:686  ret void;687}688 689define arm_aapcs_vfpcc void @three_pointer_iv_v4i8(ptr nocapture readonly %x, ptr nocapture %z, i32 %n) {690; CHECK-LABEL: three_pointer_iv_v4i8:691; CHECK:       @ %bb.0: @ %vector.ph692; CHECK-NEXT:    .save {r4, lr}693; CHECK-NEXT:    push {r4, lr}694; CHECK-NEXT:    .vsave {d8, d9, d10, d11}695; CHECK-NEXT:    vpush {d8, d9, d10, d11}696; CHECK-NEXT:    adr.w r12, .LCPI11_0697; CHECK-NEXT:    adr.w lr, .LCPI11_1698; CHECK-NEXT:    adr r4, .LCPI11_2699; CHECK-NEXT:    vldrw.u32 q1, [lr]700; CHECK-NEXT:    vldrw.u32 q0, [r4]701; CHECK-NEXT:    vldrw.u32 q2, [r12]702; CHECK-NEXT:    movs r3, #10703; CHECK-NEXT:  .LBB11_1: @ %vector.body704; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1705; CHECK-NEXT:    vldrb.u32 q3, [r0, q0]706; CHECK-NEXT:    vldrb.u32 q4, [r0, q1]707; CHECK-NEXT:    vldrb.u32 q5, [r0, q2]708; CHECK-NEXT:    adds r0, #12709; CHECK-NEXT:    vmul.i32 q3, q4, q3710; CHECK-NEXT:    subs r2, #4711; CHECK-NEXT:    vmul.i32 q5, q4, q5712; CHECK-NEXT:    vmul.i32 q4, q4, r3713; CHECK-NEXT:    vstrb.32 q4, [r1, q1]714; CHECK-NEXT:    vstrb.32 q5, [r1, q2]715; CHECK-NEXT:    vstrb.32 q3, [r1, q0]716; CHECK-NEXT:    add.w r1, r1, #12717; CHECK-NEXT:    bne .LBB11_1718; CHECK-NEXT:  @ %bb.2: @ %end719; CHECK-NEXT:    vpop {d8, d9, d10, d11}720; CHECK-NEXT:    pop {r4, pc}721; CHECK-NEXT:    .p2align 4722; CHECK-NEXT:  @ %bb.3:723; CHECK-NEXT:  .LCPI11_0:724; CHECK-NEXT:    .long 1 @ 0x1725; CHECK-NEXT:    .long 4 @ 0x4726; CHECK-NEXT:    .long 7 @ 0x7727; CHECK-NEXT:    .long 10 @ 0xa728; CHECK-NEXT:  .LCPI11_1:729; CHECK-NEXT:    .long 0 @ 0x0730; CHECK-NEXT:    .long 3 @ 0x3731; CHECK-NEXT:    .long 6 @ 0x6732; CHECK-NEXT:    .long 9 @ 0x9733; CHECK-NEXT:  .LCPI11_2:734; CHECK-NEXT:    .long 2 @ 0x2735; CHECK-NEXT:    .long 5 @ 0x5736; CHECK-NEXT:    .long 8 @ 0x8737; CHECK-NEXT:    .long 11 @ 0xb738vector.ph:739  br label %vector.body740 741vector.body:                                      ; preds = %vector.body, %vector.ph742  %pointer.phi = phi ptr [ %x, %vector.ph ], [ %v3, %vector.body ]743  %pointer.phi55 = phi ptr [ %z, %vector.ph ], [ %v4, %vector.body ]744  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]745  %vector.gep = getelementptr i8, ptr %pointer.phi, <4 x i32> <i32 0, i32 3, i32 6, i32 9>746  %v3 = getelementptr i8, ptr %pointer.phi, i32 12747  %vector.gep56 = getelementptr i8, ptr %pointer.phi55, <4 x i32> <i32 0, i32 3, i32 6, i32 9>748  %v4 = getelementptr i8, ptr %pointer.phi55, i32 12749  %v5 = add i32 %index, 0750  %v6 = getelementptr inbounds i8, <4 x ptr> %vector.gep, i32 1751  %wide.masked.gather = call <4 x i8> @llvm.masked.gather.v4i8.v4p0(<4 x ptr> %vector.gep, i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i8> undef)752  %v7 = getelementptr inbounds i8, <4 x ptr> %vector.gep, i32 2753  %wide.masked.gather57 = call <4 x i8> @llvm.masked.gather.v4i8.v4p0(<4 x ptr> %v6, i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i8> undef)754  %wide.masked.gather58 = call <4 x i8> @llvm.masked.gather.v4i8.v4p0(<4 x ptr> %v7, i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i8> undef)755  %v8 = zext <4 x i8> %wide.masked.gather to <4 x i32>756  %v9 = zext <4 x i8> %wide.masked.gather57 to <4 x i32>757  %v10 = zext <4 x i8> %wide.masked.gather58 to <4 x i32>758  %v11 = mul nuw nsw <4 x i32> %v8, <i32 10, i32 10, i32 10, i32 10>759  %v12 = trunc <4 x i32> %v11 to <4 x i8>760  %v13 = mul nuw nsw <4 x i32> %v8, %v9761  %v14 = trunc <4 x i32> %v13 to <4 x i8>762  %v15 = mul nuw nsw <4 x i32> %v8, %v10763  %v16 = trunc <4 x i32> %v15 to <4 x i8>764  %v17 = getelementptr inbounds i8, <4 x ptr> %vector.gep56, i32 1765  call void @llvm.masked.scatter.v4i8.v4p0(<4 x i8> %v12, <4 x ptr> %vector.gep56, i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)766  %v18 = getelementptr inbounds i8, <4 x ptr> %vector.gep56, i32 2767  call void @llvm.masked.scatter.v4i8.v4p0(<4 x i8> %v14, <4 x ptr> %v17, i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)768  call void @llvm.masked.scatter.v4i8.v4p0(<4 x i8> %v16, <4 x ptr> %v18, i32 1, <4 x i1> <i1 true, i1 true, i1 true, i1 true>)769  %index.next = add i32 %index, 4770  %v37 = icmp eq i32 %index.next, %n771  br i1 %v37, label %end, label %vector.body772 773end:774  ret void;775}776 777define arm_aapcs_vfpcc void @three_pointer_iv_v8i16(ptr nocapture readonly %x, ptr nocapture %z, i32 %n) {778; CHECK-LABEL: three_pointer_iv_v8i16:779; CHECK:       @ %bb.0: @ %vector.ph780; CHECK-NEXT:    .save {r4, lr}781; CHECK-NEXT:    push {r4, lr}782; CHECK-NEXT:    .vsave {d8, d9, d10, d11}783; CHECK-NEXT:    vpush {d8, d9, d10, d11}784; CHECK-NEXT:    adr.w r12, .LCPI12_0785; CHECK-NEXT:    adr.w lr, .LCPI12_1786; CHECK-NEXT:    adr r4, .LCPI12_2787; CHECK-NEXT:    vldrw.u32 q1, [lr]788; CHECK-NEXT:    vldrw.u32 q0, [r4]789; CHECK-NEXT:    vldrw.u32 q2, [r12]790; CHECK-NEXT:    movs r3, #10791; CHECK-NEXT:  .LBB12_1: @ %vector.body792; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1793; CHECK-NEXT:    vldrh.u16 q3, [r0, q0]794; CHECK-NEXT:    vldrh.u16 q4, [r0, q1, uxtw #1]795; CHECK-NEXT:    vldrh.u16 q5, [r0, q2]796; CHECK-NEXT:    adds r0, #48797; CHECK-NEXT:    vmul.i16 q3, q4, q3798; CHECK-NEXT:    subs r2, #4799; CHECK-NEXT:    vmul.i16 q5, q4, q5800; CHECK-NEXT:    vmul.i16 q4, q4, r3801; CHECK-NEXT:    vstrh.16 q4, [r1, q1, uxtw #1]802; CHECK-NEXT:    vstrh.16 q5, [r1, q2]803; CHECK-NEXT:    vstrh.16 q3, [r1, q0]804; CHECK-NEXT:    add.w r1, r1, #48805; CHECK-NEXT:    bne .LBB12_1806; CHECK-NEXT:  @ %bb.2: @ %end807; CHECK-NEXT:    vpop {d8, d9, d10, d11}808; CHECK-NEXT:    pop {r4, pc}809; CHECK-NEXT:    .p2align 4810; CHECK-NEXT:  @ %bb.3:811; CHECK-NEXT:  .LCPI12_0:812; CHECK-NEXT:    .short 2 @ 0x2813; CHECK-NEXT:    .short 8 @ 0x8814; CHECK-NEXT:    .short 14 @ 0xe815; CHECK-NEXT:    .short 20 @ 0x14816; CHECK-NEXT:    .short 26 @ 0x1a817; CHECK-NEXT:    .short 32 @ 0x20818; CHECK-NEXT:    .short 38 @ 0x26819; CHECK-NEXT:    .short 44 @ 0x2c820; CHECK-NEXT:  .LCPI12_1:821; CHECK-NEXT:    .short 0 @ 0x0822; CHECK-NEXT:    .short 3 @ 0x3823; CHECK-NEXT:    .short 6 @ 0x6824; CHECK-NEXT:    .short 9 @ 0x9825; CHECK-NEXT:    .short 12 @ 0xc826; CHECK-NEXT:    .short 15 @ 0xf827; CHECK-NEXT:    .short 18 @ 0x12828; CHECK-NEXT:    .short 21 @ 0x15829; CHECK-NEXT:  .LCPI12_2:830; CHECK-NEXT:    .short 4 @ 0x4831; CHECK-NEXT:    .short 10 @ 0xa832; CHECK-NEXT:    .short 16 @ 0x10833; CHECK-NEXT:    .short 22 @ 0x16834; CHECK-NEXT:    .short 28 @ 0x1c835; CHECK-NEXT:    .short 34 @ 0x22836; CHECK-NEXT:    .short 40 @ 0x28837; CHECK-NEXT:    .short 46 @ 0x2e838vector.ph:839  br label %vector.body840 841vector.body:842  %pointer.phi = phi ptr [ %x, %vector.ph ], [ %v3, %vector.body ]843  %pointer.phi55 = phi ptr [ %z, %vector.ph ], [ %v4, %vector.body ]844  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]845  %vector.gep = getelementptr i16, ptr %pointer.phi, <8 x i16> <i16 0, i16 3, i16 6, i16 9, i16 12, i16 15, i16 18, i16 21>846  %v3 = getelementptr i16, ptr %pointer.phi, i32 24847  %vector.gep56 = getelementptr i16, ptr %pointer.phi55, <8 x i16> <i16 0, i16 3, i16 6, i16 9, i16 12, i16 15, i16 18, i16 21>848  %v4 = getelementptr i16, ptr %pointer.phi55, i32 24849  %v5 = add i32 %index, 0850  %v6 = getelementptr inbounds i16, <8 x ptr> %vector.gep, i16 1851  %wide.masked.gather = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %vector.gep, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)852  %v7 = getelementptr inbounds i16, <8 x ptr> %vector.gep, i16 2853  %wide.masked.gather57 = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %v6, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)854  %wide.masked.gather58 = call <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr> %v7, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> undef)855  %v11 = mul nuw nsw <8 x i16> %wide.masked.gather, <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10>856  %v13 = mul nuw nsw <8 x i16> %wide.masked.gather, %wide.masked.gather57857  %v15 = mul nuw nsw <8 x i16> %wide.masked.gather, %wide.masked.gather58858  %v17 = getelementptr inbounds i16, <8 x ptr> %vector.gep56, i32 1859  call void @llvm.masked.scatter.v8i16.v8p0(<8 x i16> %v11, <8 x ptr> %vector.gep56, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)860  %v18 = getelementptr inbounds i16, <8 x ptr> %vector.gep56, i32 2861  call void @llvm.masked.scatter.v8i16.v8p0(<8 x i16> %v13, <8 x ptr> %v17, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)862  call void @llvm.masked.scatter.v8i16.v8p0(<8 x i16> %v15, <8 x ptr> %v18, i32 2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)863  %index.next = add i32 %index, 4864  %v37 = icmp eq i32 %index.next, %n865  br i1 %v37, label %end, label %vector.body866 867end:868  ret void;869}870 871define arm_aapcs_vfpcc void @three_pointer_iv_v16i8(ptr nocapture readonly %x, ptr nocapture %z, i32 %n) {872; CHECK-LABEL: three_pointer_iv_v16i8:873; CHECK:       @ %bb.0: @ %vector.ph874; CHECK-NEXT:    .save {r4, lr}875; CHECK-NEXT:    push {r4, lr}876; CHECK-NEXT:    .vsave {d8, d9, d10, d11}877; CHECK-NEXT:    vpush {d8, d9, d10, d11}878; CHECK-NEXT:    adr.w r12, .LCPI13_0879; CHECK-NEXT:    adr.w lr, .LCPI13_1880; CHECK-NEXT:    adr r4, .LCPI13_2881; CHECK-NEXT:    vldrw.u32 q1, [lr]882; CHECK-NEXT:    vldrw.u32 q0, [r4]883; CHECK-NEXT:    vldrw.u32 q2, [r12]884; CHECK-NEXT:    movs r3, #10885; CHECK-NEXT:  .LBB13_1: @ %vector.body886; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1887; CHECK-NEXT:    vldrb.u8 q3, [r0, q0]888; CHECK-NEXT:    vldrb.u8 q4, [r0, q1]889; CHECK-NEXT:    vldrb.u8 q5, [r0, q2]890; CHECK-NEXT:    adds r0, #48891; CHECK-NEXT:    vmul.i8 q3, q4, q3892; CHECK-NEXT:    subs r2, #4893; CHECK-NEXT:    vmul.i8 q5, q4, q5894; CHECK-NEXT:    vmul.i8 q4, q4, r3895; CHECK-NEXT:    vstrb.8 q4, [r1, q1]896; CHECK-NEXT:    vstrb.8 q5, [r1, q2]897; CHECK-NEXT:    vstrb.8 q3, [r1, q0]898; CHECK-NEXT:    add.w r1, r1, #48899; CHECK-NEXT:    bne .LBB13_1900; CHECK-NEXT:  @ %bb.2: @ %end901; CHECK-NEXT:    vpop {d8, d9, d10, d11}902; CHECK-NEXT:    pop {r4, pc}903; CHECK-NEXT:    .p2align 4904; CHECK-NEXT:  @ %bb.3:905; CHECK-NEXT:  .LCPI13_0:906; CHECK-NEXT:    .byte 1 @ 0x1907; CHECK-NEXT:    .byte 4 @ 0x4908; CHECK-NEXT:    .byte 7 @ 0x7909; CHECK-NEXT:    .byte 10 @ 0xa910; CHECK-NEXT:    .byte 13 @ 0xd911; CHECK-NEXT:    .byte 16 @ 0x10912; CHECK-NEXT:    .byte 19 @ 0x13913; CHECK-NEXT:    .byte 22 @ 0x16914; CHECK-NEXT:    .byte 25 @ 0x19915; CHECK-NEXT:    .byte 28 @ 0x1c916; CHECK-NEXT:    .byte 31 @ 0x1f917; CHECK-NEXT:    .byte 34 @ 0x22918; CHECK-NEXT:    .byte 37 @ 0x25919; CHECK-NEXT:    .byte 40 @ 0x28920; CHECK-NEXT:    .byte 43 @ 0x2b921; CHECK-NEXT:    .byte 46 @ 0x2e922; CHECK-NEXT:  .LCPI13_1:923; CHECK-NEXT:    .byte 0 @ 0x0924; CHECK-NEXT:    .byte 3 @ 0x3925; CHECK-NEXT:    .byte 6 @ 0x6926; CHECK-NEXT:    .byte 9 @ 0x9927; CHECK-NEXT:    .byte 12 @ 0xc928; CHECK-NEXT:    .byte 15 @ 0xf929; CHECK-NEXT:    .byte 18 @ 0x12930; CHECK-NEXT:    .byte 21 @ 0x15931; CHECK-NEXT:    .byte 24 @ 0x18932; CHECK-NEXT:    .byte 27 @ 0x1b933; CHECK-NEXT:    .byte 30 @ 0x1e934; CHECK-NEXT:    .byte 33 @ 0x21935; CHECK-NEXT:    .byte 36 @ 0x24936; CHECK-NEXT:    .byte 39 @ 0x27937; CHECK-NEXT:    .byte 42 @ 0x2a938; CHECK-NEXT:    .byte 45 @ 0x2d939; CHECK-NEXT:  .LCPI13_2:940; CHECK-NEXT:    .byte 2 @ 0x2941; CHECK-NEXT:    .byte 5 @ 0x5942; CHECK-NEXT:    .byte 8 @ 0x8943; CHECK-NEXT:    .byte 11 @ 0xb944; CHECK-NEXT:    .byte 14 @ 0xe945; CHECK-NEXT:    .byte 17 @ 0x11946; CHECK-NEXT:    .byte 20 @ 0x14947; CHECK-NEXT:    .byte 23 @ 0x17948; CHECK-NEXT:    .byte 26 @ 0x1a949; CHECK-NEXT:    .byte 29 @ 0x1d950; CHECK-NEXT:    .byte 32 @ 0x20951; CHECK-NEXT:    .byte 35 @ 0x23952; CHECK-NEXT:    .byte 38 @ 0x26953; CHECK-NEXT:    .byte 41 @ 0x29954; CHECK-NEXT:    .byte 44 @ 0x2c955; CHECK-NEXT:    .byte 47 @ 0x2f956vector.ph:957  br label %vector.body958 959vector.body:960  %pointer.phi = phi ptr [ %x, %vector.ph ], [ %v3, %vector.body ]961  %pointer.phi55 = phi ptr [ %z, %vector.ph ], [ %v4, %vector.body ]962  %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]963  %vector.gep = getelementptr i8, ptr %pointer.phi, <16 x i8> <i8 0, i8 3, i8 6, i8 9, i8 12, i8 15, i8 18, i8 21, i8 24, i8 27, i8 30, i8 33, i8 36, i8 39, i8 42, i8 45>964  %v3 = getelementptr i8, ptr %pointer.phi, i32 48965  %vector.gep56 = getelementptr i8, ptr %pointer.phi55, <16 x i8> <i8 0, i8 3, i8 6, i8 9, i8 12, i8 15, i8 18, i8 21, i8 24, i8 27, i8 30, i8 33, i8 36, i8 39, i8 42, i8 45>966  %v4 = getelementptr i8, ptr %pointer.phi55, i32 48967  %v5 = add i32 %index, 0968  %v6 = getelementptr inbounds i8, <16 x ptr> %vector.gep, i8 1969  %wide.masked.gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %vector.gep, i32 1, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)970  %v7 = getelementptr inbounds i8, <16 x ptr> %vector.gep, i8 2971  %wide.masked.gather57 = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %v6, i32 1, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)972  %wide.masked.gather58 = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %v7, i32 1, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)973  %v11 = mul nuw nsw <16 x i8> %wide.masked.gather, <i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10>974  %v13 = mul nuw nsw <16 x i8> %wide.masked.gather, %wide.masked.gather57975  %v15 = mul nuw nsw <16 x i8> %wide.masked.gather, %wide.masked.gather58976  %v17 = getelementptr inbounds i8, <16 x ptr> %vector.gep56, i32 1977  call void @llvm.masked.scatter.v16i8.v16p0(<16 x i8> %v11, <16 x ptr> %vector.gep56, i32 1, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)978  %v18 = getelementptr inbounds i8, <16 x ptr> %vector.gep56, i32 2979  call void @llvm.masked.scatter.v16i8.v16p0(<16 x i8> %v13, <16 x ptr> %v17, i32 1, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)980  call void @llvm.masked.scatter.v16i8.v16p0(<16 x i8> %v15, <16 x ptr> %v18, i32 1, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>)981  %index.next = add i32 %index, 4982  %v37 = icmp eq i32 %index.next, %n983  br i1 %v37, label %end, label %vector.body984 985end:986  ret void;987}988 989declare <4 x i8> @llvm.masked.gather.v4i8.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i8>)990declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i32>)991declare <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x float>)992declare <8 x i16> @llvm.masked.gather.v8i16.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x i16>)993declare <8 x half> @llvm.masked.gather.v8f16.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x half>)994declare <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x i8>)995 996declare void @llvm.masked.scatter.v4i8.v4p0(<4 x i8>, <4 x ptr>, i32, <4 x i1>)997declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>, <4 x ptr>, i32, <4 x i1>)998declare void @llvm.masked.scatter.v4f32.v4p0(<4 x float>, <4 x ptr>, i32, <4 x i1>)999declare void @llvm.masked.scatter.v8i16.v8p0(<8 x i16>, <8 x ptr>, i32, <8 x i1>)1000declare void @llvm.masked.scatter.v8f16.v8p0(<8 x half>, <8 x ptr>, i32, <8 x i1>)1001declare void @llvm.masked.scatter.v16i8.v16p0(<16 x i8>, <16 x ptr>, i32, <16 x i1>)1002