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