2475 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 -tail-predication=enabled -verify-machineinstrs %s -o - | FileCheck %s3 4define i32 @add_i32(ptr nocapture readonly %x, i32 %n) {5; CHECK-LABEL: add_i32:6; CHECK: @ %bb.0: @ %entry7; CHECK-NEXT: .save {r7, lr}8; CHECK-NEXT: push {r7, lr}9; CHECK-NEXT: cmp r1, #110; CHECK-NEXT: blt .LBB0_311; CHECK-NEXT: @ %bb.1: @ %for.body.preheader12; CHECK-NEXT: mov r12, r013; CHECK-NEXT: cmp r1, #414; CHECK-NEXT: bhs .LBB0_415; CHECK-NEXT: @ %bb.2:16; CHECK-NEXT: movs r3, #017; CHECK-NEXT: movs r0, #018; CHECK-NEXT: b .LBB0_719; CHECK-NEXT: .LBB0_3:20; CHECK-NEXT: movs r0, #021; CHECK-NEXT: pop {r7, pc}22; CHECK-NEXT: .LBB0_4: @ %vector.ph23; CHECK-NEXT: bic r3, r1, #324; CHECK-NEXT: movs r2, #125; CHECK-NEXT: subs r0, r3, #426; CHECK-NEXT: add.w lr, r2, r0, lsr #227; CHECK-NEXT: movs r0, #028; CHECK-NEXT: mov r2, r1229; CHECK-NEXT: .LBB0_5: @ %vector.body30; CHECK-NEXT: @ =>This Inner Loop Header: Depth=131; CHECK-NEXT: vldrw.u32 q0, [r2], #1632; CHECK-NEXT: vaddva.u32 r0, q033; CHECK-NEXT: le lr, .LBB0_534; CHECK-NEXT: @ %bb.6: @ %middle.block35; CHECK-NEXT: cmp r3, r136; CHECK-NEXT: it eq37; CHECK-NEXT: popeq {r7, pc}38; CHECK-NEXT: .LBB0_7: @ %for.body.preheader139; CHECK-NEXT: sub.w lr, r1, r340; CHECK-NEXT: add.w r2, r12, r3, lsl #241; CHECK-NEXT: .LBB0_8: @ %for.body42; CHECK-NEXT: @ =>This Inner Loop Header: Depth=143; CHECK-NEXT: ldr r1, [r2], #444; CHECK-NEXT: add r0, r145; CHECK-NEXT: le lr, .LBB0_846; CHECK-NEXT: @ %bb.9: @ %for.cond.cleanup47; CHECK-NEXT: pop {r7, pc}48entry:49 %cmp6 = icmp sgt i32 %n, 050 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup51 52for.body.preheader: ; preds = %entry53 %min.iters.check = icmp ult i32 %n, 454 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph55 56vector.ph: ; preds = %for.body.preheader57 %n.vec = and i32 %n, -458 br label %vector.body59 60vector.body: ; preds = %vector.body, %vector.ph61 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]62 %vec.phi = phi i32 [ 0, %vector.ph ], [ %3, %vector.body ]63 %0 = getelementptr inbounds i32, ptr %x, i32 %index64 %1 = bitcast ptr %0 to ptr65 %wide.load = load <4 x i32>, ptr %1, align 466 %2 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %wide.load)67 %3 = add i32 %2, %vec.phi68 %index.next = add i32 %index, 469 %4 = icmp eq i32 %index.next, %n.vec70 br i1 %4, label %middle.block, label %vector.body71 72middle.block: ; preds = %vector.body73 %cmp.n = icmp eq i32 %n.vec, %n74 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader175 76for.body.preheader1: ; preds = %middle.block, %for.body.preheader77 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]78 %r.07.ph = phi i32 [ 0, %for.body.preheader ], [ %3, %middle.block ]79 br label %for.body80 81for.body: ; preds = %for.body.preheader1, %for.body82 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]83 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]84 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.0885 %5 = load i32, ptr %arrayidx, align 486 %add = add nsw i32 %5, %r.0787 %inc = add nuw nsw i32 %i.08, 188 %exitcond = icmp eq i32 %inc, %n89 br i1 %exitcond, label %for.cond.cleanup, label %for.body90 91for.cond.cleanup: ; preds = %for.body, %middle.block, %entry92 %r.0.lcssa = phi i32 [ 0, %entry ], [ %3, %middle.block ], [ %add, %for.body ]93 ret i32 %r.0.lcssa94}95 96define i32 @mul_i32(ptr nocapture readonly %x, i32 %n) {97; CHECK-LABEL: mul_i32:98; CHECK: @ %bb.0: @ %entry99; CHECK-NEXT: .save {r4, lr}100; CHECK-NEXT: push {r4, lr}101; CHECK-NEXT: movs r2, #1102; CHECK-NEXT: cmp r1, #1103; CHECK-NEXT: blt .LBB1_8104; CHECK-NEXT: @ %bb.1: @ %for.body.preheader105; CHECK-NEXT: cmp r1, #4106; CHECK-NEXT: bhs .LBB1_3107; CHECK-NEXT: @ %bb.2:108; CHECK-NEXT: mov.w r12, #0109; CHECK-NEXT: b .LBB1_6110; CHECK-NEXT: .LBB1_3: @ %vector.ph111; CHECK-NEXT: bic r12, r1, #3112; CHECK-NEXT: vmov.i32 q0, #0x1113; CHECK-NEXT: sub.w r3, r12, #4114; CHECK-NEXT: add.w lr, r2, r3, lsr #2115; CHECK-NEXT: mov r2, r0116; CHECK-NEXT: .LBB1_4: @ %vector.body117; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1118; CHECK-NEXT: vldrw.u32 q1, [r2], #16119; CHECK-NEXT: vmul.i32 q0, q1, q0120; CHECK-NEXT: le lr, .LBB1_4121; CHECK-NEXT: @ %bb.5: @ %middle.block122; CHECK-NEXT: vmov lr, r3, d1123; CHECK-NEXT: cmp r12, r1124; CHECK-NEXT: vmov r2, r4, d0125; CHECK-NEXT: mul r3, lr, r3126; CHECK-NEXT: mul r2, r4, r2127; CHECK-NEXT: mul r2, r3, r2128; CHECK-NEXT: beq .LBB1_8129; CHECK-NEXT: .LBB1_6: @ %for.body.preheader1130; CHECK-NEXT: sub.w lr, r1, r12131; CHECK-NEXT: add.w r0, r0, r12, lsl #2132; CHECK-NEXT: .LBB1_7: @ %for.body133; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1134; CHECK-NEXT: ldr r1, [r0], #4135; CHECK-NEXT: muls r2, r1, r2136; CHECK-NEXT: le lr, .LBB1_7137; CHECK-NEXT: .LBB1_8: @ %for.cond.cleanup138; CHECK-NEXT: mov r0, r2139; CHECK-NEXT: pop {r4, pc}140entry:141 %cmp6 = icmp sgt i32 %n, 0142 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup143 144for.body.preheader: ; preds = %entry145 %min.iters.check = icmp ult i32 %n, 4146 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph147 148vector.ph: ; preds = %for.body.preheader149 %n.vec = and i32 %n, -4150 br label %vector.body151 152vector.body: ; preds = %vector.body, %vector.ph153 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]154 %vec.phi = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %vector.ph ], [ %2, %vector.body ]155 %0 = getelementptr inbounds i32, ptr %x, i32 %index156 %1 = bitcast ptr %0 to ptr157 %wide.load = load <4 x i32>, ptr %1, align 4158 %2 = mul <4 x i32> %wide.load, %vec.phi159 %index.next = add i32 %index, 4160 %3 = icmp eq i32 %index.next, %n.vec161 br i1 %3, label %middle.block, label %vector.body162 163middle.block: ; preds = %vector.body164 %4 = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %2)165 %cmp.n = icmp eq i32 %n.vec, %n166 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1167 168for.body.preheader1: ; preds = %middle.block, %for.body.preheader169 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]170 %r.07.ph = phi i32 [ 1, %for.body.preheader ], [ %4, %middle.block ]171 br label %for.body172 173for.body: ; preds = %for.body.preheader1, %for.body174 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]175 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]176 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.08177 %5 = load i32, ptr %arrayidx, align 4178 %add = mul nsw i32 %5, %r.07179 %inc = add nuw nsw i32 %i.08, 1180 %exitcond = icmp eq i32 %inc, %n181 br i1 %exitcond, label %for.cond.cleanup, label %for.body182 183for.cond.cleanup: ; preds = %for.body, %middle.block, %entry184 %r.0.lcssa = phi i32 [ 1, %entry ], [ %4, %middle.block ], [ %add, %for.body ]185 ret i32 %r.0.lcssa186}187 188define i32 @and_i32(ptr nocapture readonly %x, i32 %n) {189; CHECK-LABEL: and_i32:190; CHECK: @ %bb.0: @ %entry191; CHECK-NEXT: .save {r4, lr}192; CHECK-NEXT: push {r4, lr}193; CHECK-NEXT: cmp r1, #1194; CHECK-NEXT: blt .LBB2_3195; CHECK-NEXT: @ %bb.1: @ %for.body.preheader196; CHECK-NEXT: cmp r1, #4197; CHECK-NEXT: bhs .LBB2_4198; CHECK-NEXT: @ %bb.2:199; CHECK-NEXT: mov.w r2, #-1200; CHECK-NEXT: movs r3, #0201; CHECK-NEXT: b .LBB2_7202; CHECK-NEXT: .LBB2_3:203; CHECK-NEXT: mov.w r2, #-1204; CHECK-NEXT: mov r0, r2205; CHECK-NEXT: pop {r4, pc}206; CHECK-NEXT: .LBB2_4: @ %vector.ph207; CHECK-NEXT: bic r3, r1, #3208; CHECK-NEXT: movs r2, #1209; CHECK-NEXT: sub.w r12, r3, #4210; CHECK-NEXT: vmov.i8 q0, #0xff211; CHECK-NEXT: add.w lr, r2, r12, lsr #2212; CHECK-NEXT: mov r2, r0213; CHECK-NEXT: .LBB2_5: @ %vector.body214; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1215; CHECK-NEXT: vldrw.u32 q1, [r2], #16216; CHECK-NEXT: vand q0, q1, q0217; CHECK-NEXT: le lr, .LBB2_5218; CHECK-NEXT: @ %bb.6: @ %middle.block219; CHECK-NEXT: vmov lr, r12, d1220; CHECK-NEXT: cmp r3, r1221; CHECK-NEXT: vmov r2, r4, d0222; CHECK-NEXT: and.w r12, r12, lr223; CHECK-NEXT: and.w r2, r2, r4224; CHECK-NEXT: and.w r2, r2, r12225; CHECK-NEXT: beq .LBB2_9226; CHECK-NEXT: .LBB2_7: @ %for.body.preheader1227; CHECK-NEXT: sub.w lr, r1, r3228; CHECK-NEXT: add.w r0, r0, r3, lsl #2229; CHECK-NEXT: .LBB2_8: @ %for.body230; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1231; CHECK-NEXT: ldr r1, [r0], #4232; CHECK-NEXT: ands r2, r1233; CHECK-NEXT: le lr, .LBB2_8234; CHECK-NEXT: .LBB2_9: @ %for.cond.cleanup235; CHECK-NEXT: mov r0, r2236; CHECK-NEXT: pop {r4, pc}237entry:238 %cmp6 = icmp sgt i32 %n, 0239 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup240 241for.body.preheader: ; preds = %entry242 %min.iters.check = icmp ult i32 %n, 4243 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph244 245vector.ph: ; preds = %for.body.preheader246 %n.vec = and i32 %n, -4247 br label %vector.body248 249vector.body: ; preds = %vector.body, %vector.ph250 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]251 %vec.phi = phi <4 x i32> [ <i32 -1, i32 -1, i32 -1, i32 -1>, %vector.ph ], [ %2, %vector.body ]252 %0 = getelementptr inbounds i32, ptr %x, i32 %index253 %1 = bitcast ptr %0 to ptr254 %wide.load = load <4 x i32>, ptr %1, align 4255 %2 = and <4 x i32> %wide.load, %vec.phi256 %index.next = add i32 %index, 4257 %3 = icmp eq i32 %index.next, %n.vec258 br i1 %3, label %middle.block, label %vector.body259 260middle.block: ; preds = %vector.body261 %4 = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %2)262 %cmp.n = icmp eq i32 %n.vec, %n263 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1264 265for.body.preheader1: ; preds = %middle.block, %for.body.preheader266 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]267 %r.07.ph = phi i32 [ -1, %for.body.preheader ], [ %4, %middle.block ]268 br label %for.body269 270for.body: ; preds = %for.body.preheader1, %for.body271 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]272 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]273 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.08274 %5 = load i32, ptr %arrayidx, align 4275 %add = and i32 %5, %r.07276 %inc = add nuw nsw i32 %i.08, 1277 %exitcond = icmp eq i32 %inc, %n278 br i1 %exitcond, label %for.cond.cleanup, label %for.body279 280for.cond.cleanup: ; preds = %for.body, %middle.block, %entry281 %r.0.lcssa = phi i32 [ -1, %entry ], [ %4, %middle.block ], [ %add, %for.body ]282 ret i32 %r.0.lcssa283}284 285define i32 @or_i32(ptr nocapture readonly %x, i32 %n) {286; CHECK-LABEL: or_i32:287; CHECK: @ %bb.0: @ %entry288; CHECK-NEXT: .save {r4, lr}289; CHECK-NEXT: push {r4, lr}290; CHECK-NEXT: cmp r1, #1291; CHECK-NEXT: blt .LBB3_3292; CHECK-NEXT: @ %bb.1: @ %for.body.preheader293; CHECK-NEXT: cmp r1, #4294; CHECK-NEXT: bhs .LBB3_4295; CHECK-NEXT: @ %bb.2:296; CHECK-NEXT: movs r3, #0297; CHECK-NEXT: movs r2, #0298; CHECK-NEXT: b .LBB3_7299; CHECK-NEXT: .LBB3_3:300; CHECK-NEXT: movs r2, #0301; CHECK-NEXT: mov r0, r2302; CHECK-NEXT: pop {r4, pc}303; CHECK-NEXT: .LBB3_4: @ %vector.ph304; CHECK-NEXT: bic r3, r1, #3305; CHECK-NEXT: movs r2, #1306; CHECK-NEXT: sub.w r12, r3, #4307; CHECK-NEXT: vmov.i32 q0, #0x0308; CHECK-NEXT: add.w lr, r2, r12, lsr #2309; CHECK-NEXT: mov r2, r0310; CHECK-NEXT: .LBB3_5: @ %vector.body311; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1312; CHECK-NEXT: vldrw.u32 q1, [r2], #16313; CHECK-NEXT: vorr q0, q1, q0314; CHECK-NEXT: le lr, .LBB3_5315; CHECK-NEXT: @ %bb.6: @ %middle.block316; CHECK-NEXT: vmov lr, r12, d1317; CHECK-NEXT: cmp r3, r1318; CHECK-NEXT: vmov r2, r4, d0319; CHECK-NEXT: orr.w r12, r12, lr320; CHECK-NEXT: orr.w r2, r2, r4321; CHECK-NEXT: orr.w r2, r2, r12322; CHECK-NEXT: beq .LBB3_9323; CHECK-NEXT: .LBB3_7: @ %for.body.preheader1324; CHECK-NEXT: sub.w lr, r1, r3325; CHECK-NEXT: add.w r0, r0, r3, lsl #2326; CHECK-NEXT: .LBB3_8: @ %for.body327; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1328; CHECK-NEXT: ldr r1, [r0], #4329; CHECK-NEXT: orrs r2, r1330; CHECK-NEXT: le lr, .LBB3_8331; CHECK-NEXT: .LBB3_9: @ %for.cond.cleanup332; CHECK-NEXT: mov r0, r2333; CHECK-NEXT: pop {r4, pc}334entry:335 %cmp6 = icmp sgt i32 %n, 0336 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup337 338for.body.preheader: ; preds = %entry339 %min.iters.check = icmp ult i32 %n, 4340 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph341 342vector.ph: ; preds = %for.body.preheader343 %n.vec = and i32 %n, -4344 br label %vector.body345 346vector.body: ; preds = %vector.body, %vector.ph347 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]348 %vec.phi = phi <4 x i32> [ zeroinitializer, %vector.ph ], [ %2, %vector.body ]349 %0 = getelementptr inbounds i32, ptr %x, i32 %index350 %1 = bitcast ptr %0 to ptr351 %wide.load = load <4 x i32>, ptr %1, align 4352 %2 = or <4 x i32> %wide.load, %vec.phi353 %index.next = add i32 %index, 4354 %3 = icmp eq i32 %index.next, %n.vec355 br i1 %3, label %middle.block, label %vector.body356 357middle.block: ; preds = %vector.body358 %4 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %2)359 %cmp.n = icmp eq i32 %n.vec, %n360 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1361 362for.body.preheader1: ; preds = %middle.block, %for.body.preheader363 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]364 %r.07.ph = phi i32 [ 0, %for.body.preheader ], [ %4, %middle.block ]365 br label %for.body366 367for.body: ; preds = %for.body.preheader1, %for.body368 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]369 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]370 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.08371 %5 = load i32, ptr %arrayidx, align 4372 %add = or i32 %5, %r.07373 %inc = add nuw nsw i32 %i.08, 1374 %exitcond = icmp eq i32 %inc, %n375 br i1 %exitcond, label %for.cond.cleanup, label %for.body376 377for.cond.cleanup: ; preds = %for.body, %middle.block, %entry378 %r.0.lcssa = phi i32 [ 0, %entry ], [ %4, %middle.block ], [ %add, %for.body ]379 ret i32 %r.0.lcssa380}381 382define i32 @xor_i32(ptr nocapture readonly %x, i32 %n) {383; CHECK-LABEL: xor_i32:384; CHECK: @ %bb.0: @ %entry385; CHECK-NEXT: .save {r4, lr}386; CHECK-NEXT: push {r4, lr}387; CHECK-NEXT: cmp r1, #1388; CHECK-NEXT: blt .LBB4_3389; CHECK-NEXT: @ %bb.1: @ %for.body.preheader390; CHECK-NEXT: cmp r1, #4391; CHECK-NEXT: bhs .LBB4_4392; CHECK-NEXT: @ %bb.2:393; CHECK-NEXT: movs r3, #0394; CHECK-NEXT: movs r2, #0395; CHECK-NEXT: b .LBB4_7396; CHECK-NEXT: .LBB4_3:397; CHECK-NEXT: movs r2, #0398; CHECK-NEXT: mov r0, r2399; CHECK-NEXT: pop {r4, pc}400; CHECK-NEXT: .LBB4_4: @ %vector.ph401; CHECK-NEXT: bic r3, r1, #3402; CHECK-NEXT: movs r2, #1403; CHECK-NEXT: sub.w r12, r3, #4404; CHECK-NEXT: vmov.i32 q0, #0x0405; CHECK-NEXT: add.w lr, r2, r12, lsr #2406; CHECK-NEXT: mov r2, r0407; CHECK-NEXT: .LBB4_5: @ %vector.body408; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1409; CHECK-NEXT: vldrw.u32 q1, [r2], #16410; CHECK-NEXT: veor q0, q1, q0411; CHECK-NEXT: le lr, .LBB4_5412; CHECK-NEXT: @ %bb.6: @ %middle.block413; CHECK-NEXT: vmov lr, r12, d1414; CHECK-NEXT: cmp r3, r1415; CHECK-NEXT: vmov r2, r4, d0416; CHECK-NEXT: eor.w r12, r12, lr417; CHECK-NEXT: eor.w r2, r2, r4418; CHECK-NEXT: eor.w r2, r2, r12419; CHECK-NEXT: beq .LBB4_9420; CHECK-NEXT: .LBB4_7: @ %for.body.preheader1421; CHECK-NEXT: sub.w lr, r1, r3422; CHECK-NEXT: add.w r0, r0, r3, lsl #2423; CHECK-NEXT: .LBB4_8: @ %for.body424; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1425; CHECK-NEXT: ldr r1, [r0], #4426; CHECK-NEXT: eors r2, r1427; CHECK-NEXT: le lr, .LBB4_8428; CHECK-NEXT: .LBB4_9: @ %for.cond.cleanup429; CHECK-NEXT: mov r0, r2430; CHECK-NEXT: pop {r4, pc}431entry:432 %cmp6 = icmp sgt i32 %n, 0433 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup434 435for.body.preheader: ; preds = %entry436 %min.iters.check = icmp ult i32 %n, 4437 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph438 439vector.ph: ; preds = %for.body.preheader440 %n.vec = and i32 %n, -4441 br label %vector.body442 443vector.body: ; preds = %vector.body, %vector.ph444 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]445 %vec.phi = phi <4 x i32> [ zeroinitializer, %vector.ph ], [ %2, %vector.body ]446 %0 = getelementptr inbounds i32, ptr %x, i32 %index447 %1 = bitcast ptr %0 to ptr448 %wide.load = load <4 x i32>, ptr %1, align 4449 %2 = xor <4 x i32> %wide.load, %vec.phi450 %index.next = add i32 %index, 4451 %3 = icmp eq i32 %index.next, %n.vec452 br i1 %3, label %middle.block, label %vector.body453 454middle.block: ; preds = %vector.body455 %4 = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %2)456 %cmp.n = icmp eq i32 %n.vec, %n457 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1458 459for.body.preheader1: ; preds = %middle.block, %for.body.preheader460 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]461 %r.07.ph = phi i32 [ 0, %for.body.preheader ], [ %4, %middle.block ]462 br label %for.body463 464for.body: ; preds = %for.body.preheader1, %for.body465 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]466 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]467 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.08468 %5 = load i32, ptr %arrayidx, align 4469 %add = xor i32 %5, %r.07470 %inc = add nuw nsw i32 %i.08, 1471 %exitcond = icmp eq i32 %inc, %n472 br i1 %exitcond, label %for.cond.cleanup, label %for.body473 474for.cond.cleanup: ; preds = %for.body, %middle.block, %entry475 %r.0.lcssa = phi i32 [ 0, %entry ], [ %4, %middle.block ], [ %add, %for.body ]476 ret i32 %r.0.lcssa477}478 479define float @fadd_f32(ptr nocapture readonly %x, i32 %n) {480; CHECK-LABEL: fadd_f32:481; CHECK: @ %bb.0: @ %entry482; CHECK-NEXT: .save {r7, lr}483; CHECK-NEXT: push {r7, lr}484; CHECK-NEXT: cmp r1, #1485; CHECK-NEXT: blt .LBB5_3486; CHECK-NEXT: @ %bb.1: @ %for.body.preheader487; CHECK-NEXT: cmp r1, #4488; CHECK-NEXT: bhs .LBB5_4489; CHECK-NEXT: @ %bb.2:490; CHECK-NEXT: vldr s0, .LCPI5_0491; CHECK-NEXT: movs r2, #0492; CHECK-NEXT: b .LBB5_7493; CHECK-NEXT: .LBB5_3:494; CHECK-NEXT: vldr s0, .LCPI5_0495; CHECK-NEXT: vmov r0, s0496; CHECK-NEXT: pop {r7, pc}497; CHECK-NEXT: .LBB5_4: @ %vector.ph498; CHECK-NEXT: bic r2, r1, #3499; CHECK-NEXT: movs r3, #1500; CHECK-NEXT: sub.w r12, r2, #4501; CHECK-NEXT: vmov.i32 q0, #0x0502; CHECK-NEXT: add.w lr, r3, r12, lsr #2503; CHECK-NEXT: mov r3, r0504; CHECK-NEXT: .LBB5_5: @ %vector.body505; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1506; CHECK-NEXT: vldrw.u32 q1, [r3], #16507; CHECK-NEXT: vadd.f32 q0, q1, q0508; CHECK-NEXT: le lr, .LBB5_5509; CHECK-NEXT: @ %bb.6: @ %middle.block510; CHECK-NEXT: vadd.f32 s2, s2, s3511; CHECK-NEXT: cmp r2, r1512; CHECK-NEXT: vadd.f32 s0, s0, s1513; CHECK-NEXT: vadd.f32 s0, s0, s2514; CHECK-NEXT: beq .LBB5_9515; CHECK-NEXT: .LBB5_7: @ %for.body.preheader1516; CHECK-NEXT: sub.w lr, r1, r2517; CHECK-NEXT: add.w r0, r0, r2, lsl #2518; CHECK-NEXT: .LBB5_8: @ %for.body519; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1520; CHECK-NEXT: vldmia r0!, {s2}521; CHECK-NEXT: vadd.f32 s0, s2, s0522; CHECK-NEXT: le lr, .LBB5_8523; CHECK-NEXT: .LBB5_9: @ %for.cond.cleanup524; CHECK-NEXT: vmov r0, s0525; CHECK-NEXT: pop {r7, pc}526; CHECK-NEXT: .p2align 2527; CHECK-NEXT: @ %bb.10:528; CHECK-NEXT: .LCPI5_0:529; CHECK-NEXT: .long 0x00000000 @ float 0530entry:531 %cmp6 = icmp sgt i32 %n, 0532 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup533 534for.body.preheader: ; preds = %entry535 %min.iters.check = icmp ult i32 %n, 4536 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph537 538vector.ph: ; preds = %for.body.preheader539 %n.vec = and i32 %n, -4540 br label %vector.body541 542vector.body: ; preds = %vector.body, %vector.ph543 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]544 %vec.phi = phi <4 x float> [ zeroinitializer, %vector.ph ], [ %2, %vector.body ]545 %0 = getelementptr inbounds float, ptr %x, i32 %index546 %1 = bitcast ptr %0 to ptr547 %wide.load = load <4 x float>, ptr %1, align 4548 %2 = fadd fast <4 x float> %wide.load, %vec.phi549 %index.next = add i32 %index, 4550 %3 = icmp eq i32 %index.next, %n.vec551 br i1 %3, label %middle.block, label %vector.body552 553middle.block: ; preds = %vector.body554 %4 = call fast float @llvm.vector.reduce.fadd.f32.v4f32(float 0.000000e+00, <4 x float> %2)555 %cmp.n = icmp eq i32 %n.vec, %n556 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1557 558for.body.preheader1: ; preds = %middle.block, %for.body.preheader559 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]560 %r.07.ph = phi float [ 0.000000e+00, %for.body.preheader ], [ %4, %middle.block ]561 br label %for.body562 563for.body: ; preds = %for.body.preheader1, %for.body564 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]565 %r.07 = phi float [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]566 %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.08567 %5 = load float, ptr %arrayidx, align 4568 %add = fadd fast float %5, %r.07569 %inc = add nuw nsw i32 %i.08, 1570 %exitcond = icmp eq i32 %inc, %n571 br i1 %exitcond, label %for.cond.cleanup, label %for.body572 573for.cond.cleanup: ; preds = %for.body, %middle.block, %entry574 %r.0.lcssa = phi float [ 0.000000e+00, %entry ], [ %4, %middle.block ], [ %add, %for.body ]575 ret float %r.0.lcssa576}577 578define float @fmul_f32(ptr nocapture readonly %x, i32 %n) {579; CHECK-LABEL: fmul_f32:580; CHECK: @ %bb.0: @ %entry581; CHECK-NEXT: .save {r7, lr}582; CHECK-NEXT: push {r7, lr}583; CHECK-NEXT: cmp r1, #1584; CHECK-NEXT: blt .LBB6_3585; CHECK-NEXT: @ %bb.1: @ %for.body.preheader586; CHECK-NEXT: cmp r1, #4587; CHECK-NEXT: bhs .LBB6_4588; CHECK-NEXT: @ %bb.2:589; CHECK-NEXT: vmov.f32 s0, #1.000000e+00590; CHECK-NEXT: movs r2, #0591; CHECK-NEXT: b .LBB6_7592; CHECK-NEXT: .LBB6_3:593; CHECK-NEXT: vmov.f32 s0, #1.000000e+00594; CHECK-NEXT: vmov r0, s0595; CHECK-NEXT: pop {r7, pc}596; CHECK-NEXT: .LBB6_4: @ %vector.ph597; CHECK-NEXT: bic r2, r1, #3598; CHECK-NEXT: movs r3, #1599; CHECK-NEXT: sub.w r12, r2, #4600; CHECK-NEXT: vmov.f32 q0, #1.000000e+00601; CHECK-NEXT: add.w lr, r3, r12, lsr #2602; CHECK-NEXT: mov r3, r0603; CHECK-NEXT: .LBB6_5: @ %vector.body604; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1605; CHECK-NEXT: vldrw.u32 q1, [r3], #16606; CHECK-NEXT: vmul.f32 q0, q1, q0607; CHECK-NEXT: le lr, .LBB6_5608; CHECK-NEXT: @ %bb.6: @ %middle.block609; CHECK-NEXT: vmul.f32 s2, s2, s3610; CHECK-NEXT: cmp r2, r1611; CHECK-NEXT: vmul.f32 s0, s0, s1612; CHECK-NEXT: vmul.f32 s0, s0, s2613; CHECK-NEXT: beq .LBB6_9614; CHECK-NEXT: .LBB6_7: @ %for.body.preheader1615; CHECK-NEXT: sub.w lr, r1, r2616; CHECK-NEXT: add.w r0, r0, r2, lsl #2617; CHECK-NEXT: .LBB6_8: @ %for.body618; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1619; CHECK-NEXT: vldmia r0!, {s2}620; CHECK-NEXT: vmul.f32 s0, s2, s0621; CHECK-NEXT: le lr, .LBB6_8622; CHECK-NEXT: .LBB6_9: @ %for.cond.cleanup623; CHECK-NEXT: vmov r0, s0624; CHECK-NEXT: pop {r7, pc}625entry:626 %cmp6 = icmp sgt i32 %n, 0627 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup628 629for.body.preheader: ; preds = %entry630 %min.iters.check = icmp ult i32 %n, 4631 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph632 633vector.ph: ; preds = %for.body.preheader634 %n.vec = and i32 %n, -4635 br label %vector.body636 637vector.body: ; preds = %vector.body, %vector.ph638 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]639 %vec.phi = phi <4 x float> [ <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, %vector.ph ], [ %2, %vector.body ]640 %0 = getelementptr inbounds float, ptr %x, i32 %index641 %1 = bitcast ptr %0 to ptr642 %wide.load = load <4 x float>, ptr %1, align 4643 %2 = fmul fast <4 x float> %wide.load, %vec.phi644 %index.next = add i32 %index, 4645 %3 = icmp eq i32 %index.next, %n.vec646 br i1 %3, label %middle.block, label %vector.body647 648middle.block: ; preds = %vector.body649 %4 = call fast float @llvm.vector.reduce.fmul.f32.v4f32(float 1.000000e+00, <4 x float> %2)650 %cmp.n = icmp eq i32 %n.vec, %n651 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1652 653for.body.preheader1: ; preds = %middle.block, %for.body.preheader654 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]655 %r.07.ph = phi float [ 1.000000e+00, %for.body.preheader ], [ %4, %middle.block ]656 br label %for.body657 658for.body: ; preds = %for.body.preheader1, %for.body659 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]660 %r.07 = phi float [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]661 %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.08662 %5 = load float, ptr %arrayidx, align 4663 %add = fmul fast float %5, %r.07664 %inc = add nuw nsw i32 %i.08, 1665 %exitcond = icmp eq i32 %inc, %n666 br i1 %exitcond, label %for.cond.cleanup, label %for.body667 668for.cond.cleanup: ; preds = %for.body, %middle.block, %entry669 %r.0.lcssa = phi float [ 1.000000e+00, %entry ], [ %4, %middle.block ], [ %add, %for.body ]670 ret float %r.0.lcssa671}672 673define i32 @smin_i32(ptr nocapture readonly %x, i32 %n) {674; CHECK-LABEL: smin_i32:675; CHECK: @ %bb.0: @ %entry676; CHECK-NEXT: .save {r7, lr}677; CHECK-NEXT: push {r7, lr}678; CHECK-NEXT: cmp r1, #1679; CHECK-NEXT: blt .LBB7_3680; CHECK-NEXT: @ %bb.1: @ %for.body.preheader681; CHECK-NEXT: cmp r1, #4682; CHECK-NEXT: bhs .LBB7_4683; CHECK-NEXT: @ %bb.2:684; CHECK-NEXT: mvn r2, #-2147483648685; CHECK-NEXT: movs r3, #0686; CHECK-NEXT: b .LBB7_7687; CHECK-NEXT: .LBB7_3:688; CHECK-NEXT: mvn r2, #-2147483648689; CHECK-NEXT: mov r0, r2690; CHECK-NEXT: pop {r7, pc}691; CHECK-NEXT: .LBB7_4: @ %vector.ph692; CHECK-NEXT: bic r3, r1, #3693; CHECK-NEXT: movs r2, #1694; CHECK-NEXT: sub.w r12, r3, #4695; CHECK-NEXT: vmvn.i32 q0, #0x80000000696; CHECK-NEXT: add.w lr, r2, r12, lsr #2697; CHECK-NEXT: mov r2, r0698; CHECK-NEXT: .LBB7_5: @ %vector.body699; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1700; CHECK-NEXT: vldrw.u32 q1, [r2], #16701; CHECK-NEXT: vmin.s32 q0, q0, q1702; CHECK-NEXT: le lr, .LBB7_5703; CHECK-NEXT: @ %bb.6: @ %middle.block704; CHECK-NEXT: mvn r2, #-2147483648705; CHECK-NEXT: cmp r3, r1706; CHECK-NEXT: vminv.s32 r2, q0707; CHECK-NEXT: beq .LBB7_9708; CHECK-NEXT: .LBB7_7: @ %for.body.preheader1709; CHECK-NEXT: sub.w lr, r1, r3710; CHECK-NEXT: add.w r0, r0, r3, lsl #2711; CHECK-NEXT: .LBB7_8: @ %for.body712; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1713; CHECK-NEXT: ldr r1, [r0], #4714; CHECK-NEXT: cmp r2, r1715; CHECK-NEXT: csel r2, r2, r1, lt716; CHECK-NEXT: le lr, .LBB7_8717; CHECK-NEXT: .LBB7_9: @ %for.cond.cleanup718; CHECK-NEXT: mov r0, r2719; CHECK-NEXT: pop {r7, pc}720entry:721 %cmp6 = icmp sgt i32 %n, 0722 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup723 724for.body.preheader: ; preds = %entry725 %min.iters.check = icmp ult i32 %n, 4726 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph727 728vector.ph: ; preds = %for.body.preheader729 %n.vec = and i32 %n, -4730 br label %vector.body731 732vector.body: ; preds = %vector.body, %vector.ph733 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]734 %vec.phi = phi <4 x i32> [ <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647>, %vector.ph ], [ %3, %vector.body ]735 %0 = getelementptr inbounds i32, ptr %x, i32 %index736 %1 = bitcast ptr %0 to ptr737 %wide.load = load <4 x i32>, ptr %1, align 4738 %2 = icmp slt <4 x i32> %vec.phi, %wide.load739 %3 = select <4 x i1> %2, <4 x i32> %vec.phi, <4 x i32> %wide.load740 %index.next = add i32 %index, 4741 %4 = icmp eq i32 %index.next, %n.vec742 br i1 %4, label %middle.block, label %vector.body743 744middle.block: ; preds = %vector.body745 %5 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %3)746 %cmp.n = icmp eq i32 %n.vec, %n747 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1748 749for.body.preheader1: ; preds = %middle.block, %for.body.preheader750 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]751 %r.07.ph = phi i32 [ 2147483647, %for.body.preheader ], [ %5, %middle.block ]752 br label %for.body753 754for.body: ; preds = %for.body.preheader1, %for.body755 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]756 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]757 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.08758 %6 = load i32, ptr %arrayidx, align 4759 %c = icmp slt i32 %r.07, %6760 %add = select i1 %c, i32 %r.07, i32 %6761 %inc = add nuw nsw i32 %i.08, 1762 %exitcond = icmp eq i32 %inc, %n763 br i1 %exitcond, label %for.cond.cleanup, label %for.body764 765for.cond.cleanup: ; preds = %for.body, %middle.block, %entry766 %r.0.lcssa = phi i32 [ 2147483647, %entry ], [ %5, %middle.block ], [ %add, %for.body ]767 ret i32 %r.0.lcssa768}769 770define i32 @smin_i32_inloop(ptr nocapture readonly %x, i32 %n) {771; CHECK-LABEL: smin_i32_inloop:772; CHECK: @ %bb.0: @ %entry773; CHECK-NEXT: .save {r7, lr}774; CHECK-NEXT: push {r7, lr}775; CHECK-NEXT: cmp r1, #1776; CHECK-NEXT: blt .LBB8_3777; CHECK-NEXT: @ %bb.1: @ %for.body.preheader778; CHECK-NEXT: mov r12, r0779; CHECK-NEXT: cmp r1, #4780; CHECK-NEXT: bhs .LBB8_4781; CHECK-NEXT: @ %bb.2:782; CHECK-NEXT: mvn r0, #-2147483648783; CHECK-NEXT: movs r3, #0784; CHECK-NEXT: b .LBB8_7785; CHECK-NEXT: .LBB8_3:786; CHECK-NEXT: mvn r0, #-2147483648787; CHECK-NEXT: pop {r7, pc}788; CHECK-NEXT: .LBB8_4: @ %vector.ph789; CHECK-NEXT: bic r3, r1, #3790; CHECK-NEXT: movs r2, #1791; CHECK-NEXT: subs r0, r3, #4792; CHECK-NEXT: add.w lr, r2, r0, lsr #2793; CHECK-NEXT: mvn r0, #-2147483648794; CHECK-NEXT: mov r2, r12795; CHECK-NEXT: .LBB8_5: @ %vector.body796; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1797; CHECK-NEXT: vldrw.u32 q0, [r2], #16798; CHECK-NEXT: vminv.s32 r0, q0799; CHECK-NEXT: le lr, .LBB8_5800; CHECK-NEXT: @ %bb.6: @ %middle.block801; CHECK-NEXT: cmp r3, r1802; CHECK-NEXT: it eq803; CHECK-NEXT: popeq {r7, pc}804; CHECK-NEXT: .LBB8_7: @ %for.body.preheader1805; CHECK-NEXT: sub.w lr, r1, r3806; CHECK-NEXT: add.w r2, r12, r3, lsl #2807; CHECK-NEXT: .LBB8_8: @ %for.body808; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1809; CHECK-NEXT: ldr r1, [r2], #4810; CHECK-NEXT: cmp r0, r1811; CHECK-NEXT: csel r0, r0, r1, lt812; CHECK-NEXT: le lr, .LBB8_8813; CHECK-NEXT: @ %bb.9: @ %for.cond.cleanup814; CHECK-NEXT: pop {r7, pc}815entry:816 %cmp6 = icmp sgt i32 %n, 0817 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup818 819for.body.preheader: ; preds = %entry820 %min.iters.check = icmp ult i32 %n, 4821 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph822 823vector.ph: ; preds = %for.body.preheader824 %n.vec = and i32 %n, -4825 br label %vector.body826 827vector.body: ; preds = %vector.body, %vector.ph828 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]829 %vec.phi = phi i32 [ 2147483647, %vector.ph ], [ %3, %vector.body ]830 %0 = getelementptr inbounds i32, ptr %x, i32 %index831 %1 = bitcast ptr %0 to ptr832 %wide.load = load <4 x i32>, ptr %1, align 4833 %l5 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %wide.load)834 %2 = icmp slt i32 %vec.phi, %l5835 %3 = select i1 %2, i32 %vec.phi, i32 %l5836 %index.next = add i32 %index, 4837 %4 = icmp eq i32 %index.next, %n.vec838 br i1 %4, label %middle.block, label %vector.body839 840middle.block: ; preds = %vector.body841 %5 = phi i32 [ %3, %vector.body ]842 %cmp.n = icmp eq i32 %n.vec, %n843 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1844 845for.body.preheader1: ; preds = %middle.block, %for.body.preheader846 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]847 %r.07.ph = phi i32 [ 2147483647, %for.body.preheader ], [ %5, %middle.block ]848 br label %for.body849 850for.body: ; preds = %for.body.preheader1, %for.body851 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]852 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]853 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.08854 %6 = load i32, ptr %arrayidx, align 4855 %c = icmp slt i32 %r.07, %6856 %add = select i1 %c, i32 %r.07, i32 %6857 %inc = add nuw nsw i32 %i.08, 1858 %exitcond = icmp eq i32 %inc, %n859 br i1 %exitcond, label %for.cond.cleanup, label %for.body860 861for.cond.cleanup: ; preds = %for.body, %middle.block, %entry862 %r.0.lcssa = phi i32 [ 2147483647, %entry ], [ %5, %middle.block ], [ %add, %for.body ]863 ret i32 %r.0.lcssa864}865 866define i32 @smax_i32(ptr nocapture readonly %x, i32 %n) {867; CHECK-LABEL: smax_i32:868; CHECK: @ %bb.0: @ %entry869; CHECK-NEXT: .save {r7, lr}870; CHECK-NEXT: push {r7, lr}871; CHECK-NEXT: cmp r1, #1872; CHECK-NEXT: blt .LBB9_3873; CHECK-NEXT: @ %bb.1: @ %for.body.preheader874; CHECK-NEXT: cmp r1, #4875; CHECK-NEXT: bhs .LBB9_4876; CHECK-NEXT: @ %bb.2:877; CHECK-NEXT: mov.w r2, #-2147483648878; CHECK-NEXT: movs r3, #0879; CHECK-NEXT: b .LBB9_7880; CHECK-NEXT: .LBB9_3:881; CHECK-NEXT: mov.w r2, #-2147483648882; CHECK-NEXT: mov r0, r2883; CHECK-NEXT: pop {r7, pc}884; CHECK-NEXT: .LBB9_4: @ %vector.ph885; CHECK-NEXT: bic r3, r1, #3886; CHECK-NEXT: movs r2, #1887; CHECK-NEXT: sub.w r12, r3, #4888; CHECK-NEXT: vmov.i32 q0, #0x80000000889; CHECK-NEXT: add.w lr, r2, r12, lsr #2890; CHECK-NEXT: mov r2, r0891; CHECK-NEXT: .LBB9_5: @ %vector.body892; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1893; CHECK-NEXT: vldrw.u32 q1, [r2], #16894; CHECK-NEXT: vmax.s32 q0, q0, q1895; CHECK-NEXT: le lr, .LBB9_5896; CHECK-NEXT: @ %bb.6: @ %middle.block897; CHECK-NEXT: mov.w r2, #-2147483648898; CHECK-NEXT: cmp r3, r1899; CHECK-NEXT: vmaxv.s32 r2, q0900; CHECK-NEXT: beq .LBB9_9901; CHECK-NEXT: .LBB9_7: @ %for.body.preheader1902; CHECK-NEXT: sub.w lr, r1, r3903; CHECK-NEXT: add.w r0, r0, r3, lsl #2904; CHECK-NEXT: .LBB9_8: @ %for.body905; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1906; CHECK-NEXT: ldr r1, [r0], #4907; CHECK-NEXT: cmp r2, r1908; CHECK-NEXT: csel r2, r2, r1, gt909; CHECK-NEXT: le lr, .LBB9_8910; CHECK-NEXT: .LBB9_9: @ %for.cond.cleanup911; CHECK-NEXT: mov r0, r2912; CHECK-NEXT: pop {r7, pc}913entry:914 %cmp6 = icmp sgt i32 %n, 0915 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup916 917for.body.preheader: ; preds = %entry918 %min.iters.check = icmp ult i32 %n, 4919 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph920 921vector.ph: ; preds = %for.body.preheader922 %n.vec = and i32 %n, -4923 br label %vector.body924 925vector.body: ; preds = %vector.body, %vector.ph926 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]927 %vec.phi = phi <4 x i32> [ <i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 -2147483648>, %vector.ph ], [ %3, %vector.body ]928 %0 = getelementptr inbounds i32, ptr %x, i32 %index929 %1 = bitcast ptr %0 to ptr930 %wide.load = load <4 x i32>, ptr %1, align 4931 %2 = icmp sgt <4 x i32> %vec.phi, %wide.load932 %3 = select <4 x i1> %2, <4 x i32> %vec.phi, <4 x i32> %wide.load933 %index.next = add i32 %index, 4934 %4 = icmp eq i32 %index.next, %n.vec935 br i1 %4, label %middle.block, label %vector.body936 937middle.block: ; preds = %vector.body938 %5 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %3)939 %cmp.n = icmp eq i32 %n.vec, %n940 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1941 942for.body.preheader1: ; preds = %middle.block, %for.body.preheader943 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]944 %r.07.ph = phi i32 [ -2147483648, %for.body.preheader ], [ %5, %middle.block ]945 br label %for.body946 947for.body: ; preds = %for.body.preheader1, %for.body948 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]949 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]950 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.08951 %6 = load i32, ptr %arrayidx, align 4952 %c = icmp sgt i32 %r.07, %6953 %add = select i1 %c, i32 %r.07, i32 %6954 %inc = add nuw nsw i32 %i.08, 1955 %exitcond = icmp eq i32 %inc, %n956 br i1 %exitcond, label %for.cond.cleanup, label %for.body957 958for.cond.cleanup: ; preds = %for.body, %middle.block, %entry959 %r.0.lcssa = phi i32 [ -2147483648, %entry ], [ %5, %middle.block ], [ %add, %for.body ]960 ret i32 %r.0.lcssa961}962 963define i32 @smax_i32_inloop(ptr nocapture readonly %x, i32 %n) {964; CHECK-LABEL: smax_i32_inloop:965; CHECK: @ %bb.0: @ %entry966; CHECK-NEXT: .save {r7, lr}967; CHECK-NEXT: push {r7, lr}968; CHECK-NEXT: cmp r1, #1969; CHECK-NEXT: blt .LBB10_3970; CHECK-NEXT: @ %bb.1: @ %for.body.preheader971; CHECK-NEXT: mov r12, r0972; CHECK-NEXT: cmp r1, #4973; CHECK-NEXT: bhs .LBB10_4974; CHECK-NEXT: @ %bb.2:975; CHECK-NEXT: mov.w r0, #-2147483648976; CHECK-NEXT: movs r3, #0977; CHECK-NEXT: b .LBB10_7978; CHECK-NEXT: .LBB10_3:979; CHECK-NEXT: mov.w r0, #-2147483648980; CHECK-NEXT: pop {r7, pc}981; CHECK-NEXT: .LBB10_4: @ %vector.ph982; CHECK-NEXT: bic r3, r1, #3983; CHECK-NEXT: movs r2, #1984; CHECK-NEXT: subs r0, r3, #4985; CHECK-NEXT: add.w lr, r2, r0, lsr #2986; CHECK-NEXT: mov.w r0, #-2147483648987; CHECK-NEXT: mov r2, r12988; CHECK-NEXT: .LBB10_5: @ %vector.body989; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1990; CHECK-NEXT: vldrw.u32 q0, [r2], #16991; CHECK-NEXT: vmaxv.s32 r0, q0992; CHECK-NEXT: le lr, .LBB10_5993; CHECK-NEXT: @ %bb.6: @ %middle.block994; CHECK-NEXT: cmp r3, r1995; CHECK-NEXT: it eq996; CHECK-NEXT: popeq {r7, pc}997; CHECK-NEXT: .LBB10_7: @ %for.body.preheader1998; CHECK-NEXT: sub.w lr, r1, r3999; CHECK-NEXT: add.w r2, r12, r3, lsl #21000; CHECK-NEXT: .LBB10_8: @ %for.body1001; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11002; CHECK-NEXT: ldr r1, [r2], #41003; CHECK-NEXT: cmp r0, r11004; CHECK-NEXT: csel r0, r0, r1, gt1005; CHECK-NEXT: le lr, .LBB10_81006; CHECK-NEXT: @ %bb.9: @ %for.cond.cleanup1007; CHECK-NEXT: pop {r7, pc}1008entry:1009 %cmp6 = icmp sgt i32 %n, 01010 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup1011 1012for.body.preheader: ; preds = %entry1013 %min.iters.check = icmp ult i32 %n, 41014 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph1015 1016vector.ph: ; preds = %for.body.preheader1017 %n.vec = and i32 %n, -41018 br label %vector.body1019 1020vector.body: ; preds = %vector.body, %vector.ph1021 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1022 %vec.phi = phi i32 [ -2147483648, %vector.ph ], [ %3, %vector.body ]1023 %0 = getelementptr inbounds i32, ptr %x, i32 %index1024 %1 = bitcast ptr %0 to ptr1025 %wide.load = load <4 x i32>, ptr %1, align 41026 %l5 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %wide.load)1027 %2 = icmp sgt i32 %vec.phi, %l51028 %3 = select i1 %2, i32 %vec.phi, i32 %l51029 %index.next = add i32 %index, 41030 %4 = icmp eq i32 %index.next, %n.vec1031 br i1 %4, label %middle.block, label %vector.body1032 1033middle.block: ; preds = %vector.body1034 %5 = phi i32 [ %3, %vector.body ]1035 %cmp.n = icmp eq i32 %n.vec, %n1036 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader11037 1038for.body.preheader1: ; preds = %middle.block, %for.body.preheader1039 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1040 %r.07.ph = phi i32 [ -2147483648, %for.body.preheader ], [ %5, %middle.block ]1041 br label %for.body1042 1043for.body: ; preds = %for.body.preheader1, %for.body1044 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]1045 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]1046 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.081047 %6 = load i32, ptr %arrayidx, align 41048 %c = icmp sgt i32 %r.07, %61049 %add = select i1 %c, i32 %r.07, i32 %61050 %inc = add nuw nsw i32 %i.08, 11051 %exitcond = icmp eq i32 %inc, %n1052 br i1 %exitcond, label %for.cond.cleanup, label %for.body1053 1054for.cond.cleanup: ; preds = %for.body, %middle.block, %entry1055 %r.0.lcssa = phi i32 [ -2147483648, %entry ], [ %5, %middle.block ], [ %add, %for.body ]1056 ret i32 %r.0.lcssa1057}1058 1059define i32 @umin_i32(ptr nocapture readonly %x, i32 %n) {1060; CHECK-LABEL: umin_i32:1061; CHECK: @ %bb.0: @ %entry1062; CHECK-NEXT: .save {r7, lr}1063; CHECK-NEXT: push {r7, lr}1064; CHECK-NEXT: cmp r1, #11065; CHECK-NEXT: blt .LBB11_31066; CHECK-NEXT: @ %bb.1: @ %for.body.preheader1067; CHECK-NEXT: cmp r1, #41068; CHECK-NEXT: bhs .LBB11_41069; CHECK-NEXT: @ %bb.2:1070; CHECK-NEXT: mov.w r2, #-11071; CHECK-NEXT: movs r3, #01072; CHECK-NEXT: b .LBB11_71073; CHECK-NEXT: .LBB11_3:1074; CHECK-NEXT: mov.w r2, #-11075; CHECK-NEXT: mov r0, r21076; CHECK-NEXT: pop {r7, pc}1077; CHECK-NEXT: .LBB11_4: @ %vector.ph1078; CHECK-NEXT: bic r3, r1, #31079; CHECK-NEXT: movs r2, #11080; CHECK-NEXT: sub.w r12, r3, #41081; CHECK-NEXT: vmov.i8 q0, #0xff1082; CHECK-NEXT: add.w lr, r2, r12, lsr #21083; CHECK-NEXT: mov r2, r01084; CHECK-NEXT: .LBB11_5: @ %vector.body1085; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11086; CHECK-NEXT: vldrw.u32 q1, [r2], #161087; CHECK-NEXT: vmin.u32 q0, q0, q11088; CHECK-NEXT: le lr, .LBB11_51089; CHECK-NEXT: @ %bb.6: @ %middle.block1090; CHECK-NEXT: mov.w r2, #-11091; CHECK-NEXT: cmp r3, r11092; CHECK-NEXT: vminv.u32 r2, q01093; CHECK-NEXT: beq .LBB11_91094; CHECK-NEXT: .LBB11_7: @ %for.body.preheader11095; CHECK-NEXT: sub.w lr, r1, r31096; CHECK-NEXT: add.w r0, r0, r3, lsl #21097; CHECK-NEXT: .LBB11_8: @ %for.body1098; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11099; CHECK-NEXT: ldr r1, [r0], #41100; CHECK-NEXT: cmp r2, r11101; CHECK-NEXT: csel r2, r2, r1, lo1102; CHECK-NEXT: le lr, .LBB11_81103; CHECK-NEXT: .LBB11_9: @ %for.cond.cleanup1104; CHECK-NEXT: mov r0, r21105; CHECK-NEXT: pop {r7, pc}1106entry:1107 %cmp6 = icmp sgt i32 %n, 01108 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup1109 1110for.body.preheader: ; preds = %entry1111 %min.iters.check = icmp ult i32 %n, 41112 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph1113 1114vector.ph: ; preds = %for.body.preheader1115 %n.vec = and i32 %n, -41116 br label %vector.body1117 1118vector.body: ; preds = %vector.body, %vector.ph1119 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1120 %vec.phi = phi <4 x i32> [ <i32 -1, i32 -1, i32 -1, i32 -1>, %vector.ph ], [ %3, %vector.body ]1121 %0 = getelementptr inbounds i32, ptr %x, i32 %index1122 %1 = bitcast ptr %0 to ptr1123 %wide.load = load <4 x i32>, ptr %1, align 41124 %2 = icmp ult <4 x i32> %vec.phi, %wide.load1125 %3 = select <4 x i1> %2, <4 x i32> %vec.phi, <4 x i32> %wide.load1126 %index.next = add i32 %index, 41127 %4 = icmp eq i32 %index.next, %n.vec1128 br i1 %4, label %middle.block, label %vector.body1129 1130middle.block: ; preds = %vector.body1131 %5 = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %3)1132 %cmp.n = icmp eq i32 %n.vec, %n1133 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader11134 1135for.body.preheader1: ; preds = %middle.block, %for.body.preheader1136 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1137 %r.07.ph = phi i32 [ -1, %for.body.preheader ], [ %5, %middle.block ]1138 br label %for.body1139 1140for.body: ; preds = %for.body.preheader1, %for.body1141 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]1142 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]1143 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.081144 %6 = load i32, ptr %arrayidx, align 41145 %c = icmp ult i32 %r.07, %61146 %add = select i1 %c, i32 %r.07, i32 %61147 %inc = add nuw nsw i32 %i.08, 11148 %exitcond = icmp eq i32 %inc, %n1149 br i1 %exitcond, label %for.cond.cleanup, label %for.body1150 1151for.cond.cleanup: ; preds = %for.body, %middle.block, %entry1152 %r.0.lcssa = phi i32 [ -1, %entry ], [ %5, %middle.block ], [ %add, %for.body ]1153 ret i32 %r.0.lcssa1154}1155 1156define i32 @umin_i32_inloop(ptr nocapture readonly %x, i32 %n) {1157; CHECK-LABEL: umin_i32_inloop:1158; CHECK: @ %bb.0: @ %entry1159; CHECK-NEXT: .save {r7, lr}1160; CHECK-NEXT: push {r7, lr}1161; CHECK-NEXT: cmp r1, #11162; CHECK-NEXT: blt .LBB12_31163; CHECK-NEXT: @ %bb.1: @ %for.body.preheader1164; CHECK-NEXT: mov r12, r01165; CHECK-NEXT: cmp r1, #41166; CHECK-NEXT: bhs .LBB12_41167; CHECK-NEXT: @ %bb.2:1168; CHECK-NEXT: mov.w r0, #-11169; CHECK-NEXT: movs r3, #01170; CHECK-NEXT: b .LBB12_71171; CHECK-NEXT: .LBB12_3:1172; CHECK-NEXT: mov.w r0, #-11173; CHECK-NEXT: pop {r7, pc}1174; CHECK-NEXT: .LBB12_4: @ %vector.ph1175; CHECK-NEXT: bic r3, r1, #31176; CHECK-NEXT: movs r2, #11177; CHECK-NEXT: subs r0, r3, #41178; CHECK-NEXT: add.w lr, r2, r0, lsr #21179; CHECK-NEXT: mov.w r0, #-11180; CHECK-NEXT: mov r2, r121181; CHECK-NEXT: .LBB12_5: @ %vector.body1182; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11183; CHECK-NEXT: vldrw.u32 q0, [r2], #161184; CHECK-NEXT: vminv.u32 r0, q01185; CHECK-NEXT: le lr, .LBB12_51186; CHECK-NEXT: @ %bb.6: @ %middle.block1187; CHECK-NEXT: cmp r3, r11188; CHECK-NEXT: it eq1189; CHECK-NEXT: popeq {r7, pc}1190; CHECK-NEXT: .LBB12_7: @ %for.body.preheader11191; CHECK-NEXT: sub.w lr, r1, r31192; CHECK-NEXT: add.w r2, r12, r3, lsl #21193; CHECK-NEXT: .LBB12_8: @ %for.body1194; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11195; CHECK-NEXT: ldr r1, [r2], #41196; CHECK-NEXT: cmp r0, r11197; CHECK-NEXT: csel r0, r0, r1, hi1198; CHECK-NEXT: le lr, .LBB12_81199; CHECK-NEXT: @ %bb.9: @ %for.cond.cleanup1200; CHECK-NEXT: pop {r7, pc}1201entry:1202 %cmp6 = icmp sgt i32 %n, 01203 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup1204 1205for.body.preheader: ; preds = %entry1206 %min.iters.check = icmp ult i32 %n, 41207 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph1208 1209vector.ph: ; preds = %for.body.preheader1210 %n.vec = and i32 %n, -41211 br label %vector.body1212 1213vector.body: ; preds = %vector.body, %vector.ph1214 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1215 %vec.phi = phi i32 [ -1, %vector.ph ], [ %3, %vector.body ]1216 %0 = getelementptr inbounds i32, ptr %x, i32 %index1217 %1 = bitcast ptr %0 to ptr1218 %wide.load = load <4 x i32>, ptr %1, align 41219 %l5 = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %wide.load)1220 %2 = icmp ult i32 %vec.phi, %l51221 %3 = select i1 %2, i32 %vec.phi, i32 %l51222 %index.next = add i32 %index, 41223 %4 = icmp eq i32 %index.next, %n.vec1224 br i1 %4, label %middle.block, label %vector.body1225 1226middle.block: ; preds = %vector.body1227 %5 = phi i32 [ %3, %vector.body ]1228 %cmp.n = icmp eq i32 %n.vec, %n1229 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader11230 1231for.body.preheader1: ; preds = %middle.block, %for.body.preheader1232 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1233 %r.07.ph = phi i32 [ -1, %for.body.preheader ], [ %5, %middle.block ]1234 br label %for.body1235 1236for.body: ; preds = %for.body.preheader1, %for.body1237 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]1238 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]1239 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.081240 %6 = load i32, ptr %arrayidx, align 41241 %c = icmp ugt i32 %r.07, %61242 %add = select i1 %c, i32 %r.07, i32 %61243 %inc = add nuw nsw i32 %i.08, 11244 %exitcond = icmp eq i32 %inc, %n1245 br i1 %exitcond, label %for.cond.cleanup, label %for.body1246 1247for.cond.cleanup: ; preds = %for.body, %middle.block, %entry1248 %r.0.lcssa = phi i32 [ -1, %entry ], [ %5, %middle.block ], [ %add, %for.body ]1249 ret i32 %r.0.lcssa1250}1251 1252define i32 @umax_i32(ptr nocapture readonly %x, i32 %n) {1253; CHECK-LABEL: umax_i32:1254; CHECK: @ %bb.0: @ %entry1255; CHECK-NEXT: .save {r7, lr}1256; CHECK-NEXT: push {r7, lr}1257; CHECK-NEXT: cmp r1, #11258; CHECK-NEXT: blt .LBB13_31259; CHECK-NEXT: @ %bb.1: @ %for.body.preheader1260; CHECK-NEXT: cmp r1, #41261; CHECK-NEXT: bhs .LBB13_41262; CHECK-NEXT: @ %bb.2:1263; CHECK-NEXT: movs r3, #01264; CHECK-NEXT: movs r2, #01265; CHECK-NEXT: b .LBB13_71266; CHECK-NEXT: .LBB13_3:1267; CHECK-NEXT: movs r2, #01268; CHECK-NEXT: mov r0, r21269; CHECK-NEXT: pop {r7, pc}1270; CHECK-NEXT: .LBB13_4: @ %vector.ph1271; CHECK-NEXT: bic r3, r1, #31272; CHECK-NEXT: movs r2, #11273; CHECK-NEXT: sub.w r12, r3, #41274; CHECK-NEXT: vmov.i32 q0, #0x01275; CHECK-NEXT: add.w lr, r2, r12, lsr #21276; CHECK-NEXT: mov r2, r01277; CHECK-NEXT: .LBB13_5: @ %vector.body1278; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11279; CHECK-NEXT: vldrw.u32 q1, [r2], #161280; CHECK-NEXT: vmax.u32 q0, q0, q11281; CHECK-NEXT: le lr, .LBB13_51282; CHECK-NEXT: @ %bb.6: @ %middle.block1283; CHECK-NEXT: movs r2, #01284; CHECK-NEXT: cmp r3, r11285; CHECK-NEXT: vmaxv.u32 r2, q01286; CHECK-NEXT: beq .LBB13_91287; CHECK-NEXT: .LBB13_7: @ %for.body.preheader11288; CHECK-NEXT: sub.w lr, r1, r31289; CHECK-NEXT: add.w r0, r0, r3, lsl #21290; CHECK-NEXT: .LBB13_8: @ %for.body1291; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11292; CHECK-NEXT: ldr r1, [r0], #41293; CHECK-NEXT: cmp r2, r11294; CHECK-NEXT: csel r2, r2, r1, hi1295; CHECK-NEXT: le lr, .LBB13_81296; CHECK-NEXT: .LBB13_9: @ %for.cond.cleanup1297; CHECK-NEXT: mov r0, r21298; CHECK-NEXT: pop {r7, pc}1299entry:1300 %cmp6 = icmp sgt i32 %n, 01301 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup1302 1303for.body.preheader: ; preds = %entry1304 %min.iters.check = icmp ult i32 %n, 41305 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph1306 1307vector.ph: ; preds = %for.body.preheader1308 %n.vec = and i32 %n, -41309 br label %vector.body1310 1311vector.body: ; preds = %vector.body, %vector.ph1312 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1313 %vec.phi = phi <4 x i32> [ zeroinitializer, %vector.ph ], [ %3, %vector.body ]1314 %0 = getelementptr inbounds i32, ptr %x, i32 %index1315 %1 = bitcast ptr %0 to ptr1316 %wide.load = load <4 x i32>, ptr %1, align 41317 %2 = icmp ugt <4 x i32> %vec.phi, %wide.load1318 %3 = select <4 x i1> %2, <4 x i32> %vec.phi, <4 x i32> %wide.load1319 %index.next = add i32 %index, 41320 %4 = icmp eq i32 %index.next, %n.vec1321 br i1 %4, label %middle.block, label %vector.body1322 1323middle.block: ; preds = %vector.body1324 %5 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %3)1325 %cmp.n = icmp eq i32 %n.vec, %n1326 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader11327 1328for.body.preheader1: ; preds = %middle.block, %for.body.preheader1329 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1330 %r.07.ph = phi i32 [ 0, %for.body.preheader ], [ %5, %middle.block ]1331 br label %for.body1332 1333for.body: ; preds = %for.body.preheader1, %for.body1334 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]1335 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]1336 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.081337 %6 = load i32, ptr %arrayidx, align 41338 %c = icmp ugt i32 %r.07, %61339 %add = select i1 %c, i32 %r.07, i32 %61340 %inc = add nuw nsw i32 %i.08, 11341 %exitcond = icmp eq i32 %inc, %n1342 br i1 %exitcond, label %for.cond.cleanup, label %for.body1343 1344for.cond.cleanup: ; preds = %for.body, %middle.block, %entry1345 %r.0.lcssa = phi i32 [ 0, %entry ], [ %5, %middle.block ], [ %add, %for.body ]1346 ret i32 %r.0.lcssa1347}1348 1349define i32 @umax_i32_inloop(ptr nocapture readonly %x, i32 %n) {1350; CHECK-LABEL: umax_i32_inloop:1351; CHECK: @ %bb.0: @ %entry1352; CHECK-NEXT: .save {r7, lr}1353; CHECK-NEXT: push {r7, lr}1354; CHECK-NEXT: cmp r1, #11355; CHECK-NEXT: blt .LBB14_31356; CHECK-NEXT: @ %bb.1: @ %for.body.preheader1357; CHECK-NEXT: mov r12, r01358; CHECK-NEXT: cmp r1, #41359; CHECK-NEXT: bhs .LBB14_41360; CHECK-NEXT: @ %bb.2:1361; CHECK-NEXT: movs r3, #01362; CHECK-NEXT: movs r0, #01363; CHECK-NEXT: b .LBB14_71364; CHECK-NEXT: .LBB14_3:1365; CHECK-NEXT: movs r0, #01366; CHECK-NEXT: pop {r7, pc}1367; CHECK-NEXT: .LBB14_4: @ %vector.ph1368; CHECK-NEXT: bic r3, r1, #31369; CHECK-NEXT: movs r2, #11370; CHECK-NEXT: subs r0, r3, #41371; CHECK-NEXT: add.w lr, r2, r0, lsr #21372; CHECK-NEXT: movs r0, #01373; CHECK-NEXT: mov r2, r121374; CHECK-NEXT: .LBB14_5: @ %vector.body1375; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11376; CHECK-NEXT: vldrw.u32 q0, [r2], #161377; CHECK-NEXT: vmaxv.u32 r0, q01378; CHECK-NEXT: le lr, .LBB14_51379; CHECK-NEXT: @ %bb.6: @ %middle.block1380; CHECK-NEXT: cmp r3, r11381; CHECK-NEXT: it eq1382; CHECK-NEXT: popeq {r7, pc}1383; CHECK-NEXT: .LBB14_7: @ %for.body.preheader11384; CHECK-NEXT: sub.w lr, r1, r31385; CHECK-NEXT: add.w r2, r12, r3, lsl #21386; CHECK-NEXT: .LBB14_8: @ %for.body1387; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11388; CHECK-NEXT: ldr r1, [r2], #41389; CHECK-NEXT: cmp r0, r11390; CHECK-NEXT: csel r0, r0, r1, hi1391; CHECK-NEXT: le lr, .LBB14_81392; CHECK-NEXT: @ %bb.9: @ %for.cond.cleanup1393; CHECK-NEXT: pop {r7, pc}1394entry:1395 %cmp6 = icmp sgt i32 %n, 01396 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup1397 1398for.body.preheader: ; preds = %entry1399 %min.iters.check = icmp ult i32 %n, 41400 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph1401 1402vector.ph: ; preds = %for.body.preheader1403 %n.vec = and i32 %n, -41404 br label %vector.body1405 1406vector.body: ; preds = %vector.body, %vector.ph1407 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1408 %vec.phi = phi i32 [ 0, %vector.ph ], [ %3, %vector.body ]1409 %0 = getelementptr inbounds i32, ptr %x, i32 %index1410 %1 = bitcast ptr %0 to ptr1411 %wide.load = load <4 x i32>, ptr %1, align 41412 %l5 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %wide.load)1413 %2 = icmp ugt i32 %vec.phi, %l51414 %3 = select i1 %2, i32 %vec.phi, i32 %l51415 %index.next = add i32 %index, 41416 %4 = icmp eq i32 %index.next, %n.vec1417 br i1 %4, label %middle.block, label %vector.body1418 1419middle.block: ; preds = %vector.body1420 %5 = phi i32 [ %3, %vector.body ]1421 %cmp.n = icmp eq i32 %n.vec, %n1422 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader11423 1424for.body.preheader1: ; preds = %middle.block, %for.body.preheader1425 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1426 %r.07.ph = phi i32 [ 0, %for.body.preheader ], [ %5, %middle.block ]1427 br label %for.body1428 1429for.body: ; preds = %for.body.preheader1, %for.body1430 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]1431 %r.07 = phi i32 [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]1432 %arrayidx = getelementptr inbounds i32, ptr %x, i32 %i.081433 %6 = load i32, ptr %arrayidx, align 41434 %c = icmp ugt i32 %r.07, %61435 %add = select i1 %c, i32 %r.07, i32 %61436 %inc = add nuw nsw i32 %i.08, 11437 %exitcond = icmp eq i32 %inc, %n1438 br i1 %exitcond, label %for.cond.cleanup, label %for.body1439 1440for.cond.cleanup: ; preds = %for.body, %middle.block, %entry1441 %r.0.lcssa = phi i32 [ 0, %entry ], [ %5, %middle.block ], [ %add, %for.body ]1442 ret i32 %r.0.lcssa1443}1444 1445define float @fmin_f32(ptr nocapture readonly %x, i32 %n) {1446; CHECK-LABEL: fmin_f32:1447; CHECK: @ %bb.0: @ %entry1448; CHECK-NEXT: .save {r7, lr}1449; CHECK-NEXT: push {r7, lr}1450; CHECK-NEXT: cmp r1, #11451; CHECK-NEXT: blt .LBB15_31452; CHECK-NEXT: @ %bb.1: @ %for.body.preheader1453; CHECK-NEXT: cmp r1, #41454; CHECK-NEXT: bhs .LBB15_41455; CHECK-NEXT: @ %bb.2:1456; CHECK-NEXT: vldr s0, .LCPI15_01457; CHECK-NEXT: movs r2, #01458; CHECK-NEXT: b .LBB15_71459; CHECK-NEXT: .LBB15_3:1460; CHECK-NEXT: vldr s0, .LCPI15_01461; CHECK-NEXT: vmov r0, s01462; CHECK-NEXT: pop {r7, pc}1463; CHECK-NEXT: .LBB15_4: @ %vector.ph1464; CHECK-NEXT: bic r2, r1, #31465; CHECK-NEXT: movs r3, #11466; CHECK-NEXT: sub.w r12, r2, #41467; CHECK-NEXT: vmov.i32 q0, #0x01468; CHECK-NEXT: add.w lr, r3, r12, lsr #21469; CHECK-NEXT: mov r3, r01470; CHECK-NEXT: .LBB15_5: @ %vector.body1471; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11472; CHECK-NEXT: vldrw.u32 q1, [r3], #161473; CHECK-NEXT: vcmp.f32 lt, q0, q11474; CHECK-NEXT: vpsel q0, q0, q11475; CHECK-NEXT: le lr, .LBB15_51476; CHECK-NEXT: @ %bb.6: @ %middle.block1477; CHECK-NEXT: vminnm.f32 s2, s2, s31478; CHECK-NEXT: vminnm.f32 s0, s0, s11479; CHECK-NEXT: vminnm.f32 s0, s0, s21480; CHECK-NEXT: cmp r2, r11481; CHECK-NEXT: beq .LBB15_91482; CHECK-NEXT: .LBB15_7: @ %for.body.preheader11483; CHECK-NEXT: sub.w lr, r1, r21484; CHECK-NEXT: add.w r0, r0, r2, lsl #21485; CHECK-NEXT: .LBB15_8: @ %for.body1486; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11487; CHECK-NEXT: vldmia r0!, {s2}1488; CHECK-NEXT: vcmp.f32 s0, s21489; CHECK-NEXT: vmrs APSR_nzcv, fpscr1490; CHECK-NEXT: vselge.f32 s0, s2, s01491; CHECK-NEXT: le lr, .LBB15_81492; CHECK-NEXT: .LBB15_9: @ %for.cond.cleanup1493; CHECK-NEXT: vmov r0, s01494; CHECK-NEXT: pop {r7, pc}1495; CHECK-NEXT: .p2align 21496; CHECK-NEXT: @ %bb.10:1497; CHECK-NEXT: .LCPI15_0:1498; CHECK-NEXT: .long 0x00000000 @ float 01499entry:1500 %cmp6 = icmp sgt i32 %n, 01501 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup1502 1503for.body.preheader: ; preds = %entry1504 %min.iters.check = icmp ult i32 %n, 41505 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph1506 1507vector.ph: ; preds = %for.body.preheader1508 %n.vec = and i32 %n, -41509 br label %vector.body1510 1511vector.body: ; preds = %vector.body, %vector.ph1512 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1513 %vec.phi = phi <4 x float> [ zeroinitializer, %vector.ph ], [ %3, %vector.body ]1514 %0 = getelementptr inbounds float, ptr %x, i32 %index1515 %1 = bitcast ptr %0 to ptr1516 %wide.load = load <4 x float>, ptr %1, align 41517 %2 = fcmp ult <4 x float> %vec.phi, %wide.load1518 %3 = select <4 x i1> %2, <4 x float> %vec.phi, <4 x float> %wide.load1519 %index.next = add i32 %index, 41520 %4 = icmp eq i32 %index.next, %n.vec1521 br i1 %4, label %middle.block, label %vector.body1522 1523middle.block: ; preds = %vector.body1524 %5 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %3)1525 %cmp.n = icmp eq i32 %n.vec, %n1526 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader11527 1528for.body.preheader1: ; preds = %middle.block, %for.body.preheader1529 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1530 %r.07.ph = phi float [ 0.0, %for.body.preheader ], [ %5, %middle.block ]1531 br label %for.body1532 1533for.body: ; preds = %for.body.preheader1, %for.body1534 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]1535 %r.07 = phi float [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]1536 %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.081537 %6 = load float, ptr %arrayidx, align 41538 %c = fcmp ult float %r.07, %61539 %add = select i1 %c, float %r.07, float %61540 %inc = add nuw nsw i32 %i.08, 11541 %exitcond = icmp eq i32 %inc, %n1542 br i1 %exitcond, label %for.cond.cleanup, label %for.body1543 1544for.cond.cleanup: ; preds = %for.body, %middle.block, %entry1545 %r.0.lcssa = phi float [ 0.0, %entry ], [ %5, %middle.block ], [ %add, %for.body ]1546 ret float %r.0.lcssa1547}1548 1549define float @fmax_f32(ptr nocapture readonly %x, i32 %n) {1550; CHECK-LABEL: fmax_f32:1551; CHECK: @ %bb.0: @ %entry1552; CHECK-NEXT: .save {r7, lr}1553; CHECK-NEXT: push {r7, lr}1554; CHECK-NEXT: cmp r1, #11555; CHECK-NEXT: blt .LBB16_31556; CHECK-NEXT: @ %bb.1: @ %for.body.preheader1557; CHECK-NEXT: cmp r1, #41558; CHECK-NEXT: bhs .LBB16_41559; CHECK-NEXT: @ %bb.2:1560; CHECK-NEXT: vldr s0, .LCPI16_01561; CHECK-NEXT: movs r2, #01562; CHECK-NEXT: b .LBB16_71563; CHECK-NEXT: .LBB16_3:1564; CHECK-NEXT: vldr s0, .LCPI16_01565; CHECK-NEXT: vmov r0, s01566; CHECK-NEXT: pop {r7, pc}1567; CHECK-NEXT: .LBB16_4: @ %vector.ph1568; CHECK-NEXT: bic r2, r1, #31569; CHECK-NEXT: movs r3, #11570; CHECK-NEXT: sub.w r12, r2, #41571; CHECK-NEXT: vmov.i32 q0, #0x01572; CHECK-NEXT: add.w lr, r3, r12, lsr #21573; CHECK-NEXT: mov r3, r01574; CHECK-NEXT: .LBB16_5: @ %vector.body1575; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11576; CHECK-NEXT: vldrw.u32 q1, [r3], #161577; CHECK-NEXT: vcmp.f32 lt, q1, q01578; CHECK-NEXT: vpsel q0, q0, q11579; CHECK-NEXT: le lr, .LBB16_51580; CHECK-NEXT: @ %bb.6: @ %middle.block1581; CHECK-NEXT: vmaxnm.f32 s2, s2, s31582; CHECK-NEXT: vmaxnm.f32 s0, s0, s11583; CHECK-NEXT: vmaxnm.f32 s0, s0, s21584; CHECK-NEXT: cmp r2, r11585; CHECK-NEXT: beq .LBB16_91586; CHECK-NEXT: .LBB16_7: @ %for.body.preheader11587; CHECK-NEXT: sub.w lr, r1, r21588; CHECK-NEXT: add.w r0, r0, r2, lsl #21589; CHECK-NEXT: .LBB16_8: @ %for.body1590; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11591; CHECK-NEXT: vldmia r0!, {s2}1592; CHECK-NEXT: vcmp.f32 s2, s01593; CHECK-NEXT: vmrs APSR_nzcv, fpscr1594; CHECK-NEXT: vselge.f32 s0, s2, s01595; CHECK-NEXT: le lr, .LBB16_81596; CHECK-NEXT: .LBB16_9: @ %for.cond.cleanup1597; CHECK-NEXT: vmov r0, s01598; CHECK-NEXT: pop {r7, pc}1599; CHECK-NEXT: .p2align 21600; CHECK-NEXT: @ %bb.10:1601; CHECK-NEXT: .LCPI16_0:1602; CHECK-NEXT: .long 0x00000000 @ float 01603entry:1604 %cmp6 = icmp sgt i32 %n, 01605 br i1 %cmp6, label %for.body.preheader, label %for.cond.cleanup1606 1607for.body.preheader: ; preds = %entry1608 %min.iters.check = icmp ult i32 %n, 41609 br i1 %min.iters.check, label %for.body.preheader1, label %vector.ph1610 1611vector.ph: ; preds = %for.body.preheader1612 %n.vec = and i32 %n, -41613 br label %vector.body1614 1615vector.body: ; preds = %vector.body, %vector.ph1616 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1617 %vec.phi = phi <4 x float> [ zeroinitializer, %vector.ph ], [ %3, %vector.body ]1618 %0 = getelementptr inbounds float, ptr %x, i32 %index1619 %1 = bitcast ptr %0 to ptr1620 %wide.load = load <4 x float>, ptr %1, align 41621 %2 = fcmp ugt <4 x float> %vec.phi, %wide.load1622 %3 = select <4 x i1> %2, <4 x float> %vec.phi, <4 x float> %wide.load1623 %index.next = add i32 %index, 41624 %4 = icmp eq i32 %index.next, %n.vec1625 br i1 %4, label %middle.block, label %vector.body1626 1627middle.block: ; preds = %vector.body1628 %5 = call float @llvm.vector.reduce.fmax.v4f32(<4 x float> %3)1629 %cmp.n = icmp eq i32 %n.vec, %n1630 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader11631 1632for.body.preheader1: ; preds = %middle.block, %for.body.preheader1633 %i.08.ph = phi i32 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]1634 %r.07.ph = phi float [ 0.0, %for.body.preheader ], [ %5, %middle.block ]1635 br label %for.body1636 1637for.body: ; preds = %for.body.preheader1, %for.body1638 %i.08 = phi i32 [ %inc, %for.body ], [ %i.08.ph, %for.body.preheader1 ]1639 %r.07 = phi float [ %add, %for.body ], [ %r.07.ph, %for.body.preheader1 ]1640 %arrayidx = getelementptr inbounds float, ptr %x, i32 %i.081641 %6 = load float, ptr %arrayidx, align 41642 %c = fcmp ugt float %r.07, %61643 %add = select i1 %c, float %r.07, float %61644 %inc = add nuw nsw i32 %i.08, 11645 %exitcond = icmp eq i32 %inc, %n1646 br i1 %exitcond, label %for.cond.cleanup, label %for.body1647 1648for.cond.cleanup: ; preds = %for.body, %middle.block, %entry1649 %r.0.lcssa = phi float [ 0.0, %entry ], [ %5, %middle.block ], [ %add, %for.body ]1650 ret float %r.0.lcssa1651}1652 1653define i32 @add4i32(ptr noalias nocapture readonly %x, i32 %n) {1654; CHECK-LABEL: add4i32:1655; CHECK: @ %bb.0: @ %entry1656; CHECK-NEXT: .save {r7, lr}1657; CHECK-NEXT: push {r7, lr}1658; CHECK-NEXT: cbz r1, .LBB17_41659; CHECK-NEXT: @ %bb.1: @ %vector.ph1660; CHECK-NEXT: movs r2, #01661; CHECK-NEXT: dlstp.32 lr, r11662; CHECK-NEXT: .LBB17_2: @ %vector.body1663; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11664; CHECK-NEXT: vldrw.u32 q0, [r0], #161665; CHECK-NEXT: vaddva.u32 r2, q01666; CHECK-NEXT: letp lr, .LBB17_21667; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1668; CHECK-NEXT: mov r0, r21669; CHECK-NEXT: pop {r7, pc}1670; CHECK-NEXT: .LBB17_4:1671; CHECK-NEXT: movs r2, #01672; CHECK-NEXT: mov r0, r21673; CHECK-NEXT: pop {r7, pc}1674entry:1675 %cmp6.not = icmp eq i32 %n, 01676 br i1 %cmp6.not, label %for.cond.cleanup, label %vector.ph1677 1678vector.ph: ; preds = %entry1679 %n.rnd.up = add i32 %n, 31680 %n.vec = and i32 %n.rnd.up, -41681 br label %vector.body1682 1683vector.body: ; preds = %vector.body, %vector.ph1684 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1685 %vec.phi = phi i32 [ 0, %vector.ph ], [ %4, %vector.body ]1686 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)1687 %0 = getelementptr inbounds i32, ptr %x, i32 %index1688 %1 = bitcast ptr %0 to ptr1689 %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)1690 %2 = select <4 x i1> %active.lane.mask, <4 x i32> %wide.masked.load, <4 x i32> zeroinitializer1691 %3 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %2)1692 %4 = add i32 %3, %vec.phi1693 %index.next = add i32 %index, 41694 %5 = icmp eq i32 %index.next, %n.vec1695 br i1 %5, label %for.cond.cleanup, label %vector.body1696 1697for.cond.cleanup: ; preds = %vector.body, %entry1698 %s.0.lcssa = phi i32 [ 0, %entry ], [ %4, %vector.body ]1699 ret i32 %s.0.lcssa1700}1701 1702define i32 @mla4i32(ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y, i32 %n) {1703; CHECK-LABEL: mla4i32:1704; CHECK: @ %bb.0: @ %entry1705; CHECK-NEXT: .save {r7, lr}1706; CHECK-NEXT: push {r7, lr}1707; CHECK-NEXT: cbz r2, .LBB18_41708; CHECK-NEXT: @ %bb.1: @ %vector.ph1709; CHECK-NEXT: mov.w r12, #01710; CHECK-NEXT: dlstp.32 lr, r21711; CHECK-NEXT: .LBB18_2: @ %vector.body1712; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11713; CHECK-NEXT: vldrw.u32 q0, [r0], #161714; CHECK-NEXT: vldrw.u32 q1, [r1], #161715; CHECK-NEXT: vmlava.u32 r12, q1, q01716; CHECK-NEXT: letp lr, .LBB18_21717; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1718; CHECK-NEXT: mov r0, r121719; CHECK-NEXT: pop {r7, pc}1720; CHECK-NEXT: .LBB18_4:1721; CHECK-NEXT: mov.w r12, #01722; CHECK-NEXT: mov r0, r121723; CHECK-NEXT: pop {r7, pc}1724entry:1725 %cmp8.not = icmp eq i32 %n, 01726 br i1 %cmp8.not, label %for.cond.cleanup, label %vector.ph1727 1728vector.ph: ; preds = %entry1729 %n.rnd.up = add i32 %n, 31730 %n.vec = and i32 %n.rnd.up, -41731 br label %vector.body1732 1733vector.body: ; preds = %vector.body, %vector.ph1734 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1735 %vec.phi = phi i32 [ 0, %vector.ph ], [ %7, %vector.body ]1736 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)1737 %0 = getelementptr inbounds i32, ptr %x, i32 %index1738 %1 = bitcast ptr %0 to ptr1739 %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)1740 %2 = getelementptr inbounds i32, ptr %y, i32 %index1741 %3 = bitcast ptr %2 to ptr1742 %wide.masked.load13 = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %3, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)1743 %4 = mul nsw <4 x i32> %wide.masked.load13, %wide.masked.load1744 %5 = select <4 x i1> %active.lane.mask, <4 x i32> %4, <4 x i32> zeroinitializer1745 %6 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %5)1746 %7 = add i32 %6, %vec.phi1747 %index.next = add i32 %index, 41748 %8 = icmp eq i32 %index.next, %n.vec1749 br i1 %8, label %for.cond.cleanup, label %vector.body1750 1751for.cond.cleanup: ; preds = %vector.body, %entry1752 %s.0.lcssa = phi i32 [ 0, %entry ], [ %7, %vector.body ]1753 ret i32 %s.0.lcssa1754}1755 1756define i32 @add8i32(ptr noalias nocapture readonly %x, i32 %n) {1757; CHECK-LABEL: add8i32:1758; CHECK: @ %bb.0: @ %entry1759; CHECK-NEXT: .save {r7, lr}1760; CHECK-NEXT: push {r7, lr}1761; CHECK-NEXT: cbz r1, .LBB19_41762; CHECK-NEXT: @ %bb.1: @ %vector.ph1763; CHECK-NEXT: movs r2, #01764; CHECK-NEXT: dlstp.16 lr, r11765; CHECK-NEXT: .LBB19_2: @ %vector.body1766; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11767; CHECK-NEXT: vldrh.u16 q0, [r0], #161768; CHECK-NEXT: vaddva.s16 r2, q01769; CHECK-NEXT: letp lr, .LBB19_21770; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1771; CHECK-NEXT: mov r0, r21772; CHECK-NEXT: pop {r7, pc}1773; CHECK-NEXT: .LBB19_4:1774; CHECK-NEXT: movs r2, #01775; CHECK-NEXT: mov r0, r21776; CHECK-NEXT: pop {r7, pc}1777entry:1778 %cmp6.not = icmp eq i32 %n, 01779 br i1 %cmp6.not, label %for.cond.cleanup, label %vector.ph1780 1781vector.ph: ; preds = %entry1782 %n.rnd.up = add i32 %n, 71783 %n.vec = and i32 %n.rnd.up, -81784 br label %vector.body1785 1786vector.body: ; preds = %vector.body, %vector.ph1787 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1788 %vec.phi = phi i32 [ 0, %vector.ph ], [ %5, %vector.body ]1789 %active.lane.mask = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 %index, i32 %n)1790 %0 = getelementptr inbounds i16, ptr %x, i32 %index1791 %1 = bitcast ptr %0 to ptr1792 %wide.masked.load = call <8 x i16> @llvm.masked.load.v8i16.p0(ptr %1, i32 2, <8 x i1> %active.lane.mask, <8 x i16> undef)1793 %2 = sext <8 x i16> %wide.masked.load to <8 x i32>1794 %3 = select <8 x i1> %active.lane.mask, <8 x i32> %2, <8 x i32> zeroinitializer1795 %4 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %3)1796 %5 = add i32 %4, %vec.phi1797 %index.next = add i32 %index, 81798 %6 = icmp eq i32 %index.next, %n.vec1799 br i1 %6, label %for.cond.cleanup, label %vector.body1800 1801for.cond.cleanup: ; preds = %vector.body, %entry1802 %s.0.lcssa = phi i32 [ 0, %entry ], [ %5, %vector.body ]1803 ret i32 %s.0.lcssa1804}1805 1806define i32 @mla8i32(ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y, i32 %n) {1807; CHECK-LABEL: mla8i32:1808; CHECK: @ %bb.0: @ %entry1809; CHECK-NEXT: .save {r7, lr}1810; CHECK-NEXT: push {r7, lr}1811; CHECK-NEXT: cbz r2, .LBB20_41812; CHECK-NEXT: @ %bb.1: @ %vector.ph1813; CHECK-NEXT: mov.w r12, #01814; CHECK-NEXT: dlstp.16 lr, r21815; CHECK-NEXT: .LBB20_2: @ %vector.body1816; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11817; CHECK-NEXT: vldrh.u16 q0, [r0], #161818; CHECK-NEXT: vldrh.u16 q1, [r1], #161819; CHECK-NEXT: vmlava.s16 r12, q1, q01820; CHECK-NEXT: letp lr, .LBB20_21821; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1822; CHECK-NEXT: mov r0, r121823; CHECK-NEXT: pop {r7, pc}1824; CHECK-NEXT: .LBB20_4:1825; CHECK-NEXT: mov.w r12, #01826; CHECK-NEXT: mov r0, r121827; CHECK-NEXT: pop {r7, pc}1828entry:1829 %cmp9.not = icmp eq i32 %n, 01830 br i1 %cmp9.not, label %for.cond.cleanup, label %vector.ph1831 1832vector.ph: ; preds = %entry1833 %n.rnd.up = add i32 %n, 71834 %n.vec = and i32 %n.rnd.up, -81835 br label %vector.body1836 1837vector.body: ; preds = %vector.body, %vector.ph1838 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1839 %vec.phi = phi i32 [ 0, %vector.ph ], [ %9, %vector.body ]1840 %active.lane.mask = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 %index, i32 %n)1841 %0 = getelementptr inbounds i16, ptr %x, i32 %index1842 %1 = bitcast ptr %0 to ptr1843 %wide.masked.load = call <8 x i16> @llvm.masked.load.v8i16.p0(ptr %1, i32 2, <8 x i1> %active.lane.mask, <8 x i16> undef)1844 %2 = sext <8 x i16> %wide.masked.load to <8 x i32>1845 %3 = getelementptr inbounds i16, ptr %y, i32 %index1846 %4 = bitcast ptr %3 to ptr1847 %wide.masked.load14 = call <8 x i16> @llvm.masked.load.v8i16.p0(ptr %4, i32 2, <8 x i1> %active.lane.mask, <8 x i16> undef)1848 %5 = sext <8 x i16> %wide.masked.load14 to <8 x i32>1849 %6 = mul nsw <8 x i32> %5, %21850 %7 = select <8 x i1> %active.lane.mask, <8 x i32> %6, <8 x i32> zeroinitializer1851 %8 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %7)1852 %9 = add i32 %8, %vec.phi1853 %index.next = add i32 %index, 81854 %10 = icmp eq i32 %index.next, %n.vec1855 br i1 %10, label %for.cond.cleanup, label %vector.body1856 1857for.cond.cleanup: ; preds = %vector.body, %entry1858 %s.0.lcssa = phi i32 [ 0, %entry ], [ %9, %vector.body ]1859 ret i32 %s.0.lcssa1860}1861 1862define i32 @add16i32(ptr noalias nocapture readonly %x, i32 %n) {1863; CHECK-LABEL: add16i32:1864; CHECK: @ %bb.0: @ %entry1865; CHECK-NEXT: .save {r7, lr}1866; CHECK-NEXT: push {r7, lr}1867; CHECK-NEXT: cbz r1, .LBB21_41868; CHECK-NEXT: @ %bb.1: @ %vector.ph1869; CHECK-NEXT: movs r2, #01870; CHECK-NEXT: dlstp.8 lr, r11871; CHECK-NEXT: .LBB21_2: @ %vector.body1872; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11873; CHECK-NEXT: vldrb.u8 q0, [r0], #161874; CHECK-NEXT: vaddva.u8 r2, q01875; CHECK-NEXT: letp lr, .LBB21_21876; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1877; CHECK-NEXT: mov r0, r21878; CHECK-NEXT: pop {r7, pc}1879; CHECK-NEXT: .LBB21_4:1880; CHECK-NEXT: movs r2, #01881; CHECK-NEXT: mov r0, r21882; CHECK-NEXT: pop {r7, pc}1883entry:1884 %cmp6.not = icmp eq i32 %n, 01885 br i1 %cmp6.not, label %for.cond.cleanup, label %vector.ph1886 1887vector.ph: ; preds = %entry1888 %n.rnd.up = add i32 %n, 151889 %n.vec = and i32 %n.rnd.up, -161890 br label %vector.body1891 1892vector.body: ; preds = %vector.body, %vector.ph1893 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1894 %vec.phi = phi i32 [ 0, %vector.ph ], [ %5, %vector.body ]1895 %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %index, i32 %n)1896 %0 = getelementptr inbounds i8, ptr %x, i32 %index1897 %1 = bitcast ptr %0 to ptr1898 %wide.masked.load = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %1, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)1899 %2 = zext <16 x i8> %wide.masked.load to <16 x i32>1900 %3 = select <16 x i1> %active.lane.mask, <16 x i32> %2, <16 x i32> zeroinitializer1901 %4 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %3)1902 %5 = add i32 %4, %vec.phi1903 %index.next = add i32 %index, 161904 %6 = icmp eq i32 %index.next, %n.vec1905 br i1 %6, label %for.cond.cleanup, label %vector.body1906 1907for.cond.cleanup: ; preds = %vector.body, %entry1908 %s.0.lcssa = phi i32 [ 0, %entry ], [ %5, %vector.body ]1909 ret i32 %s.0.lcssa1910}1911 1912define i32 @mla16i32(ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y, i32 %n) {1913; CHECK-LABEL: mla16i32:1914; CHECK: @ %bb.0: @ %entry1915; CHECK-NEXT: .save {r7, lr}1916; CHECK-NEXT: push {r7, lr}1917; CHECK-NEXT: cbz r2, .LBB22_41918; CHECK-NEXT: @ %bb.1: @ %vector.ph1919; CHECK-NEXT: mov.w r12, #01920; CHECK-NEXT: dlstp.8 lr, r21921; CHECK-NEXT: .LBB22_2: @ %vector.body1922; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11923; CHECK-NEXT: vldrb.u8 q0, [r0], #161924; CHECK-NEXT: vldrb.u8 q1, [r1], #161925; CHECK-NEXT: vmlava.u8 r12, q1, q01926; CHECK-NEXT: letp lr, .LBB22_21927; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1928; CHECK-NEXT: mov r0, r121929; CHECK-NEXT: pop {r7, pc}1930; CHECK-NEXT: .LBB22_4:1931; CHECK-NEXT: mov.w r12, #01932; CHECK-NEXT: mov r0, r121933; CHECK-NEXT: pop {r7, pc}1934entry:1935 %cmp9.not = icmp eq i32 %n, 01936 br i1 %cmp9.not, label %for.cond.cleanup, label %vector.ph1937 1938vector.ph: ; preds = %entry1939 %n.rnd.up = add i32 %n, 151940 %n.vec = and i32 %n.rnd.up, -161941 br label %vector.body1942 1943vector.body: ; preds = %vector.body, %vector.ph1944 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]1945 %vec.phi = phi i32 [ 0, %vector.ph ], [ %9, %vector.body ]1946 %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %index, i32 %n)1947 %0 = getelementptr inbounds i8, ptr %x, i32 %index1948 %1 = bitcast ptr %0 to ptr1949 %wide.masked.load = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %1, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)1950 %2 = zext <16 x i8> %wide.masked.load to <16 x i32>1951 %3 = getelementptr inbounds i8, ptr %y, i32 %index1952 %4 = bitcast ptr %3 to ptr1953 %wide.masked.load14 = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %4, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)1954 %5 = zext <16 x i8> %wide.masked.load14 to <16 x i32>1955 %6 = mul nuw nsw <16 x i32> %5, %21956 %7 = select <16 x i1> %active.lane.mask, <16 x i32> %6, <16 x i32> zeroinitializer1957 %8 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %7)1958 %9 = add i32 %8, %vec.phi1959 %index.next = add i32 %index, 161960 %10 = icmp eq i32 %index.next, %n.vec1961 br i1 %10, label %for.cond.cleanup, label %vector.body1962 1963for.cond.cleanup: ; preds = %vector.body, %entry1964 %s.0.lcssa = phi i32 [ 0, %entry ], [ %9, %vector.body ]1965 ret i32 %s.0.lcssa1966}1967 1968define signext i16 @add8i16(ptr noalias nocapture readonly %x, i32 %n) {1969; CHECK-LABEL: add8i16:1970; CHECK: @ %bb.0: @ %entry1971; CHECK-NEXT: .save {r7, lr}1972; CHECK-NEXT: push {r7, lr}1973; CHECK-NEXT: cbz r1, .LBB23_41974; CHECK-NEXT: @ %bb.1: @ %vector.ph1975; CHECK-NEXT: movs r2, #01976; CHECK-NEXT: dlstp.16 lr, r11977; CHECK-NEXT: .LBB23_2: @ %vector.body1978; CHECK-NEXT: @ =>This Inner Loop Header: Depth=11979; CHECK-NEXT: vldrh.u16 q0, [r0], #161980; CHECK-NEXT: vaddva.u16 r2, q01981; CHECK-NEXT: letp lr, .LBB23_21982; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup1983; CHECK-NEXT: sxth r0, r21984; CHECK-NEXT: pop {r7, pc}1985; CHECK-NEXT: .LBB23_4:1986; CHECK-NEXT: movs r2, #01987; CHECK-NEXT: sxth r0, r21988; CHECK-NEXT: pop {r7, pc}1989entry:1990 %cmp8.not = icmp eq i32 %n, 01991 br i1 %cmp8.not, label %for.cond.cleanup, label %vector.ph1992 1993vector.ph: ; preds = %entry1994 %n.rnd.up = add i32 %n, 71995 %n.vec = and i32 %n.rnd.up, -81996 br label %vector.body1997 1998vector.body: ; preds = %vector.body, %vector.ph1999 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2000 %vec.phi = phi i16 [ 0, %vector.ph ], [ %4, %vector.body ]2001 %active.lane.mask = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 %index, i32 %n)2002 %0 = getelementptr inbounds i16, ptr %x, i32 %index2003 %1 = bitcast ptr %0 to ptr2004 %wide.masked.load = call <8 x i16> @llvm.masked.load.v8i16.p0(ptr %1, i32 2, <8 x i1> %active.lane.mask, <8 x i16> undef)2005 %2 = select <8 x i1> %active.lane.mask, <8 x i16> %wide.masked.load, <8 x i16> zeroinitializer2006 %3 = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %2)2007 %4 = add i16 %3, %vec.phi2008 %index.next = add i32 %index, 82009 %5 = icmp eq i32 %index.next, %n.vec2010 br i1 %5, label %for.cond.cleanup, label %vector.body2011 2012for.cond.cleanup: ; preds = %vector.body, %entry2013 %s.0.lcssa = phi i16 [ 0, %entry ], [ %4, %vector.body ]2014 ret i16 %s.0.lcssa2015}2016 2017define signext i16 @mla8i16(ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y, i32 %n) {2018; CHECK-LABEL: mla8i16:2019; CHECK: @ %bb.0: @ %entry2020; CHECK-NEXT: .save {r7, lr}2021; CHECK-NEXT: push {r7, lr}2022; CHECK-NEXT: cbz r2, .LBB24_42023; CHECK-NEXT: @ %bb.1: @ %vector.ph2024; CHECK-NEXT: mov.w r12, #02025; CHECK-NEXT: dlstp.16 lr, r22026; CHECK-NEXT: .LBB24_2: @ %vector.body2027; CHECK-NEXT: @ =>This Inner Loop Header: Depth=12028; CHECK-NEXT: vldrh.u16 q0, [r0], #162029; CHECK-NEXT: vldrh.u16 q1, [r1], #162030; CHECK-NEXT: vmlava.u16 r12, q1, q02031; CHECK-NEXT: letp lr, .LBB24_22032; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup2033; CHECK-NEXT: sxth.w r0, r122034; CHECK-NEXT: pop {r7, pc}2035; CHECK-NEXT: .LBB24_4:2036; CHECK-NEXT: mov.w r12, #02037; CHECK-NEXT: sxth.w r0, r122038; CHECK-NEXT: pop {r7, pc}2039entry:2040 %cmp11.not = icmp eq i32 %n, 02041 br i1 %cmp11.not, label %for.cond.cleanup, label %vector.ph2042 2043vector.ph: ; preds = %entry2044 %n.rnd.up = add i32 %n, 72045 %n.vec = and i32 %n.rnd.up, -82046 br label %vector.body2047 2048vector.body: ; preds = %vector.body, %vector.ph2049 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2050 %vec.phi = phi i16 [ 0, %vector.ph ], [ %7, %vector.body ]2051 %active.lane.mask = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 %index, i32 %n)2052 %0 = getelementptr inbounds i16, ptr %x, i32 %index2053 %1 = bitcast ptr %0 to ptr2054 %wide.masked.load = call <8 x i16> @llvm.masked.load.v8i16.p0(ptr %1, i32 2, <8 x i1> %active.lane.mask, <8 x i16> undef)2055 %2 = getelementptr inbounds i16, ptr %y, i32 %index2056 %3 = bitcast ptr %2 to ptr2057 %wide.masked.load16 = call <8 x i16> @llvm.masked.load.v8i16.p0(ptr %3, i32 2, <8 x i1> %active.lane.mask, <8 x i16> undef)2058 %4 = mul <8 x i16> %wide.masked.load16, %wide.masked.load2059 %5 = select <8 x i1> %active.lane.mask, <8 x i16> %4, <8 x i16> zeroinitializer2060 %6 = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %5)2061 %7 = add i16 %6, %vec.phi2062 %index.next = add i32 %index, 82063 %8 = icmp eq i32 %index.next, %n.vec2064 br i1 %8, label %for.cond.cleanup, label %vector.body2065 2066for.cond.cleanup: ; preds = %vector.body, %entry2067 %s.0.lcssa = phi i16 [ 0, %entry ], [ %7, %vector.body ]2068 ret i16 %s.0.lcssa2069}2070 2071define signext i16 @add16i16(ptr noalias nocapture readonly %x, i32 %n) {2072; CHECK-LABEL: add16i16:2073; CHECK: @ %bb.0: @ %entry2074; CHECK-NEXT: .save {r7, lr}2075; CHECK-NEXT: push {r7, lr}2076; CHECK-NEXT: cbz r1, .LBB25_42077; CHECK-NEXT: @ %bb.1: @ %vector.ph2078; CHECK-NEXT: movs r2, #02079; CHECK-NEXT: dlstp.8 lr, r12080; CHECK-NEXT: .LBB25_2: @ %vector.body2081; CHECK-NEXT: @ =>This Inner Loop Header: Depth=12082; CHECK-NEXT: vldrb.u8 q0, [r0], #162083; CHECK-NEXT: vaddva.u8 r2, q02084; CHECK-NEXT: letp lr, .LBB25_22085; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup2086; CHECK-NEXT: sxth r0, r22087; CHECK-NEXT: pop {r7, pc}2088; CHECK-NEXT: .LBB25_4:2089; CHECK-NEXT: movs r2, #02090; CHECK-NEXT: sxth r0, r22091; CHECK-NEXT: pop {r7, pc}2092entry:2093 %cmp8.not = icmp eq i32 %n, 02094 br i1 %cmp8.not, label %for.cond.cleanup, label %vector.ph2095 2096vector.ph: ; preds = %entry2097 %n.rnd.up = add i32 %n, 152098 %n.vec = and i32 %n.rnd.up, -162099 br label %vector.body2100 2101vector.body: ; preds = %vector.body, %vector.ph2102 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2103 %vec.phi = phi i16 [ 0, %vector.ph ], [ %5, %vector.body ]2104 %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %index, i32 %n)2105 %0 = getelementptr inbounds i8, ptr %x, i32 %index2106 %1 = bitcast ptr %0 to ptr2107 %wide.masked.load = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %1, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)2108 %2 = zext <16 x i8> %wide.masked.load to <16 x i16>2109 %3 = select <16 x i1> %active.lane.mask, <16 x i16> %2, <16 x i16> zeroinitializer2110 %4 = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %3)2111 %5 = add i16 %4, %vec.phi2112 %index.next = add i32 %index, 162113 %6 = icmp eq i32 %index.next, %n.vec2114 br i1 %6, label %for.cond.cleanup, label %vector.body2115 2116for.cond.cleanup: ; preds = %vector.body, %entry2117 %s.0.lcssa = phi i16 [ 0, %entry ], [ %5, %vector.body ]2118 ret i16 %s.0.lcssa2119}2120 2121define signext i16 @mla16i16(ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y, i32 %n) {2122; CHECK-LABEL: mla16i16:2123; CHECK: @ %bb.0: @ %entry2124; CHECK-NEXT: .save {r7, lr}2125; CHECK-NEXT: push {r7, lr}2126; CHECK-NEXT: cbz r2, .LBB26_42127; CHECK-NEXT: @ %bb.1: @ %vector.ph2128; CHECK-NEXT: mov.w r12, #02129; CHECK-NEXT: dlstp.8 lr, r22130; CHECK-NEXT: .LBB26_2: @ %vector.body2131; CHECK-NEXT: @ =>This Inner Loop Header: Depth=12132; CHECK-NEXT: vldrb.u8 q0, [r0], #162133; CHECK-NEXT: vldrb.u8 q1, [r1], #162134; CHECK-NEXT: vmlava.u8 r12, q1, q02135; CHECK-NEXT: letp lr, .LBB26_22136; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup2137; CHECK-NEXT: sxth.w r0, r122138; CHECK-NEXT: pop {r7, pc}2139; CHECK-NEXT: .LBB26_4:2140; CHECK-NEXT: mov.w r12, #02141; CHECK-NEXT: sxth.w r0, r122142; CHECK-NEXT: pop {r7, pc}2143entry:2144 %cmp13.not = icmp eq i32 %n, 02145 br i1 %cmp13.not, label %for.cond.cleanup, label %vector.ph2146 2147vector.ph: ; preds = %entry2148 %n.rnd.up = add i32 %n, 152149 %n.vec = and i32 %n.rnd.up, -162150 br label %vector.body2151 2152vector.body: ; preds = %vector.body, %vector.ph2153 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2154 %vec.phi = phi i16 [ 0, %vector.ph ], [ %9, %vector.body ]2155 %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %index, i32 %n)2156 %0 = getelementptr inbounds i8, ptr %x, i32 %index2157 %1 = bitcast ptr %0 to ptr2158 %wide.masked.load = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %1, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)2159 %2 = zext <16 x i8> %wide.masked.load to <16 x i16>2160 %3 = getelementptr inbounds i8, ptr %y, i32 %index2161 %4 = bitcast ptr %3 to ptr2162 %wide.masked.load18 = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %4, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)2163 %5 = zext <16 x i8> %wide.masked.load18 to <16 x i16>2164 %6 = mul nuw <16 x i16> %5, %22165 %7 = select <16 x i1> %active.lane.mask, <16 x i16> %6, <16 x i16> zeroinitializer2166 %8 = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %7)2167 %9 = add i16 %8, %vec.phi2168 %index.next = add i32 %index, 162169 %10 = icmp eq i32 %index.next, %n.vec2170 br i1 %10, label %for.cond.cleanup, label %vector.body2171 2172for.cond.cleanup: ; preds = %vector.body, %entry2173 %s.0.lcssa = phi i16 [ 0, %entry ], [ %9, %vector.body ]2174 ret i16 %s.0.lcssa2175}2176 2177define zeroext i8 @add16i8(ptr noalias nocapture readonly %x, i32 %n) {2178; CHECK-LABEL: add16i8:2179; CHECK: @ %bb.0: @ %entry2180; CHECK-NEXT: .save {r7, lr}2181; CHECK-NEXT: push {r7, lr}2182; CHECK-NEXT: cbz r1, .LBB27_42183; CHECK-NEXT: @ %bb.1: @ %vector.ph2184; CHECK-NEXT: movs r2, #02185; CHECK-NEXT: dlstp.8 lr, r12186; CHECK-NEXT: .LBB27_2: @ %vector.body2187; CHECK-NEXT: @ =>This Inner Loop Header: Depth=12188; CHECK-NEXT: vldrb.u8 q0, [r0], #162189; CHECK-NEXT: vaddva.u8 r2, q02190; CHECK-NEXT: letp lr, .LBB27_22191; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup2192; CHECK-NEXT: uxtb r0, r22193; CHECK-NEXT: pop {r7, pc}2194; CHECK-NEXT: .LBB27_4:2195; CHECK-NEXT: movs r2, #02196; CHECK-NEXT: uxtb r0, r22197; CHECK-NEXT: pop {r7, pc}2198entry:2199 %cmp7.not = icmp eq i32 %n, 02200 br i1 %cmp7.not, label %for.cond.cleanup, label %vector.ph2201 2202vector.ph: ; preds = %entry2203 %n.rnd.up = add i32 %n, 152204 %n.vec = and i32 %n.rnd.up, -162205 br label %vector.body2206 2207vector.body: ; preds = %vector.body, %vector.ph2208 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2209 %vec.phi = phi i8 [ 0, %vector.ph ], [ %4, %vector.body ]2210 %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %index, i32 %n)2211 %0 = getelementptr inbounds i8, ptr %x, i32 %index2212 %1 = bitcast ptr %0 to ptr2213 %wide.masked.load = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %1, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)2214 %2 = select <16 x i1> %active.lane.mask, <16 x i8> %wide.masked.load, <16 x i8> zeroinitializer2215 %3 = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %2)2216 %4 = add i8 %3, %vec.phi2217 %index.next = add i32 %index, 162218 %5 = icmp eq i32 %index.next, %n.vec2219 br i1 %5, label %for.cond.cleanup, label %vector.body2220 2221for.cond.cleanup: ; preds = %vector.body, %entry2222 %s.0.lcssa = phi i8 [ 0, %entry ], [ %4, %vector.body ]2223 ret i8 %s.0.lcssa2224}2225 2226define zeroext i8 @mla16i8(ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y, i32 %n) {2227; CHECK-LABEL: mla16i8:2228; CHECK: @ %bb.0: @ %entry2229; CHECK-NEXT: .save {r7, lr}2230; CHECK-NEXT: push {r7, lr}2231; CHECK-NEXT: cbz r2, .LBB28_42232; CHECK-NEXT: @ %bb.1: @ %vector.ph2233; CHECK-NEXT: mov.w r12, #02234; CHECK-NEXT: dlstp.8 lr, r22235; CHECK-NEXT: .LBB28_2: @ %vector.body2236; CHECK-NEXT: @ =>This Inner Loop Header: Depth=12237; CHECK-NEXT: vldrb.u8 q0, [r0], #162238; CHECK-NEXT: vldrb.u8 q1, [r1], #162239; CHECK-NEXT: vmlava.u8 r12, q1, q02240; CHECK-NEXT: letp lr, .LBB28_22241; CHECK-NEXT: @ %bb.3: @ %for.cond.cleanup2242; CHECK-NEXT: uxtb.w r0, r122243; CHECK-NEXT: pop {r7, pc}2244; CHECK-NEXT: .LBB28_4:2245; CHECK-NEXT: mov.w r12, #02246; CHECK-NEXT: uxtb.w r0, r122247; CHECK-NEXT: pop {r7, pc}2248entry:2249 %cmp10.not = icmp eq i32 %n, 02250 br i1 %cmp10.not, label %for.cond.cleanup, label %vector.ph2251 2252vector.ph: ; preds = %entry2253 %n.rnd.up = add i32 %n, 152254 %n.vec = and i32 %n.rnd.up, -162255 br label %vector.body2256 2257vector.body: ; preds = %vector.body, %vector.ph2258 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2259 %vec.phi = phi i8 [ 0, %vector.ph ], [ %7, %vector.body ]2260 %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %index, i32 %n)2261 %0 = getelementptr inbounds i8, ptr %x, i32 %index2262 %1 = bitcast ptr %0 to ptr2263 %wide.masked.load = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %1, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)2264 %2 = getelementptr inbounds i8, ptr %y, i32 %index2265 %3 = bitcast ptr %2 to ptr2266 %wide.masked.load15 = call <16 x i8> @llvm.masked.load.v16i8.p0(ptr %3, i32 1, <16 x i1> %active.lane.mask, <16 x i8> undef)2267 %4 = mul <16 x i8> %wide.masked.load15, %wide.masked.load2268 %5 = select <16 x i1> %active.lane.mask, <16 x i8> %4, <16 x i8> zeroinitializer2269 %6 = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %5)2270 %7 = add i8 %6, %vec.phi2271 %index.next = add i32 %index, 162272 %8 = icmp eq i32 %index.next, %n.vec2273 br i1 %8, label %for.cond.cleanup, label %vector.body2274 2275for.cond.cleanup: ; preds = %vector.body, %entry2276 %s.0.lcssa = phi i8 [ 0, %entry ], [ %7, %vector.body ]2277 ret i8 %s.0.lcssa2278}2279 2280define i64 @add4i64(ptr noalias nocapture readonly %x, i32 %n) {2281; CHECK-LABEL: add4i64:2282; CHECK: @ %bb.0: @ %entry2283; CHECK-NEXT: .save {r7, lr}2284; CHECK-NEXT: push {r7, lr}2285; CHECK-NEXT: cbz r1, .LBB29_32286; CHECK-NEXT: @ %bb.1: @ %vector.ph2287; CHECK-NEXT: movs r2, #02288; CHECK-NEXT: mov r3, r22289; CHECK-NEXT: dlstp.32 lr, r12290; CHECK-NEXT: .LBB29_2: @ %vector.body2291; CHECK-NEXT: @ =>This Inner Loop Header: Depth=12292; CHECK-NEXT: vldrw.u32 q0, [r0], #162293; CHECK-NEXT: vaddlva.s32 r2, r3, q02294; CHECK-NEXT: letp lr, .LBB29_22295; CHECK-NEXT: b .LBB29_42296; CHECK-NEXT: .LBB29_3:2297; CHECK-NEXT: movs r2, #02298; CHECK-NEXT: mov r3, r22299; CHECK-NEXT: .LBB29_4: @ %for.cond.cleanup2300; CHECK-NEXT: mov r0, r22301; CHECK-NEXT: mov r1, r32302; CHECK-NEXT: pop {r7, pc}2303entry:2304 %cmp6.not = icmp eq i32 %n, 02305 br i1 %cmp6.not, label %for.cond.cleanup, label %vector.ph2306 2307vector.ph: ; preds = %entry2308 %n.rnd.up = add i32 %n, 32309 %n.vec = and i32 %n.rnd.up, -42310 br label %vector.body2311 2312vector.body: ; preds = %vector.body, %vector.ph2313 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2314 %vec.phi = phi i64 [ 0, %vector.ph ], [ %5, %vector.body ]2315 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)2316 %0 = getelementptr inbounds i32, ptr %x, i32 %index2317 %1 = bitcast ptr %0 to ptr2318 %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)2319 %2 = sext <4 x i32> %wide.masked.load to <4 x i64>2320 %3 = select <4 x i1> %active.lane.mask, <4 x i64> %2, <4 x i64> zeroinitializer2321 %4 = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %3)2322 %5 = add i64 %4, %vec.phi2323 %index.next = add i32 %index, 42324 %6 = icmp eq i32 %index.next, %n.vec2325 br i1 %6, label %for.cond.cleanup, label %vector.body2326 2327for.cond.cleanup: ; preds = %vector.body, %entry2328 %s.0.lcssa = phi i64 [ 0, %entry ], [ %5, %vector.body ]2329 ret i64 %s.0.lcssa2330}2331 2332define i64 @mla4i64(ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y, i32 %n) {2333; CHECK-LABEL: mla4i64:2334; CHECK: @ %bb.0: @ %entry2335; CHECK-NEXT: .save {r7, lr}2336; CHECK-NEXT: push {r7, lr}2337; CHECK-NEXT: cbz r2, .LBB30_32338; CHECK-NEXT: @ %bb.1: @ %vector.ph2339; CHECK-NEXT: mov.w r12, #02340; CHECK-NEXT: mov r3, r122341; CHECK-NEXT: dlstp.32 lr, r22342; CHECK-NEXT: .LBB30_2: @ %vector.body2343; CHECK-NEXT: @ =>This Inner Loop Header: Depth=12344; CHECK-NEXT: vldrw.u32 q0, [r0], #162345; CHECK-NEXT: vldrw.u32 q1, [r1], #162346; CHECK-NEXT: vmlalva.s32 r12, r3, q1, q02347; CHECK-NEXT: letp lr, .LBB30_22348; CHECK-NEXT: b .LBB30_42349; CHECK-NEXT: .LBB30_3:2350; CHECK-NEXT: mov.w r12, #02351; CHECK-NEXT: mov r3, r122352; CHECK-NEXT: .LBB30_4: @ %for.cond.cleanup2353; CHECK-NEXT: mov r0, r122354; CHECK-NEXT: mov r1, r32355; CHECK-NEXT: pop {r7, pc}2356entry:2357 %cmp9.not = icmp eq i32 %n, 02358 br i1 %cmp9.not, label %for.cond.cleanup, label %vector.ph2359 2360vector.ph: ; preds = %entry2361 %n.rnd.up = add i32 %n, 32362 %n.vec = and i32 %n.rnd.up, -42363 br label %vector.body2364 2365vector.body: ; preds = %vector.body, %vector.ph2366 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2367 %vec.phi = phi i64 [ 0, %vector.ph ], [ %9, %vector.body ]2368 %active.lane.mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %index, i32 %n)2369 %0 = getelementptr inbounds i32, ptr %x, i32 %index2370 %1 = bitcast ptr %0 to ptr2371 %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)2372 %2 = sext <4 x i32> %wide.masked.load to <4 x i64>2373 %3 = getelementptr inbounds i32, ptr %y, i32 %index2374 %4 = bitcast ptr %3 to ptr2375 %wide.masked.load14 = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr %4, i32 4, <4 x i1> %active.lane.mask, <4 x i32> undef)2376 %5 = sext <4 x i32> %wide.masked.load14 to <4 x i64>2377 %6 = mul nsw <4 x i64> %5, %22378 %7 = select <4 x i1> %active.lane.mask, <4 x i64> %6, <4 x i64> zeroinitializer2379 %8 = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %7)2380 %9 = add i64 %8, %vec.phi2381 %index.next = add i32 %index, 42382 %10 = icmp eq i32 %index.next, %n.vec2383 br i1 %10, label %for.cond.cleanup, label %vector.body2384 2385for.cond.cleanup: ; preds = %vector.body, %entry2386 %s.0.lcssa = phi i64 [ 0, %entry ], [ %9, %vector.body ]2387 ret i64 %s.0.lcssa2388}2389 2390define i64 @mla8i64(ptr noalias nocapture readonly %x, ptr noalias nocapture readonly %y, i32 %n) {2391; CHECK-LABEL: mla8i64:2392; CHECK: @ %bb.0: @ %entry2393; CHECK-NEXT: .save {r7, lr}2394; CHECK-NEXT: push {r7, lr}2395; CHECK-NEXT: cbz r2, .LBB31_32396; CHECK-NEXT: @ %bb.1: @ %vector.ph2397; CHECK-NEXT: mov.w r12, #02398; CHECK-NEXT: mov r3, r122399; CHECK-NEXT: dlstp.16 lr, r22400; CHECK-NEXT: .LBB31_2: @ %vector.body2401; CHECK-NEXT: @ =>This Inner Loop Header: Depth=12402; CHECK-NEXT: vldrh.u16 q0, [r0], #162403; CHECK-NEXT: vldrh.u16 q1, [r1], #162404; CHECK-NEXT: vmlalva.s16 r12, r3, q1, q02405; CHECK-NEXT: letp lr, .LBB31_22406; CHECK-NEXT: b .LBB31_42407; CHECK-NEXT: .LBB31_3:2408; CHECK-NEXT: mov.w r12, #02409; CHECK-NEXT: mov r3, r122410; CHECK-NEXT: .LBB31_4: @ %for.cond.cleanup2411; CHECK-NEXT: mov r0, r122412; CHECK-NEXT: mov r1, r32413; CHECK-NEXT: pop {r7, pc}2414entry:2415 %cmp9.not = icmp eq i32 %n, 02416 br i1 %cmp9.not, label %for.cond.cleanup, label %vector.ph2417 2418vector.ph: ; preds = %entry2419 %n.rnd.up = add i32 %n, 72420 %n.vec = and i32 %n.rnd.up, -82421 br label %vector.body2422 2423vector.body: ; preds = %vector.body, %vector.ph2424 %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ]2425 %vec.phi = phi i64 [ 0, %vector.ph ], [ %9, %vector.body ]2426 %active.lane.mask = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 %index, i32 %n)2427 %0 = getelementptr inbounds i16, ptr %x, i32 %index2428 %1 = bitcast ptr %0 to ptr2429 %wide.masked.load = call <8 x i16> @llvm.masked.load.v8i16.p0(ptr %1, i32 2, <8 x i1> %active.lane.mask, <8 x i16> undef)2430 %2 = sext <8 x i16> %wide.masked.load to <8 x i64>2431 %3 = getelementptr inbounds i16, ptr %y, i32 %index2432 %4 = bitcast ptr %3 to ptr2433 %wide.masked.load14 = call <8 x i16> @llvm.masked.load.v8i16.p0(ptr %4, i32 2, <8 x i1> %active.lane.mask, <8 x i16> undef)2434 %5 = sext <8 x i16> %wide.masked.load14 to <8 x i64>2435 %6 = mul nsw <8 x i64> %5, %22436 %7 = select <8 x i1> %active.lane.mask, <8 x i64> %6, <8 x i64> zeroinitializer2437 %8 = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %7)2438 %9 = add i64 %8, %vec.phi2439 %index.next = add i32 %index, 82440 %10 = icmp eq i32 %index.next, %n.vec2441 br i1 %10, label %for.cond.cleanup, label %vector.body2442 2443for.cond.cleanup: ; preds = %vector.body, %entry2444 %s.0.lcssa = phi i64 [ 0, %entry ], [ %9, %vector.body ]2445 ret i64 %s.0.lcssa2446}2447 2448declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32, i32) #12449declare <4 x i32> @llvm.masked.load.v4i32.p0(ptr, i32 immarg, <4 x i1>, <4 x i32>) #22450declare <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32, i32) #12451declare <8 x i16> @llvm.masked.load.v8i16.p0(ptr, i32 immarg, <8 x i1>, <8 x i16>) #22452declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>) #32453declare <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32, i32) #12454declare <16 x i8> @llvm.masked.load.v16i8.p0(ptr, i32 immarg, <16 x i1>, <16 x i8>) #22455declare i32 @llvm.vector.reduce.add.v16i32(<16 x i32>) #32456declare i16 @llvm.vector.reduce.add.v8i16(<8 x i16>) #32457declare i16 @llvm.vector.reduce.add.v16i16(<16 x i16>) #32458declare i8 @llvm.vector.reduce.add.v16i8(<16 x i8>) #32459declare i64 @llvm.vector.reduce.add.v4i64(<4 x i64>) #32460declare i64 @llvm.vector.reduce.add.v8i64(<8 x i64>) #32461 2462declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>)2463declare i32 @llvm.vector.reduce.mul.v4i32(<4 x i32>)2464declare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>)2465declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)2466declare i32 @llvm.vector.reduce.xor.v4i32(<4 x i32>)2467declare float @llvm.vector.reduce.fadd.f32.v4f32(float, <4 x float>)2468declare float @llvm.vector.reduce.fmul.f32.v4f32(float, <4 x float>)2469declare i32 @llvm.vector.reduce.smin.v4i32(<4 x i32>)2470declare i32 @llvm.vector.reduce.smax.v4i32(<4 x i32>)2471declare i32 @llvm.vector.reduce.umin.v4i32(<4 x i32>)2472declare i32 @llvm.vector.reduce.umax.v4i32(<4 x i32>)2473declare float @llvm.vector.reduce.fmin.v4f32(<4 x float>)2474declare float @llvm.vector.reduce.fmax.v4f32(<4 x float>)2475