[LLVMdev] Autovectorization questions

Arnold Schwaighofer aschwaighofer at apple.com
Wed Mar 12 15:50:41 PDT 2014


In order to vectorize code like this LLVM needs to prove that “A[i*7]” does not wrap in the address space. It fails to do so and so LLVM doesn’t vectorize this loop even if we try to force it.

The following loop will be vectorized if we force it:

int foo(int * A, int * B, int n, int k) {
  for (int i = 0; i < 1024; ++i)
    A[i] += B[i*k];
}

So will this loop:

int foo(int * restrict A, int * restrict B, int n, int k) {
  for (int i = 0; i < n; ++i)
    A[i] += B[i*k];
}

I will update the example.

Thanks,
Arnold

On Mar 12, 2014, at 1:54 PM, Nadav Rotem <nrotem at apple.com> wrote:

> Hi Zinovy, 
> 
> The loop vectorizer probably decided that it was not profitable to vectorize the function. You can force the vectorization of the function by setting a low threshold. 
> 
> Thanks,
> Nadav
> 
> On Mar 12, 2014, at 3:34 AM, Zinovy Nis <zinovy.nis at gmail.com> wrote:
> 
>> Hi,
>> 
>> I'm reading "http://llvm.org/docs/Vectorizers.html" and have few question. Hope someone has answers on it.
>> 
>> 
>> The Loop Vectorizer can vectorize code that becomes a sequence of scalar instructions that scatter/gathers memory. (http://llvm.org/docs/Vectorizers.html#scatter-gather)
>> 
>> int foo(int *A, int *B, int n, int k) {
>>   for (int i = 0; i < n; ++i)
>>     A[i*7] += B[i*k];
>> }
>> 
>> I replaced "int *A"/"int *B" into "double *A"/"double *B" and then compiled the sample with 
>> 
>> $> ./clang -Ofast -ffast-math test.c -std=c99 -march=core-avx2 -S -o bb.S  -fslp-vectorize-aggressive
>> 
>> and loop body looks like:
>> 
>> .LBB1_2:                                # %for.body
>>                                         # =>This Inner Loop Header: Depth=1
>>         cltq
>>         vmovsd  (%rsi,%rax,8), %xmm0
>>         movq    %r9, %r10
>>         sarq    $32, %r10
>>         vaddsd  (%rdi,%r10,8), %xmm0, %xmm0
>>         vmovsd  %xmm0, (%rdi,%r10,8)
>>         addq    %r8, %r9
>>         addl    %ecx, %eax
>>         decl    %edx
>>         jne     .LBB1_2
>> 
>> so vector instructions for scalars (vaddsd, vmovsd) were used in the loop and no real gather/scatter emitted.
>> 
>> The question is why this loop was not vectorized? Typo in docs?
>> 
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev





More information about the llvm-dev mailing list