[LLVMdev] How to broaden the SLP vectorizer's search

Frank Winter fwinter at jlab.org
Fri Aug 8 08:27:56 PDT 2014


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
}


More information about the llvm-dev mailing list