206 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 %s -o - | FileCheck %s3 4define dso_local i32 @test_500_504(ptr nocapture readonly %x) {5; CHECK-LABEL: test_500_504:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: .save {r7, lr}8; CHECK-NEXT: push {r7, lr}9; CHECK-NEXT: mov.w lr, #12610; CHECK-NEXT: adr r1, .LCPI0_011; CHECK-NEXT: vldrw.u32 q0, [r1]12; CHECK-NEXT: mov.w r1, #50013; CHECK-NEXT: mov.w r12, #014; CHECK-NEXT: vdup.32 q1, r115; CHECK-NEXT: movs r2, #016; CHECK-NEXT: .LBB0_1: @ %vector.body17; CHECK-NEXT: @ =>This Inner Loop Header: Depth=118; CHECK-NEXT: vqadd.u32 q2, q0, r219; CHECK-NEXT: adds r2, #420; CHECK-NEXT: vptt.u32 hi, q1, q221; CHECK-NEXT: vldrwt.u32 q2, [r0], #1622; CHECK-NEXT: vaddvat.u32 r12, q223; CHECK-NEXT: le lr, .LBB0_124; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup25; CHECK-NEXT: mov r0, r1226; CHECK-NEXT: pop {r7, pc}27; CHECK-NEXT: .p2align 428; CHECK-NEXT: @ %bb.3:29; CHECK-NEXT: .LCPI0_0:30; CHECK-NEXT: .long 0 @ 0x031; CHECK-NEXT: .long 1 @ 0x132; CHECK-NEXT: .long 2 @ 0x233; CHECK-NEXT: .long 3 @ 0x334entry:35 br label %vector.body36 37vector.body: ; preds = %vector.body, %entry38 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]39 %vec.phi = phi i32 [ 0, %entry ], [ %4, %vector.body ]40 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 500)41 %0 = getelementptr inbounds i32, ptr %x, i32 %index42 %1 = bitcast ptr %0 to ptr43 %wide.masked.load = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)44 %2 = select <4 x i1> %active.lane.mask, <4 x i32> %wide.masked.load, <4 x i32> zeroinitializer45 %3 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %2)46 %4 = add i32 %3, %vec.phi47 %index.next = add i32 %index, 448 %5 = icmp eq i32 %index.next, 50449 br i1 %5, label %for.cond.cleanup, label %vector.body50 51for.cond.cleanup: ; preds = %vector.body52 ret i32 %453}54 55define dso_local i32 @test_501_504(ptr nocapture readonly %x) {56; CHECK-LABEL: test_501_504:57; CHECK: @ %bb.0: @ %entry58; CHECK-NEXT: .save {r7, lr}59; CHECK-NEXT: push {r7, lr}60; CHECK-NEXT: movw r1, #50161; CHECK-NEXT: movs r2, #062; CHECK-NEXT: dlstp.32 lr, r163; CHECK-NEXT: .LBB1_1: @ %vector.body64; CHECK-NEXT: @ =>This Inner Loop Header: Depth=165; CHECK-NEXT: vldrw.u32 q0, [r0], #1666; CHECK-NEXT: vaddva.u32 r2, q067; CHECK-NEXT: letp lr, .LBB1_168; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup69; CHECK-NEXT: mov r0, r270; CHECK-NEXT: pop {r7, pc}71entry:72 br label %vector.body73 74vector.body: ; preds = %vector.body, %entry75 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]76 %vec.phi = phi i32 [ 0, %entry ], [ %4, %vector.body ]77 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 501)78 %0 = getelementptr inbounds i32, ptr %x, i32 %index79 %1 = bitcast ptr %0 to ptr80 %wide.masked.load = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)81 %2 = select <4 x i1> %active.lane.mask, <4 x i32> %wide.masked.load, <4 x i32> zeroinitializer82 %3 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %2)83 %4 = add i32 %3, %vec.phi84 %index.next = add i32 %index, 485 %5 = icmp eq i32 %index.next, 50486 br i1 %5, label %for.cond.cleanup, label %vector.body87 88for.cond.cleanup: ; preds = %vector.body89 ret i32 %490}91 92define dso_local i32 @test_502_504(ptr nocapture readonly %x) {93; CHECK-LABEL: test_502_504:94; CHECK: @ %bb.0: @ %entry95; CHECK-NEXT: .save {r7, lr}96; CHECK-NEXT: push {r7, lr}97; CHECK-NEXT: mov.w r1, #50298; CHECK-NEXT: movs r2, #099; CHECK-NEXT: dlstp.32 lr, r1100; CHECK-NEXT: .LBB2_1: @ %vector.body101; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1102; CHECK-NEXT: vldrw.u32 q0, [r0], #16103; CHECK-NEXT: vaddva.u32 r2, q0104; CHECK-NEXT: letp lr, .LBB2_1105; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup106; CHECK-NEXT: mov r0, r2107; CHECK-NEXT: pop {r7, pc}108entry:109 br label %vector.body110 111vector.body: ; preds = %vector.body, %entry112 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]113 %vec.phi = phi i32 [ 0, %entry ], [ %4, %vector.body ]114 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 502)115 %0 = getelementptr inbounds i32, ptr %x, i32 %index116 %1 = bitcast ptr %0 to ptr117 %wide.masked.load = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)118 %2 = select <4 x i1> %active.lane.mask, <4 x i32> %wide.masked.load, <4 x i32> zeroinitializer119 %3 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %2)120 %4 = add i32 %3, %vec.phi121 %index.next = add i32 %index, 4122 %5 = icmp eq i32 %index.next, 504123 br i1 %5, label %for.cond.cleanup, label %vector.body124 125for.cond.cleanup: ; preds = %vector.body126 ret i32 %4127}128 129define dso_local i32 @test_503_504(ptr nocapture readonly %x) {130; CHECK-LABEL: test_503_504:131; CHECK: @ %bb.0: @ %entry132; CHECK-NEXT: .save {r7, lr}133; CHECK-NEXT: push {r7, lr}134; CHECK-NEXT: movw r1, #503135; CHECK-NEXT: movs r2, #0136; CHECK-NEXT: dlstp.32 lr, r1137; CHECK-NEXT: .LBB3_1: @ %vector.body138; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1139; CHECK-NEXT: vldrw.u32 q0, [r0], #16140; CHECK-NEXT: vaddva.u32 r2, q0141; CHECK-NEXT: letp lr, .LBB3_1142; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup143; CHECK-NEXT: mov r0, r2144; CHECK-NEXT: pop {r7, pc}145entry:146 br label %vector.body147 148vector.body: ; preds = %vector.body, %entry149 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]150 %vec.phi = phi i32 [ 0, %entry ], [ %4, %vector.body ]151 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 503)152 %0 = getelementptr inbounds i32, ptr %x, i32 %index153 %1 = bitcast ptr %0 to ptr154 %wide.masked.load = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)155 %2 = select <4 x i1> %active.lane.mask, <4 x i32> %wide.masked.load, <4 x i32> zeroinitializer156 %3 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %2)157 %4 = add i32 %3, %vec.phi158 %index.next = add i32 %index, 4159 %5 = icmp eq i32 %index.next, 504160 br i1 %5, label %for.cond.cleanup, label %vector.body161 162for.cond.cleanup: ; preds = %vector.body163 ret i32 %4164}165 166define dso_local i32 @test_504_504(ptr nocapture readonly %x) {167; CHECK-LABEL: test_504_504:168; CHECK: @ %bb.0: @ %entry169; CHECK-NEXT: .save {r7, lr}170; CHECK-NEXT: push {r7, lr}171; CHECK-NEXT: mov.w r1, #504172; CHECK-NEXT: movs r2, #0173; CHECK-NEXT: dlstp.32 lr, r1174; CHECK-NEXT: .LBB4_1: @ %vector.body175; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1176; CHECK-NEXT: vldrw.u32 q0, [r0], #16177; CHECK-NEXT: vaddva.u32 r2, q0178; CHECK-NEXT: letp lr, .LBB4_1179; CHECK-NEXT: @ %bb.2: @ %for.cond.cleanup180; CHECK-NEXT: mov r0, r2181; CHECK-NEXT: pop {r7, pc}182entry:183 br label %vector.body184 185vector.body: ; preds = %vector.body, %entry186 %index = phi i32 [ 0, %entry ], [ %index.next, %vector.body ]187 %vec.phi = phi i32 [ 0, %entry ], [ %4, %vector.body ]188 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 504)189 %0 = getelementptr inbounds i32, ptr %x, i32 %index190 %1 = bitcast ptr %0 to ptr191 %wide.masked.load = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %1, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)192 %2 = select <4 x i1> %active.lane.mask, <4 x i32> %wide.masked.load, <4 x i32> zeroinitializer193 %3 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %2)194 %4 = add i32 %3, %vec.phi195 %index.next = add i32 %index, 4196 %5 = icmp eq i32 %index.next, 504197 br i1 %5, label %for.cond.cleanup, label %vector.body198 199for.cond.cleanup: ; preds = %vector.body200 ret i32 %4201}202 203declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32, i32)204declare <4 x i32> @llvm.masked.load.v4i32.p0(ptr, i32 immarg, <4 x i1>, <4 x i32>)205declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>)206