m32 flag disables vectorization

Hello,

I have a simple loop,
#include <stdio.h>
#define N 200

int array[N];

int main() {
int result = 0;
int a, b, c;
for (b = 0; b < N; b++)
array[b] = b%3;

#pragma clang loop vectorize(enable)
for (a = 0; a < N; a++) {
result += array[a];
}

return result;
}

I compile it like this:
clang -emit-llvm -m32 -c -O0 myarray2.c -o myarray2.s
opt -mem2reg -loops -loop-simplify -loop-rotate -loop-vectorize -S myarray2.s -o opt.s

and I don’t see any effect of vectorization. When I delete m32 flag, vectorization is applied, Why does this happen?

Hi,

I’d recommend using pass-remarks (add -pass-remarks=loop-vectorize to your opt invocation) - it might give some hints.

Michael

PS: For me it’s vectorized independently on using -m32:

bin/clang -emit-llvm -c -O0 1.c -o - | bin/opt -mem2reg -loops -loop-simplify -loop-rotate -loop-vectorize -o /dev/null -pass-remarks=loop-vectorize
remark: :0:0: vectorized loop (vectorization width: 4, interleaved count: 2)
remark: :0:0: vectorized loop (vectorization width: 4, interleaved count: 2)

bin/clang -emit-llvm -m32 -c -O0 1.c -o - | bin/opt -mem2reg -loops -loop-simplify -loop-rotate -loop-vectorize -o /dev/null -pass-remarks=loop-vectorize
remark: :0:0: vectorized loop (vectorization width: 4, interleaved count: 2)
remark: :0:0: vectorized loop (vectorization width: 4, interleaved count: 2)

bin/clang -v
clang version 4.0.0 (trunk 278549) (llvm/trunk 278569)
Target: x86_64-apple-darwin15.6.0
Thread model: posix