use AVX automatically if present

I wonder why AVX is not used automatically if available at the host machine. In contrast to that, SSE41 instructions (like pmulld) are automatically used if the host machine supports SSE41.

E.g.

$ cat avx.ll

define void @_fun1(<8 x float>*, <8 x float>*) {
_L1:
   %x = load <8 x float>* %0
   %y = load <8 x float>* %1
   %z = fadd <8 x float> %x, %y
   store <8 x float> %z, <8 x float>* %0
   ret void
}

$ llc -o - avx.ll
         .file "avx.ll"
         .text
         .globl _fun1
         .align 16, 0x90
         .type _fun1,@function
_fun1: # @_fun1
         .cfi_startproc
# BB#0: # %_L1
         movaps (%rdi), %xmm0
         movaps 16(%rdi), %xmm1
         addps (%rsi), %xmm0
         addps 16(%rsi), %xmm1
         movaps %xmm1, 16(%rdi)
         movaps %xmm0, (%rdi)
         ret
.Ltmp0:
         .size _fun1, .Ltmp0-_fun1
         .cfi_endproc

         .section ".note.GNU-stack","",@progbits

$ llc -o - -mattr avx avx.ll
         .file "avx.ll"
         .text
         .globl _fun1
         .align 16, 0x90
         .type _fun1,@function
_fun1: # @_fun1
         .cfi_startproc
# BB#0: # %_L1
         pushq %rbp
.Ltmp2:
         .cfi_def_cfa_offset 16
.Ltmp3:
         .cfi_offset %rbp, -16
         movq %rsp, %rbp
.Ltmp4:
         .cfi_def_cfa_register %rbp
         vmovaps (%rdi), %ymm0
         vaddps (%rsi), %ymm0, %ymm0
         vmovaps %ymm0, (%rdi)
         popq %rbp
         vzeroupper
         ret
.Ltmp5:
         .size _fun1, .Ltmp5-_fun1
         .cfi_endproc

         .section ".note.GNU-stack","",@progbits

I guess your answer is that I did not specify a target triple. However why is SSE41 automatically detected and AVX is not?

Very likely AVX is not enabled in your llc. This feature was enabled just recently (late of April).

Very likely AVX is not enabled in your llc. This feature was enabled just recently (late of April).

I forgot to mention that I am using recent LLVM-3.1 and in principle my llc knows about avx as I have shown in the second example. But avx does not seem to be used by default.

Henning,

I believe the code that is supposed to do this is in:
lib/Target/X86/X86Subtarget.cpp in
X86Subtarget::AutoDetectSubtargetFeatures()
Is there a bug in that function?

-Hal

I read there:

   // FIXME: AVX codegen support is not ready.
   //if ((ECX >> 28) & 1) { X86SSELevel = AVX; ToggleFeature(X86::FeatureAVX); }

It looks like the check for AVX is disabled intentionally.
But if the AVX codegen is now usable, one could enable the AVX check, right?

Henning,

Are you looking at trunk? I believe that in trunk this has been
uncommented.

-Hal

I looked into llvm-3.1.src. Yes, in the subversion repository it is uncommented.

llc built from the current trunk generates avx code as you expected. I tested that. Avx in llvm3.1 is not enabled by default.