Auto-vectorization in GCC 4.0

Hi,
I am trying to turn on the new GCC auto-vectorization feature within llvmgcc4. Below is the command I used, but nothing was vectorized. Does it mean that llvmgcc4 has disabled this optimization and all I can do is to embed SSE intrinsics in the source code by hand?

Thanks!

./llvm-gcc4-x86/bin/llvm-gcc -c -O2 -ftree-vectorize -msse -ftree-vectorizer-verbose=5 -emit-llvm vec.c -o vec.bc

////////////////////vec.c/////////////////////////
int a[256], b[256], c[256];
foo () {
int i;
for (i=0; i<256; i++){
a[i] = b[i] + c[i];
}
}

llvmgcc4 emits LLVM byte code before executing GCC optimizations, so one can say that llvmgcc4 disables all GCC optimizations.

Does llvmgcc4 convert the high-level AST to LLVM (like llvmgcc3x) or does it go from GIMPL to LLVM? If the latter, would it be possible to allow some TreeSSA optimizations before emitting LLVM?

--Vikram
http://www.cs.uiuc.edu/~vadve
http://llvm.cs.uiuc.edu/

llvmgcc4 intercepts high-level GCC trees to GIMPLE tree transformation routines to get trees that are suitable for LLVM byte code. And TreeSSA optimizer may not be able to handle LLVM suitable GIMPLE trees. One such case is how Array references are handled (&a[i] vs a+i*size). However, I do not know exact details of LLVM byte code generation work inside llvmgcc4.

Does llvmgcc4 convert the high-level AST to LLVM (like llvmgcc3x) or does it go from GIMPL to LLVM? If the latter, would it be possible to allow some TreeSSA optimizations before emitting LLVM?

llvmgcc4 intercepts high-level GCC trees to GIMPLE tree transformation routines to get trees that are suitable for LLVM byte code. And TreeSSA optimizer may not be able to handle LLVM suitable GIMPLE trees. One such case is how Array references are handled (&a[i] vs a+i*size). However, I do not know exact details of LLVM byte code generation work inside llvmgcc4.

Another issue is that gimple has various different forms (high gimple, low gimple, and several other minor forms). We work on "high gimple", so optimizations that require low gimple or later forms won't work. I don't know what the gcc vectorizor uses, but IIRC it runs late in the pipeline, so it probably is low-gimple.

I don't think the gimple->llvm translator can't handle low gimple, but it may be possible to extend it.

-Chris

Does llvmgcc4 convert the high-level AST to LLVM (like llvmgcc3x) or does it go from GIMPL to LLVM? If the latter, would it be possible to allow some TreeSSA optimizations before emitting LLVM?

llvmgcc4 intercepts high-level GCC trees to GIMPLE tree transformation routines to get trees that are suitable for LLVM byte code. And TreeSSA optimizer may not be able to handle LLVM suitable GIMPLE trees. One such case is how Array references are handled (&a[i] vs a+i*size). However, I do not know exact details of LLVM byte code generation work inside llvmgcc4.

Another issue is that gimple has various different forms (high gimple, low gimple, and several other minor forms). We work on "high gimple", so optimizations that require low gimple or later forms won't work. I don't know what the gcc vectorizor uses, but IIRC it runs late in the pipeline, so it probably is low-gimple.

Yes, it is low-gimple.