89 lines · plain
1; RUN: opt -passes=loop-vectorize -mtriple=thumbv7s-apple-ios6.0.0 -S -enable-interleaved-mem-accesses=false < %s | FileCheck %s2 3target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"4 5@kernel = global [512 x float] zeroinitializer, align 46@kernel2 = global [512 x float] zeroinitializer, align 47@kernel3 = global [512 x float] zeroinitializer, align 48@kernel4 = global [512 x float] zeroinitializer, align 49@src_data = global [1536 x float] zeroinitializer, align 410@r_ = global i8 0, align 411@g_ = global i8 0, align 412@b_ = global i8 0, align 413 14; We don't want to vectorize most loops containing gathers because they are15; expensive. This function represents a point where vectorization starts to16; become beneficial.17; Make sure we are conservative and don't vectorize it.18; CHECK-NOT: <2 x float>19; CHECK-NOT: <4 x float>20 21define void @_Z4testmm(i32 %size, i32 %offset) {22entry:23 %cmp53 = icmp eq i32 %size, 024 br i1 %cmp53, label %for.end, label %for.body.lr.ph25 26for.body.lr.ph:27 br label %for.body28 29for.body:30 %r.057 = phi float [ 0.000000e+00, %for.body.lr.ph ], [ %add10, %for.body ]31 %g.056 = phi float [ 0.000000e+00, %for.body.lr.ph ], [ %add20, %for.body ]32 %v.055 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]33 %b.054 = phi float [ 0.000000e+00, %for.body.lr.ph ], [ %add30, %for.body ]34 %add = add i32 %v.055, %offset35 %mul = mul i32 %add, 336 %arrayidx = getelementptr inbounds [1536 x float], ptr @src_data, i32 0, i32 %mul37 %0 = load float, ptr %arrayidx, align 438 %arrayidx2 = getelementptr inbounds [512 x float], ptr @kernel, i32 0, i32 %v.05539 %1 = load float, ptr %arrayidx2, align 440 %mul3 = fmul fast float %0, %141 %arrayidx4 = getelementptr inbounds [512 x float], ptr @kernel2, i32 0, i32 %v.05542 %2 = load float, ptr %arrayidx4, align 443 %mul5 = fmul fast float %mul3, %244 %arrayidx6 = getelementptr inbounds [512 x float], ptr @kernel3, i32 0, i32 %v.05545 %3 = load float, ptr %arrayidx6, align 446 %mul7 = fmul fast float %mul5, %347 %arrayidx8 = getelementptr inbounds [512 x float], ptr @kernel4, i32 0, i32 %v.05548 %4 = load float, ptr %arrayidx8, align 449 %mul9 = fmul fast float %mul7, %450 %add10 = fadd fast float %r.057, %mul951 %arrayidx.sum = add i32 %mul, 152 %arrayidx11 = getelementptr inbounds [1536 x float], ptr @src_data, i32 0, i32 %arrayidx.sum53 %5 = load float, ptr %arrayidx11, align 454 %mul13 = fmul fast float %1, %555 %mul15 = fmul fast float %2, %mul1356 %mul17 = fmul fast float %3, %mul1557 %mul19 = fmul fast float %4, %mul1758 %add20 = fadd fast float %g.056, %mul1959 %arrayidx.sum52 = add i32 %mul, 260 %arrayidx21 = getelementptr inbounds [1536 x float], ptr @src_data, i32 0, i32 %arrayidx.sum5261 %6 = load float, ptr %arrayidx21, align 462 %mul23 = fmul fast float %1, %663 %mul25 = fmul fast float %2, %mul2364 %mul27 = fmul fast float %3, %mul2565 %mul29 = fmul fast float %4, %mul2766 %add30 = fadd fast float %b.054, %mul2967 %inc = add i32 %v.055, 168 %exitcond = icmp ne i32 %inc, %size69 br i1 %exitcond, label %for.body, label %for.cond.for.end_crit_edge70 71for.cond.for.end_crit_edge:72 %add30.lcssa = phi float [ %add30, %for.body ]73 %add20.lcssa = phi float [ %add20, %for.body ]74 %add10.lcssa = phi float [ %add10, %for.body ]75 %phitmp = fptoui float %add10.lcssa to i876 %phitmp60 = fptoui float %add20.lcssa to i877 %phitmp61 = fptoui float %add30.lcssa to i878 br label %for.end79 80for.end:81 %r.0.lcssa = phi i8 [ %phitmp, %for.cond.for.end_crit_edge ], [ 0, %entry ]82 %g.0.lcssa = phi i8 [ %phitmp60, %for.cond.for.end_crit_edge ], [ 0, %entry ]83 %b.0.lcssa = phi i8 [ %phitmp61, %for.cond.for.end_crit_edge ], [ 0, %entry ]84 store i8 %r.0.lcssa, ptr @r_, align 485 store i8 %g.0.lcssa, ptr @g_, align 486 store i8 %b.0.lcssa, ptr @b_, align 487 ret void88}89