[LLVMdev] Autovectorization questions

Zinovy Nis zinovy.nis at gmail.com
Wed Mar 12 03:34:03 PDT 2014


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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140312/d8bec5b2/attachment.html>


More information about the llvm-dev mailing list