I changed the max. recursion depth to 36, and tried then 1000 (from the
original value of 12) and it did not improve SLP's optimization
capabilities on my input function. For example, the attached function is
(by design) perfectly vectorizable into 4-packed single precision SIMD
load/add/store. The SLP vectorizer just does nothing with it.
I ran
opt -default-data-layout="e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-basicaa -slp-vectorizer -S < mod_vec_p_vec.ll
with RecursionMaxDepth = 12, 36, and 1000.
Thanks,
Frank
On 08/07/2014 12:57 PM, Renato Golin wrote:> On 7 August 2014 17:33, Chad Rosier <mcrosier at codeaurora.org>
wrote:
>> You might consider filing a bug (llvm.org/bugs) requesting a flag, but
I
>> don't know if the code owners want to expose such a flag.
> I'm not sure that's a good idea as a raw access to that limit, as
> there are no guarantees that it'll stay the same. But maybe a flag
> turning some "aggressive" behaviour from SLP that would then
change
> that threshold (and maybe some others) would be a good flag to have, I
> think.
>
> This could maybe be a way to deprecate the BB vectorizer faster than
> we would otherwise. But that would depend on all missing BB features
> to be implemented in SLP.
>
> An item in bugzilla seems appropriate.
>
> cheers,
> --renato
-------------- next part --------------
define void @main(float* noalias %arg0, float* noalias %arg1, float* noalias
%arg2) {
entrypoint:
%0 = getelementptr float* %arg1, i32 0
%1 = load float* %0
%2 = getelementptr float* %arg1, i32 4
%3 = load float* %2
%4 = getelementptr float* %arg1, i32 8
%5 = load float* %4
%6 = getelementptr float* %arg1, i32 12
%7 = load float* %6
%8 = getelementptr float* %arg1, i32 16
%9 = load float* %8
%10 = getelementptr float* %arg1, i32 20
%11 = load float* %10
%12 = getelementptr float* %arg2, i32 0
%13 = load float* %12
%14 = getelementptr float* %arg2, i32 4
%15 = load float* %14
%16 = getelementptr float* %arg2, i32 8
%17 = load float* %16
%18 = getelementptr float* %arg2, i32 12
%19 = load float* %18
%20 = getelementptr float* %arg2, i32 16
%21 = load float* %20
%22 = getelementptr float* %arg2, i32 20
%23 = load float* %22
%24 = fadd float %15, %3
%25 = fadd float %13, %1
%26 = fadd float %19, %7
%27 = fadd float %17, %5
%28 = fadd float %23, %11
%29 = fadd float %21, %9
%30 = getelementptr float* %arg0, i32 0
store float %25, float* %30
%31 = getelementptr float* %arg0, i32 4
store float %24, float* %31
%32 = getelementptr float* %arg0, i32 8
store float %27, float* %32
%33 = getelementptr float* %arg0, i32 12
store float %26, float* %33
%34 = getelementptr float* %arg0, i32 16
store float %29, float* %34
%35 = getelementptr float* %arg0, i32 20
store float %28, float* %35
%36 = getelementptr float* %arg1, i32 1
%37 = load float* %36
%38 = getelementptr float* %arg1, i32 5
%39 = load float* %38
%40 = getelementptr float* %arg1, i32 9
%41 = load float* %40
%42 = getelementptr float* %arg1, i32 13
%43 = load float* %42
%44 = getelementptr float* %arg1, i32 17
%45 = load float* %44
%46 = getelementptr float* %arg1, i32 21
%47 = load float* %46
%48 = getelementptr float* %arg2, i32 1
%49 = load float* %48
%50 = getelementptr float* %arg2, i32 5
%51 = load float* %50
%52 = getelementptr float* %arg2, i32 9
%53 = load float* %52
%54 = getelementptr float* %arg2, i32 13
%55 = load float* %54
%56 = getelementptr float* %arg2, i32 17
%57 = load float* %56
%58 = getelementptr float* %arg2, i32 21
%59 = load float* %58
%60 = fadd float %51, %39
%61 = fadd float %49, %37
%62 = fadd float %55, %43
%63 = fadd float %53, %41
%64 = fadd float %59, %47
%65 = fadd float %57, %45
%66 = getelementptr float* %arg0, i32 1
store float %61, float* %66
%67 = getelementptr float* %arg0, i32 5
store float %60, float* %67
%68 = getelementptr float* %arg0, i32 9
store float %63, float* %68
%69 = getelementptr float* %arg0, i32 13
store float %62, float* %69
%70 = getelementptr float* %arg0, i32 17
store float %65, float* %70
%71 = getelementptr float* %arg0, i32 21
store float %64, float* %71
%72 = getelementptr float* %arg1, i32 2
%73 = load float* %72
%74 = getelementptr float* %arg1, i32 6
%75 = load float* %74
%76 = getelementptr float* %arg1, i32 10
%77 = load float* %76
%78 = getelementptr float* %arg1, i32 14
%79 = load float* %78
%80 = getelementptr float* %arg1, i32 18
%81 = load float* %80
%82 = getelementptr float* %arg1, i32 22
%83 = load float* %82
%84 = getelementptr float* %arg2, i32 2
%85 = load float* %84
%86 = getelementptr float* %arg2, i32 6
%87 = load float* %86
%88 = getelementptr float* %arg2, i32 10
%89 = load float* %88
%90 = getelementptr float* %arg2, i32 14
%91 = load float* %90
%92 = getelementptr float* %arg2, i32 18
%93 = load float* %92
%94 = getelementptr float* %arg2, i32 22
%95 = load float* %94
%96 = fadd float %87, %75
%97 = fadd float %85, %73
%98 = fadd float %91, %79
%99 = fadd float %89, %77
%100 = fadd float %95, %83
%101 = fadd float %93, %81
%102 = getelementptr float* %arg0, i32 2
store float %97, float* %102
%103 = getelementptr float* %arg0, i32 6
store float %96, float* %103
%104 = getelementptr float* %arg0, i32 10
store float %99, float* %104
%105 = getelementptr float* %arg0, i32 14
store float %98, float* %105
%106 = getelementptr float* %arg0, i32 18
store float %101, float* %106
%107 = getelementptr float* %arg0, i32 22
store float %100, float* %107
%108 = getelementptr float* %arg1, i32 3
%109 = load float* %108
%110 = getelementptr float* %arg1, i32 7
%111 = load float* %110
%112 = getelementptr float* %arg1, i32 11
%113 = load float* %112
%114 = getelementptr float* %arg1, i32 15
%115 = load float* %114
%116 = getelementptr float* %arg1, i32 19
%117 = load float* %116
%118 = getelementptr float* %arg1, i32 23
%119 = load float* %118
%120 = getelementptr float* %arg2, i32 3
%121 = load float* %120
%122 = getelementptr float* %arg2, i32 7
%123 = load float* %122
%124 = getelementptr float* %arg2, i32 11
%125 = load float* %124
%126 = getelementptr float* %arg2, i32 15
%127 = load float* %126
%128 = getelementptr float* %arg2, i32 19
%129 = load float* %128
%130 = getelementptr float* %arg2, i32 23
%131 = load float* %130
%132 = fadd float %123, %111
%133 = fadd float %121, %109
%134 = fadd float %127, %115
%135 = fadd float %125, %113
%136 = fadd float %131, %119
%137 = fadd float %129, %117
%138 = getelementptr float* %arg0, i32 3
store float %133, float* %138
%139 = getelementptr float* %arg0, i32 7
store float %132, float* %139
%140 = getelementptr float* %arg0, i32 11
store float %135, float* %140
%141 = getelementptr float* %arg0, i32 15
store float %134, float* %141
%142 = getelementptr float* %arg0, i32 19
store float %137, float* %142
%143 = getelementptr float* %arg0, i32 23
store float %136, float* %143
ret void
}