LLVM Vectorisation Bug

I have matrix multiplication and stencil code. I vectorise it through the following command.

opt -S -O3 -force-vector-width=2048 stencil.ll -o stencil_o3.ll

in both the examples of matrix mult and stencil it vectorises fine when my loop iterations >2048. but if i keep both iterations and vector width=2048.
it produces scalar code IR not vectorizes it.

Is it llvm bug?

Please help me.

Hi Ahmed,

Can you show us your code?

I tried this example:

void foo(int *a, int *b, int *c) {
  for (int i=0; i<2048; i++)
    a[i] = b[i] + c[i];
}

Then ran Clang to produce IR and your opt line above and got a vectorised loop:

vector.body: ; preds =
%vector.body.preheader
  %0 = bitcast i32* %b to <2048 x i32>*
  %wide.load = load <2048 x i32>, <2048 x i32>* %0, align 4, !alias.scope !1
  %1 = bitcast i32* %c to <2048 x i32>*
  %wide.load17 = load <2048 x i32>, <2048 x i32>* %1, align 4, !alias.scope !4
  %2 = add nsw <2048 x i32> %wide.load17, %wide.load
  %3 = bitcast i32* %a to <2048 x i32>*
  store <2048 x i32> %2, <2048 x i32>* %3, align 4, !alias.scope !6, !noalias !8
  br label %for.end

So, this seems to be either a bug in your code (off-by-one, loop
dependencies, etc) or some missing optimisation in Clang, which we'll
only know when we can actually see the code.

cheers,
--renato

Right, that explains it: your tail loop count doesn't reach 2048 iterations:

#define N 2048
for (i = 1; i <= N-2; i++)
  for (j = 1; j <= N-2; j++)
    a[i][j] = b[i][j];

That'll be 2045 iterations.

Artificially playing with the ranges (N+1, etc) yields vector code, as expected.

Same for the main loop:

   float con=0.2;
   for (k = 0; k < N; k++) {
       for (i = 1; i <= N-2; i++)
           for (j = 1; j <= N-2; j++)
              b[i][j] = con * (a[i][j] + a[i-1][j] + a[i+1][j] +
a[i][j-1] + a[i][j+1]);

cheers,
--renato