| ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter "Cost of" --filter "Selecting VF" --filter-out-after "Selecting VF" --version 6 |
| ; REQUIRES: asserts |
| ; RUN: opt -passes=loop-vectorize -debug-only=loop-vectorize -disable-output < %s 2>&1 | FileCheck %s |
| |
| target triple = "aarch64-none-elf" |
| |
| ; fmaxnum reduction involves generating a vector unordered fcmp which is |
| ; comparatively expensive. This makes it only profitable for VF 4, so we can |
| ; vectorize when the data type is f32, but not when it's f64 where the max VF |
| ; is 2. |
| |
| define float @fmaxnum_reduction_f32(float %base, i32 %n) { |
| ; CHECK-LABEL: 'fmaxnum_reduction_f32' |
| ; CHECK: Cost of 1 for VF 2: ir<%iv> = WIDEN-INDUCTION nuw nsw ir<0>, ir<1>, vp<[[VP0:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: WIDEN-REDUCTION-PHI ir<%max> = phi (fmaxnum) ir<-1.000000e+07>, ir<%max.next> |
| ; CHECK: Cost of 1 for VF 2: WIDEN-CAST ir<%iv.f> = sitofp ir<%iv> to float |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%v> = fadd ir<%base>, ir<%iv.f> |
| ; CHECK: Cost of 1 for VF 2: WIDEN-INTRINSIC ir<%max.next> = call llvm.maxnum(ir<%max>, ir<%v>) |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<%index.next> = add nuw vp<[[VP3:%[0-9]+]]>, vp<[[VP1:%[0-9]+]]> |
| ; CHECK: Cost of 3 for VF 2: EMIT vp<[[VP4:%[0-9]+]]> = fcmp uno ir<%v>, ir<%v> |
| ; CHECK: Cost of 2 for VF 2: EMIT vp<[[VP5:%[0-9]+]]> = any-of vp<[[VP4]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP6:%[0-9]+]]> = icmp eq vp<%index.next>, vp<[[VP2:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP7:%[0-9]+]]> = or vp<[[VP5]]>, vp<[[VP6]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT branch-on-cond vp<[[VP7]]> |
| ; CHECK: Cost of 0 for VF 2: vector loop backedge |
| ; CHECK: Cost of 1 for VF 2: canonical IV increment |
| ; CHECK: Cost of 0 for VF 2: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP10:%[0-9]+]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 2: EMIT-SCALAR vp<%bc.merge.rdx> = phi [ vp<[[VP11:%[0-9]+]]>, middle.block ], [ ir<-1.000000e+07>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 2: IR %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 2: IR %max = phi float [ -1.000000e+07, %entry ], [ %max.next, %loop ] (extra operand: vp<%bc.merge.rdx> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 2: IR %iv.f = sitofp i32 %iv to float |
| ; CHECK: Cost of 0 for VF 2: IR %v = fadd float %base, %iv.f |
| ; CHECK: Cost of 0 for VF 2: IR %max.next = call float @llvm.maxnum.f32(float %max, float %v) |
| ; CHECK: Cost of 0 for VF 2: IR %iv.next = add nuw nsw i32 %iv, 1 |
| ; CHECK: Cost of 0 for VF 2: IR %ec = icmp eq i32 %iv.next, %n |
| ; CHECK: Cost of 2 for VF 2: EMIT vp<[[VP9:%[0-9]+]]> = select vp<[[VP5]]>, ir<%max>, ir<%max.next> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP10]]> = select vp<[[VP5]]>, vp<[[VP3]]>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP11]]> = compute-reduction-result (fmaxnum) vp<[[VP9]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP12:%[0-9]+]]> = not vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP13:%[0-9]+]]> = and vp<%cmp.n>, vp<[[VP12]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT branch-on-cond vp<[[VP13]]> |
| ; CHECK: Cost of 0 for VF 2: IR %max.next.lcssa = phi float [ %max.next, %loop ] (extra operand: vp<[[VP11]]> from middle.block) |
| ; CHECK: Cost of 1 for VF 4: ir<%iv> = WIDEN-INDUCTION nuw nsw ir<0>, ir<1>, vp<[[VP0]]> |
| ; CHECK: Cost of 0 for VF 4: WIDEN-REDUCTION-PHI ir<%max> = phi (fmaxnum) ir<-1.000000e+07>, ir<%max.next> |
| ; CHECK: Cost of 1 for VF 4: WIDEN-CAST ir<%iv.f> = sitofp ir<%iv> to float |
| ; CHECK: Cost of 1 for VF 4: WIDEN ir<%v> = fadd ir<%base>, ir<%iv.f> |
| ; CHECK: Cost of 1 for VF 4: WIDEN-INTRINSIC ir<%max.next> = call llvm.maxnum(ir<%max>, ir<%v>) |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<%index.next> = add nuw vp<[[VP3]]>, vp<[[VP1]]> |
| ; CHECK: Cost of 3 for VF 4: EMIT vp<[[VP4]]> = fcmp uno ir<%v>, ir<%v> |
| ; CHECK: Cost of 2 for VF 4: EMIT vp<[[VP5]]> = any-of vp<[[VP4]]> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP6]]> = icmp eq vp<%index.next>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP7]]> = or vp<[[VP5]]>, vp<[[VP6]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT branch-on-cond vp<[[VP7]]> |
| ; CHECK: Cost of 0 for VF 4: vector loop backedge |
| ; CHECK: Cost of 1 for VF 4: canonical IV increment |
| ; CHECK: Cost of 0 for VF 4: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP10]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 4: EMIT-SCALAR vp<%bc.merge.rdx> = phi [ vp<[[VP11]]>, middle.block ], [ ir<-1.000000e+07>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 4: IR %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 4: IR %max = phi float [ -1.000000e+07, %entry ], [ %max.next, %loop ] (extra operand: vp<%bc.merge.rdx> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 4: IR %iv.f = sitofp i32 %iv to float |
| ; CHECK: Cost of 0 for VF 4: IR %v = fadd float %base, %iv.f |
| ; CHECK: Cost of 0 for VF 4: IR %max.next = call float @llvm.maxnum.f32(float %max, float %v) |
| ; CHECK: Cost of 0 for VF 4: IR %iv.next = add nuw nsw i32 %iv, 1 |
| ; CHECK: Cost of 0 for VF 4: IR %ec = icmp eq i32 %iv.next, %n |
| ; CHECK: Cost of 2 for VF 4: EMIT vp<[[VP9]]> = select vp<[[VP5]]>, ir<%max>, ir<%max.next> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP10]]> = select vp<[[VP5]]>, vp<[[VP3]]>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP11]]> = compute-reduction-result (fmaxnum) vp<[[VP9]]> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP12]]> = not vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP13]]> = and vp<%cmp.n>, vp<[[VP12]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT branch-on-cond vp<[[VP13]]> |
| ; CHECK: Cost of 0 for VF 4: IR %max.next.lcssa = phi float [ %max.next, %loop ] (extra operand: vp<[[VP11]]> from middle.block) |
| ; CHECK: LV: Selecting VF: 4. |
| ; |
| entry: |
| br label %loop |
| |
| loop: |
| %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] |
| %max = phi float [ -1.000000e+07, %entry ], [ %max.next, %loop ] |
| %iv.f = sitofp i32 %iv to float |
| %v = fadd float %base, %iv.f |
| %max.next = call float @llvm.maxnum.f32(float %max, float %v) |
| %iv.next = add nuw nsw i32 %iv, 1 |
| %ec = icmp eq i32 %iv.next, %n |
| br i1 %ec, label %exit, label %loop |
| |
| exit: |
| ret float %max.next |
| } |
| |
| define double @fmaxnum_reduction_f64(double %base, i64 %n) { |
| ; CHECK-LABEL: 'fmaxnum_reduction_f64' |
| ; CHECK: Cost of 1 for VF 2: ir<%iv> = WIDEN-INDUCTION nuw nsw ir<0>, ir<1>, vp<[[VP0:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: WIDEN-REDUCTION-PHI ir<%max> = phi (fmaxnum) ir<-1.000000e+07>, ir<%max.next> |
| ; CHECK: Cost of 1 for VF 2: WIDEN-CAST ir<%iv.f> = sitofp ir<%iv> to double |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%v> = fadd ir<%base>, ir<%iv.f> |
| ; CHECK: Cost of 1 for VF 2: WIDEN-INTRINSIC ir<%max.next> = call llvm.maxnum(ir<%max>, ir<%v>) |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<%index.next> = add nuw vp<[[VP3:%[0-9]+]]>, vp<[[VP1:%[0-9]+]]> |
| ; CHECK: Cost of 3 for VF 2: EMIT vp<[[VP4:%[0-9]+]]> = fcmp uno ir<%v>, ir<%v> |
| ; CHECK: Cost of 2 for VF 2: EMIT vp<[[VP5:%[0-9]+]]> = any-of vp<[[VP4]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP6:%[0-9]+]]> = icmp eq vp<%index.next>, vp<[[VP2:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP7:%[0-9]+]]> = or vp<[[VP5]]>, vp<[[VP6]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT branch-on-cond vp<[[VP7]]> |
| ; CHECK: Cost of 0 for VF 2: vector loop backedge |
| ; CHECK: Cost of 1 for VF 2: canonical IV increment |
| ; CHECK: Cost of 0 for VF 2: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP10:%[0-9]+]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 2: EMIT-SCALAR vp<%bc.merge.rdx> = phi [ vp<[[VP11:%[0-9]+]]>, middle.block ], [ ir<-1.000000e+07>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 2: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 2: IR %max = phi double [ -1.000000e+07, %entry ], [ %max.next, %loop ] (extra operand: vp<%bc.merge.rdx> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 2: IR %iv.f = sitofp i64 %iv to double |
| ; CHECK: Cost of 0 for VF 2: IR %v = fadd double %base, %iv.f |
| ; CHECK: Cost of 0 for VF 2: IR %max.next = call double @llvm.maxnum.f64(double %max, double %v) |
| ; CHECK: Cost of 0 for VF 2: IR %iv.next = add nuw nsw i64 %iv, 1 |
| ; CHECK: Cost of 0 for VF 2: IR %ec = icmp eq i64 %iv.next, %n |
| ; CHECK: Cost of 2 for VF 2: EMIT vp<[[VP9:%[0-9]+]]> = select vp<[[VP5]]>, ir<%max>, ir<%max.next> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP10]]> = select vp<[[VP5]]>, vp<[[VP3]]>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP11]]> = compute-reduction-result (fmaxnum) vp<[[VP9]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP12:%[0-9]+]]> = not vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP13:%[0-9]+]]> = and vp<%cmp.n>, vp<[[VP12]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT branch-on-cond vp<[[VP13]]> |
| ; CHECK: Cost of 0 for VF 2: IR %max.next.lcssa = phi double [ %max.next, %loop ] (extra operand: vp<[[VP11]]> from middle.block) |
| ; CHECK: LV: Selecting VF: 1. |
| ; |
| entry: |
| br label %loop |
| |
| loop: |
| %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] |
| %max = phi double [ -1.000000e+07, %entry ], [ %max.next, %loop ] |
| %iv.f = sitofp i64 %iv to double |
| %v = fadd double %base, %iv.f |
| %max.next = call double @llvm.maxnum.f64(double %max, double %v) |
| %iv.next = add nuw nsw i64 %iv, 1 |
| %ec = icmp eq i64 %iv.next, %n |
| br i1 %ec, label %exit, label %loop |
| |
| exit: |
| ret double %max.next |
| } |
| |
| ; Vectorization of switch involves creating an icmp for each switch case. |
| |
| define i32 @switch_to_cmp(ptr %s, ptr %dst, i64 %n) { |
| ; CHECK-LABEL: 'switch_to_cmp' |
| ; CHECK: Cost of 0 for VF 2: forced scalar %gep = getelementptr i8, ptr %s, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: forced scalar %dst.gep = getelementptr i8, ptr %dst, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: WIDEN-REDUCTION-PHI ir<%c> = phi (add) vp<[[VP3:%[0-9]+]]>, ir<%c.next> |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP5:%[0-9]+]]> = SCALAR-STEPS vp<[[VP4:%[0-9]+]]>, ir<1>, vp<[[VP0:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: CLONE ir<%gep> = getelementptr ir<%s>, vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP6:%[0-9]+]]> = vector-pointer i8, ir<%gep>, ir<1> |
| ; CHECK: Cost of 4 for VF 2: WIDEN ir<%l> = load vp<[[VP6]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP7:%[0-9]+]]> = icmp eq ir<%l>, ir<1> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP8:%[0-9]+]]> = icmp eq ir<%l>, ir<2> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP9:%[0-9]+]]> = icmp eq ir<%l>, ir<3> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP10:%[0-9]+]]> = icmp eq ir<%l>, ir<4> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP11:%[0-9]+]]> = icmp eq ir<%l>, ir<5> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP12:%[0-9]+]]> = icmp eq ir<%l>, ir<6> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP13:%[0-9]+]]> = icmp eq ir<%l>, ir<7> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP14:%[0-9]+]]> = icmp eq ir<%l>, ir<8> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP15:%[0-9]+]]> = icmp eq ir<%l>, ir<9> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP16:%[0-9]+]]> = icmp eq ir<%l>, ir<10> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP17:%[0-9]+]]> = icmp eq ir<%l>, ir<11> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP18:%[0-9]+]]> = icmp eq ir<%l>, ir<12> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP19:%[0-9]+]]> = icmp eq ir<%l>, ir<13> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP20:%[0-9]+]]> = icmp eq ir<%l>, ir<14> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP21:%[0-9]+]]> = icmp eq ir<%l>, ir<15> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<[[VP22:%[0-9]+]]> = icmp eq ir<%l>, ir<0> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP23:%[0-9]+]]> = or vp<[[VP7]]>, vp<[[VP8]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP24:%[0-9]+]]> = or vp<[[VP23]]>, vp<[[VP9]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP25:%[0-9]+]]> = or vp<[[VP24]]>, vp<[[VP10]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP26:%[0-9]+]]> = or vp<[[VP25]]>, vp<[[VP11]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP27:%[0-9]+]]> = or vp<[[VP26]]>, vp<[[VP12]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP28:%[0-9]+]]> = or vp<[[VP27]]>, vp<[[VP13]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP29:%[0-9]+]]> = or vp<[[VP28]]>, vp<[[VP14]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP30:%[0-9]+]]> = or vp<[[VP29]]>, vp<[[VP15]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP31:%[0-9]+]]> = or vp<[[VP30]]>, vp<[[VP16]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP32:%[0-9]+]]> = or vp<[[VP31]]>, vp<[[VP17]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP33:%[0-9]+]]> = or vp<[[VP32]]>, vp<[[VP18]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP34:%[0-9]+]]> = or vp<[[VP33]]>, vp<[[VP19]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP35:%[0-9]+]]> = or vp<[[VP34]]>, vp<[[VP20]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP36:%[0-9]+]]> = or vp<[[VP35]]>, vp<[[VP21]]> |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%c.4> = add ir<%c>, ir<4> |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%c.1> = add ir<%c>, ir<1> |
| ; CHECK: Cost of 7 for VF 2: BLEND ir<%c.next> = ir<%c> ir<%c.4>/vp<[[VP22]]> ir<%c.1>/vp<[[VP36]]> |
| ; CHECK: Cost of 0 for VF 2: CLONE ir<%dst.gep> = getelementptr ir<%dst>, vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP37:%[0-9]+]]> = vector-pointer i8, ir<%dst.gep>, ir<1> |
| ; CHECK: Cost of 4 for VF 2: WIDEN store vp<[[VP37]]>, ir<%l> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<%index.next> = add nuw vp<[[VP4]]>, vp<[[VP1:%[0-9]+]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT branch-on-count vp<%index.next>, vp<[[VP2:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: vector loop backedge |
| ; CHECK: Cost of 1 for VF 2: canonical IV increment |
| ; CHECK: Cost of 0 for VF 2: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP2]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 2: EMIT-SCALAR vp<%bc.merge.rdx> = phi [ vp<[[VP39:%[0-9]+]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 2: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 2: IR %c = phi i32 [ 0, %entry ], [ %c.next, %loop.latch ] (extra operand: vp<%bc.merge.rdx> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 2: IR %gep = getelementptr i8, ptr %s, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: IR %l = load i8, ptr %gep, align 1 |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP3]]> = reduction-start-vector ir<0>, ir<0>, ir<1> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<[[VP39]]> = compute-reduction-result (add) ir<%c.next> |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT branch-on-cond vp<%cmp.n> |
| ; CHECK: Cost of 0 for VF 2: IR %c.next.lcssa = phi i32 [ %c.next, %loop.latch ] (extra operand: vp<[[VP39]]> from middle.block) |
| ; CHECK: Cost of 0 for VF 4: forced scalar %gep = getelementptr i8, ptr %s, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: forced scalar %dst.gep = getelementptr i8, ptr %dst, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: WIDEN-REDUCTION-PHI ir<%c> = phi (add) vp<[[VP3]]>, ir<%c.next> |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP5]]> = SCALAR-STEPS vp<[[VP4]]>, ir<1>, vp<[[VP0]]> |
| ; CHECK: Cost of 0 for VF 4: CLONE ir<%gep> = getelementptr ir<%s>, vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP6]]> = vector-pointer i8, ir<%gep>, ir<1> |
| ; CHECK: Cost of 2 for VF 4: WIDEN ir<%l> = load vp<[[VP6]]> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP7]]> = icmp eq ir<%l>, ir<1> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP8]]> = icmp eq ir<%l>, ir<2> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP9]]> = icmp eq ir<%l>, ir<3> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP10]]> = icmp eq ir<%l>, ir<4> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP11]]> = icmp eq ir<%l>, ir<5> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP12]]> = icmp eq ir<%l>, ir<6> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP13]]> = icmp eq ir<%l>, ir<7> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP14]]> = icmp eq ir<%l>, ir<8> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP15]]> = icmp eq ir<%l>, ir<9> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP16]]> = icmp eq ir<%l>, ir<10> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP17]]> = icmp eq ir<%l>, ir<11> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP18]]> = icmp eq ir<%l>, ir<12> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP19]]> = icmp eq ir<%l>, ir<13> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP20]]> = icmp eq ir<%l>, ir<14> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP21]]> = icmp eq ir<%l>, ir<15> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<[[VP22]]> = icmp eq ir<%l>, ir<0> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP23]]> = or vp<[[VP7]]>, vp<[[VP8]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP24]]> = or vp<[[VP23]]>, vp<[[VP9]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP25]]> = or vp<[[VP24]]>, vp<[[VP10]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP26]]> = or vp<[[VP25]]>, vp<[[VP11]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP27]]> = or vp<[[VP26]]>, vp<[[VP12]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP28]]> = or vp<[[VP27]]>, vp<[[VP13]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP29]]> = or vp<[[VP28]]>, vp<[[VP14]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP30]]> = or vp<[[VP29]]>, vp<[[VP15]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP31]]> = or vp<[[VP30]]>, vp<[[VP16]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP32]]> = or vp<[[VP31]]>, vp<[[VP17]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP33]]> = or vp<[[VP32]]>, vp<[[VP18]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP34]]> = or vp<[[VP33]]>, vp<[[VP19]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP35]]> = or vp<[[VP34]]>, vp<[[VP20]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP36]]> = or vp<[[VP35]]>, vp<[[VP21]]> |
| ; CHECK: Cost of 1 for VF 4: WIDEN ir<%c.4> = add ir<%c>, ir<4> |
| ; CHECK: Cost of 1 for VF 4: WIDEN ir<%c.1> = add ir<%c>, ir<1> |
| ; CHECK: Cost of 13 for VF 4: BLEND ir<%c.next> = ir<%c> ir<%c.4>/vp<[[VP22]]> ir<%c.1>/vp<[[VP36]]> |
| ; CHECK: Cost of 0 for VF 4: CLONE ir<%dst.gep> = getelementptr ir<%dst>, vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP37]]> = vector-pointer i8, ir<%dst.gep>, ir<1> |
| ; CHECK: Cost of 2 for VF 4: WIDEN store vp<[[VP37]]>, ir<%l> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<%index.next> = add nuw vp<[[VP4]]>, vp<[[VP1]]> |
| ; CHECK: Cost of 1 for VF 4: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 4: vector loop backedge |
| ; CHECK: Cost of 1 for VF 4: canonical IV increment |
| ; CHECK: Cost of 0 for VF 4: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP2]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 4: EMIT-SCALAR vp<%bc.merge.rdx> = phi [ vp<[[VP39]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 4: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 4: IR %c = phi i32 [ 0, %entry ], [ %c.next, %loop.latch ] (extra operand: vp<%bc.merge.rdx> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 4: IR %gep = getelementptr i8, ptr %s, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: IR %l = load i8, ptr %gep, align 1 |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP3]]> = reduction-start-vector ir<0>, ir<0>, ir<1> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<[[VP39]]> = compute-reduction-result (add) ir<%c.next> |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT branch-on-cond vp<%cmp.n> |
| ; CHECK: Cost of 0 for VF 4: IR %c.next.lcssa = phi i32 [ %c.next, %loop.latch ] (extra operand: vp<[[VP39]]> from middle.block) |
| ; CHECK: Cost of 0 for VF 8: forced scalar %gep = getelementptr i8, ptr %s, i64 %iv |
| ; CHECK: Cost of 0 for VF 8: forced scalar %dst.gep = getelementptr i8, ptr %dst, i64 %iv |
| ; CHECK: Cost of 0 for VF 8: WIDEN-REDUCTION-PHI ir<%c> = phi (add) vp<[[VP3]]>, ir<%c.next> |
| ; CHECK: Cost of 0 for VF 8: vp<[[VP5]]> = SCALAR-STEPS vp<[[VP4]]>, ir<1>, vp<[[VP0]]> |
| ; CHECK: Cost of 0 for VF 8: CLONE ir<%gep> = getelementptr ir<%s>, vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 8: vp<[[VP6]]> = vector-pointer i8, ir<%gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 8: WIDEN ir<%l> = load vp<[[VP6]]> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP7]]> = icmp eq ir<%l>, ir<1> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP8]]> = icmp eq ir<%l>, ir<2> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP9]]> = icmp eq ir<%l>, ir<3> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP10]]> = icmp eq ir<%l>, ir<4> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP11]]> = icmp eq ir<%l>, ir<5> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP12]]> = icmp eq ir<%l>, ir<6> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP13]]> = icmp eq ir<%l>, ir<7> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP14]]> = icmp eq ir<%l>, ir<8> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP15]]> = icmp eq ir<%l>, ir<9> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP16]]> = icmp eq ir<%l>, ir<10> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP17]]> = icmp eq ir<%l>, ir<11> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP18]]> = icmp eq ir<%l>, ir<12> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP19]]> = icmp eq ir<%l>, ir<13> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP20]]> = icmp eq ir<%l>, ir<14> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP21]]> = icmp eq ir<%l>, ir<15> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<[[VP22]]> = icmp eq ir<%l>, ir<0> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP23]]> = or vp<[[VP7]]>, vp<[[VP8]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP24]]> = or vp<[[VP23]]>, vp<[[VP9]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP25]]> = or vp<[[VP24]]>, vp<[[VP10]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP26]]> = or vp<[[VP25]]>, vp<[[VP11]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP27]]> = or vp<[[VP26]]>, vp<[[VP12]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP28]]> = or vp<[[VP27]]>, vp<[[VP13]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP29]]> = or vp<[[VP28]]>, vp<[[VP14]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP30]]> = or vp<[[VP29]]>, vp<[[VP15]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP31]]> = or vp<[[VP30]]>, vp<[[VP16]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP32]]> = or vp<[[VP31]]>, vp<[[VP17]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP33]]> = or vp<[[VP32]]>, vp<[[VP18]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP34]]> = or vp<[[VP33]]>, vp<[[VP19]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP35]]> = or vp<[[VP34]]>, vp<[[VP20]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP36]]> = or vp<[[VP35]]>, vp<[[VP21]]> |
| ; CHECK: Cost of 2 for VF 8: WIDEN ir<%c.4> = add ir<%c>, ir<4> |
| ; CHECK: Cost of 2 for VF 8: WIDEN ir<%c.1> = add ir<%c>, ir<1> |
| ; CHECK: Cost of 10 for VF 8: BLEND ir<%c.next> = ir<%c> ir<%c.4>/vp<[[VP22]]> ir<%c.1>/vp<[[VP36]]> |
| ; CHECK: Cost of 0 for VF 8: CLONE ir<%dst.gep> = getelementptr ir<%dst>, vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 8: vp<[[VP37]]> = vector-pointer i8, ir<%dst.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 8: WIDEN store vp<[[VP37]]>, ir<%l> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<%index.next> = add nuw vp<[[VP4]]>, vp<[[VP1]]> |
| ; CHECK: Cost of 1 for VF 8: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 8: vector loop backedge |
| ; CHECK: Cost of 1 for VF 8: canonical IV increment |
| ; CHECK: Cost of 0 for VF 8: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP2]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 8: EMIT-SCALAR vp<%bc.merge.rdx> = phi [ vp<[[VP39]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 8: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 8: IR %c = phi i32 [ 0, %entry ], [ %c.next, %loop.latch ] (extra operand: vp<%bc.merge.rdx> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 8: IR %gep = getelementptr i8, ptr %s, i64 %iv |
| ; CHECK: Cost of 0 for VF 8: IR %l = load i8, ptr %gep, align 1 |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP3]]> = reduction-start-vector ir<0>, ir<0>, ir<1> |
| ; CHECK: Cost of 0 for VF 8: EMIT vp<[[VP39]]> = compute-reduction-result (add) ir<%c.next> |
| ; CHECK: Cost of 1 for VF 8: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 8: EMIT branch-on-cond vp<%cmp.n> |
| ; CHECK: Cost of 0 for VF 8: IR %c.next.lcssa = phi i32 [ %c.next, %loop.latch ] (extra operand: vp<[[VP39]]> from middle.block) |
| ; CHECK: Cost of 0 for VF 16: forced scalar %gep = getelementptr i8, ptr %s, i64 %iv |
| ; CHECK: Cost of 0 for VF 16: forced scalar %dst.gep = getelementptr i8, ptr %dst, i64 %iv |
| ; CHECK: Cost of 0 for VF 16: WIDEN-REDUCTION-PHI ir<%c> = phi (add) vp<[[VP3]]>, ir<%c.next> |
| ; CHECK: Cost of 0 for VF 16: vp<[[VP5]]> = SCALAR-STEPS vp<[[VP4]]>, ir<1>, vp<[[VP0]]> |
| ; CHECK: Cost of 0 for VF 16: CLONE ir<%gep> = getelementptr ir<%s>, vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 16: vp<[[VP6]]> = vector-pointer i8, ir<%gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 16: WIDEN ir<%l> = load vp<[[VP6]]> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP7]]> = icmp eq ir<%l>, ir<1> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP8]]> = icmp eq ir<%l>, ir<2> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP9]]> = icmp eq ir<%l>, ir<3> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP10]]> = icmp eq ir<%l>, ir<4> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP11]]> = icmp eq ir<%l>, ir<5> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP12]]> = icmp eq ir<%l>, ir<6> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP13]]> = icmp eq ir<%l>, ir<7> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP14]]> = icmp eq ir<%l>, ir<8> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP15]]> = icmp eq ir<%l>, ir<9> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP16]]> = icmp eq ir<%l>, ir<10> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP17]]> = icmp eq ir<%l>, ir<11> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP18]]> = icmp eq ir<%l>, ir<12> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP19]]> = icmp eq ir<%l>, ir<13> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP20]]> = icmp eq ir<%l>, ir<14> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP21]]> = icmp eq ir<%l>, ir<15> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<[[VP22]]> = icmp eq ir<%l>, ir<0> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP23]]> = or vp<[[VP7]]>, vp<[[VP8]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP24]]> = or vp<[[VP23]]>, vp<[[VP9]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP25]]> = or vp<[[VP24]]>, vp<[[VP10]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP26]]> = or vp<[[VP25]]>, vp<[[VP11]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP27]]> = or vp<[[VP26]]>, vp<[[VP12]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP28]]> = or vp<[[VP27]]>, vp<[[VP13]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP29]]> = or vp<[[VP28]]>, vp<[[VP14]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP30]]> = or vp<[[VP29]]>, vp<[[VP15]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP31]]> = or vp<[[VP30]]>, vp<[[VP16]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP32]]> = or vp<[[VP31]]>, vp<[[VP17]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP33]]> = or vp<[[VP32]]>, vp<[[VP18]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP34]]> = or vp<[[VP33]]>, vp<[[VP19]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP35]]> = or vp<[[VP34]]>, vp<[[VP20]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP36]]> = or vp<[[VP35]]>, vp<[[VP21]]> |
| ; CHECK: Cost of 4 for VF 16: WIDEN ir<%c.4> = add ir<%c>, ir<4> |
| ; CHECK: Cost of 4 for VF 16: WIDEN ir<%c.1> = add ir<%c>, ir<1> |
| ; CHECK: Cost of 20 for VF 16: BLEND ir<%c.next> = ir<%c> ir<%c.4>/vp<[[VP22]]> ir<%c.1>/vp<[[VP36]]> |
| ; CHECK: Cost of 0 for VF 16: CLONE ir<%dst.gep> = getelementptr ir<%dst>, vp<[[VP5]]> |
| ; CHECK: Cost of 0 for VF 16: vp<[[VP37]]> = vector-pointer i8, ir<%dst.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 16: WIDEN store vp<[[VP37]]>, ir<%l> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<%index.next> = add nuw vp<[[VP4]]>, vp<[[VP1]]> |
| ; CHECK: Cost of 1 for VF 16: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 16: vector loop backedge |
| ; CHECK: Cost of 1 for VF 16: canonical IV increment |
| ; CHECK: Cost of 0 for VF 16: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP2]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 16: EMIT-SCALAR vp<%bc.merge.rdx> = phi [ vp<[[VP39]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 16: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 16: IR %c = phi i32 [ 0, %entry ], [ %c.next, %loop.latch ] (extra operand: vp<%bc.merge.rdx> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 16: IR %gep = getelementptr i8, ptr %s, i64 %iv |
| ; CHECK: Cost of 0 for VF 16: IR %l = load i8, ptr %gep, align 1 |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP3]]> = reduction-start-vector ir<0>, ir<0>, ir<1> |
| ; CHECK: Cost of 0 for VF 16: EMIT vp<[[VP39]]> = compute-reduction-result (add) ir<%c.next> |
| ; CHECK: Cost of 1 for VF 16: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 16: EMIT branch-on-cond vp<%cmp.n> |
| ; CHECK: Cost of 0 for VF 16: IR %c.next.lcssa = phi i32 [ %c.next, %loop.latch ] (extra operand: vp<[[VP39]]> from middle.block) |
| ; CHECK: LV: Selecting VF: 16. |
| ; |
| entry: |
| br label %loop.header |
| |
| loop.header: |
| %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] |
| %c = phi i32 [ 0, %entry ], [ %c.next, %loop.latch ] |
| %gep = getelementptr i8, ptr %s, i64 %iv |
| %l = load i8, ptr %gep |
| switch i8 %l, label %loop.latch [ |
| i8 1, label %add.1 |
| i8 2, label %add.1 |
| i8 3, label %add.1 |
| i8 4, label %add.1 |
| i8 5, label %add.1 |
| i8 6, label %add.1 |
| i8 7, label %add.1 |
| i8 8, label %add.1 |
| i8 9, label %add.1 |
| i8 10, label %add.1 |
| i8 11, label %add.1 |
| i8 12, label %add.1 |
| i8 13, label %add.1 |
| i8 14, label %add.1 |
| i8 15, label %add.1 |
| i8 0, label %add.4 |
| ] |
| |
| add.1: |
| %c.1 = add nsw i32 %c, 1 |
| br label %loop.latch |
| |
| add.4: |
| %c.4 = add nsw i32 %c, 4 |
| br label %loop.latch |
| |
| loop.latch: |
| %c.next = phi i32 [ %c, %loop.header ], [ %c.1, %add.1 ], [ %c.4, %add.4 ] |
| %dst.gep = getelementptr i8, ptr %dst, i64 %iv |
| store i8 %l, ptr %dst.gep |
| %iv.next = add nuw nsw i64 %iv, 1 |
| %ec = icmp eq i64 %iv.next, %n |
| br i1 %ec, label %exit, label %loop.header |
| |
| exit: |
| ret i32 %c.next |
| } |
| |
| ; The predicate of a blend's fcmp mask is passed to the cost model. AArch64 can |
| ; lower a select fed by an fcmp olt using a FCMxx & BFI pair, while it cannot do |
| ; so for fcmp uno, which is more expensive. |
| |
| define void @blend_fcmp_olt_f32(ptr noalias %dst, ptr noalias %src, i64 %n) { |
| ; CHECK-LABEL: 'blend_fcmp_olt_f32' |
| ; CHECK: Cost of 0 for VF 2: forced scalar %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: forced scalar %dst.gep = getelementptr inbounds float, ptr %dst, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP4:%[0-9]+]]> = SCALAR-STEPS vp<[[VP3:%[0-9]+]]>, ir<1>, vp<[[VP0:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: CLONE ir<%src.gep> = getelementptr inbounds ir<%src>, vp<[[VP4]]> |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP5:%[0-9]+]]> = vector-pointer inbounds float, ir<%src.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%l> = load vp<[[VP5]]> |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%c> = fcmp olt ir<%l>, ir<0.000000e+00> |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%add> = fadd ir<%l>, ir<1.000000e+00> |
| ; CHECK: Cost of 1 for VF 2: BLEND ir<%p> = ir<%l> ir<%add>/ir<%c> |
| ; CHECK: Cost of 0 for VF 2: CLONE ir<%dst.gep> = getelementptr inbounds ir<%dst>, vp<[[VP4]]> |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP6:%[0-9]+]]> = vector-pointer inbounds float, ir<%dst.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 2: WIDEN store vp<[[VP6]]>, ir<%p> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<%index.next> = add nuw vp<[[VP3]]>, vp<[[VP1:%[0-9]+]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT branch-on-count vp<%index.next>, vp<[[VP2:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: vector loop backedge |
| ; CHECK: Cost of 1 for VF 2: canonical IV increment |
| ; CHECK: Cost of 0 for VF 2: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP2]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 2: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 2: IR %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: IR %l = load float, ptr %src.gep, align 4 |
| ; CHECK: Cost of 0 for VF 2: IR %c = fcmp olt float %l, 0.000000e+00 |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT branch-on-cond vp<%cmp.n> |
| ; CHECK: Cost of 0 for VF 4: forced scalar %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: forced scalar %dst.gep = getelementptr inbounds float, ptr %dst, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP4]]> = SCALAR-STEPS vp<[[VP3]]>, ir<1>, vp<[[VP0]]> |
| ; CHECK: Cost of 0 for VF 4: CLONE ir<%src.gep> = getelementptr inbounds ir<%src>, vp<[[VP4]]> |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP5]]> = vector-pointer inbounds float, ir<%src.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 4: WIDEN ir<%l> = load vp<[[VP5]]> |
| ; CHECK: Cost of 1 for VF 4: WIDEN ir<%c> = fcmp olt ir<%l>, ir<0.000000e+00> |
| ; CHECK: Cost of 1 for VF 4: WIDEN ir<%add> = fadd ir<%l>, ir<1.000000e+00> |
| ; CHECK: Cost of 1 for VF 4: BLEND ir<%p> = ir<%l> ir<%add>/ir<%c> |
| ; CHECK: Cost of 0 for VF 4: CLONE ir<%dst.gep> = getelementptr inbounds ir<%dst>, vp<[[VP4]]> |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP6]]> = vector-pointer inbounds float, ir<%dst.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 4: WIDEN store vp<[[VP6]]>, ir<%p> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<%index.next> = add nuw vp<[[VP3]]>, vp<[[VP1]]> |
| ; CHECK: Cost of 1 for VF 4: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 4: vector loop backedge |
| ; CHECK: Cost of 1 for VF 4: canonical IV increment |
| ; CHECK: Cost of 0 for VF 4: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP2]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 4: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 4: IR %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: IR %l = load float, ptr %src.gep, align 4 |
| ; CHECK: Cost of 0 for VF 4: IR %c = fcmp olt float %l, 0.000000e+00 |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT branch-on-cond vp<%cmp.n> |
| ; CHECK: LV: Selecting VF: 4. |
| ; |
| entry: |
| br label %loop.header |
| |
| loop.header: |
| %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] |
| %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| %l = load float, ptr %src.gep, align 4 |
| %c = fcmp olt float %l, 0.000000e+00 |
| br i1 %c, label %then, label %loop.latch |
| |
| then: |
| %add = fadd float %l, 1.000000e+00 |
| br label %loop.latch |
| |
| loop.latch: |
| %p = phi float [ %l, %loop.header ], [ %add, %then ] |
| %dst.gep = getelementptr inbounds float, ptr %dst, i64 %iv |
| store float %p, ptr %dst.gep, align 4 |
| %iv.next = add nuw nsw i64 %iv, 1 |
| %ec = icmp eq i64 %iv.next, %n |
| br i1 %ec, label %exit, label %loop.header |
| |
| exit: |
| ret void |
| } |
| |
| define void @blend_fcmp_uno_f32(ptr noalias %dst, ptr noalias %src, i64 %n) { |
| ; CHECK-LABEL: 'blend_fcmp_uno_f32' |
| ; CHECK: Cost of 0 for VF 2: forced scalar %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: forced scalar %dst.gep = getelementptr inbounds float, ptr %dst, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP4:%[0-9]+]]> = SCALAR-STEPS vp<[[VP3:%[0-9]+]]>, ir<1>, vp<[[VP0:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: CLONE ir<%src.gep> = getelementptr inbounds ir<%src>, vp<[[VP4]]> |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP5:%[0-9]+]]> = vector-pointer inbounds float, ir<%src.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%l> = load vp<[[VP5]]> |
| ; CHECK: Cost of 3 for VF 2: WIDEN ir<%c> = fcmp uno ir<%l>, ir<0.000000e+00> |
| ; CHECK: Cost of 1 for VF 2: WIDEN ir<%add> = fadd ir<%l>, ir<1.000000e+00> |
| ; CHECK: Cost of 2 for VF 2: BLEND ir<%p> = ir<%l> ir<%add>/ir<%c> |
| ; CHECK: Cost of 0 for VF 2: CLONE ir<%dst.gep> = getelementptr inbounds ir<%dst>, vp<[[VP4]]> |
| ; CHECK: Cost of 0 for VF 2: vp<[[VP6:%[0-9]+]]> = vector-pointer inbounds float, ir<%dst.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 2: WIDEN store vp<[[VP6]]>, ir<%p> |
| ; CHECK: Cost of 0 for VF 2: EMIT vp<%index.next> = add nuw vp<[[VP3]]>, vp<[[VP1:%[0-9]+]]> |
| ; CHECK: Cost of 1 for VF 2: EMIT branch-on-count vp<%index.next>, vp<[[VP2:%[0-9]+]]> |
| ; CHECK: Cost of 0 for VF 2: vector loop backedge |
| ; CHECK: Cost of 1 for VF 2: canonical IV increment |
| ; CHECK: Cost of 0 for VF 2: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP2]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 2: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 2: IR %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| ; CHECK: Cost of 0 for VF 2: IR %l = load float, ptr %src.gep, align 4 |
| ; CHECK: Cost of 0 for VF 2: IR %c = fcmp uno float %l, 0.000000e+00 |
| ; CHECK: Cost of 1 for VF 2: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 2: EMIT branch-on-cond vp<%cmp.n> |
| ; CHECK: Cost of 0 for VF 4: forced scalar %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: forced scalar %dst.gep = getelementptr inbounds float, ptr %dst, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP4]]> = SCALAR-STEPS vp<[[VP3]]>, ir<1>, vp<[[VP0]]> |
| ; CHECK: Cost of 0 for VF 4: CLONE ir<%src.gep> = getelementptr inbounds ir<%src>, vp<[[VP4]]> |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP5]]> = vector-pointer inbounds float, ir<%src.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 4: WIDEN ir<%l> = load vp<[[VP5]]> |
| ; CHECK: Cost of 3 for VF 4: WIDEN ir<%c> = fcmp uno ir<%l>, ir<0.000000e+00> |
| ; CHECK: Cost of 1 for VF 4: WIDEN ir<%add> = fadd ir<%l>, ir<1.000000e+00> |
| ; CHECK: Cost of 2 for VF 4: BLEND ir<%p> = ir<%l> ir<%add>/ir<%c> |
| ; CHECK: Cost of 0 for VF 4: CLONE ir<%dst.gep> = getelementptr inbounds ir<%dst>, vp<[[VP4]]> |
| ; CHECK: Cost of 0 for VF 4: vp<[[VP6]]> = vector-pointer inbounds float, ir<%dst.gep>, ir<1> |
| ; CHECK: Cost of 1 for VF 4: WIDEN store vp<[[VP6]]>, ir<%p> |
| ; CHECK: Cost of 0 for VF 4: EMIT vp<%index.next> = add nuw vp<[[VP3]]>, vp<[[VP1]]> |
| ; CHECK: Cost of 1 for VF 4: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 4: vector loop backedge |
| ; CHECK: Cost of 1 for VF 4: canonical IV increment |
| ; CHECK: Cost of 0 for VF 4: EMIT-SCALAR vp<%bc.resume.val> = phi [ vp<[[VP2]]>, middle.block ], [ ir<0>, ir-bb<entry> ] |
| ; CHECK: Cost of 0 for VF 4: IR %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] (extra operand: vp<%bc.resume.val> from scalar.ph) |
| ; CHECK: Cost of 0 for VF 4: IR %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| ; CHECK: Cost of 0 for VF 4: IR %l = load float, ptr %src.gep, align 4 |
| ; CHECK: Cost of 0 for VF 4: IR %c = fcmp uno float %l, 0.000000e+00 |
| ; CHECK: Cost of 1 for VF 4: EMIT vp<%cmp.n> = icmp eq ir<%n>, vp<[[VP2]]> |
| ; CHECK: Cost of 0 for VF 4: EMIT branch-on-cond vp<%cmp.n> |
| ; CHECK: LV: Selecting VF: 4. |
| ; |
| entry: |
| br label %loop.header |
| |
| loop.header: |
| %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ] |
| %src.gep = getelementptr inbounds float, ptr %src, i64 %iv |
| %l = load float, ptr %src.gep, align 4 |
| %c = fcmp uno float %l, 0.000000e+00 |
| br i1 %c, label %then, label %loop.latch |
| |
| then: |
| %add = fadd float %l, 1.000000e+00 |
| br label %loop.latch |
| |
| loop.latch: |
| %p = phi float [ %l, %loop.header ], [ %add, %then ] |
| %dst.gep = getelementptr inbounds float, ptr %dst, i64 %iv |
| store float %p, ptr %dst.gep, align 4 |
| %iv.next = add nuw nsw i64 %iv, 1 |
| %ec = icmp eq i64 %iv.next, %n |
| br i1 %ec, label %exit, label %loop.header |
| |
| exit: |
| ret void |
| } |