https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78366
Bug ID: 78366 Summary: target_clones does not generate resovler function Product: gcc Version: 7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: other Assignee: unassigned at gcc dot gnu.org Reporter: tkoenig at gcc dot gnu.org Target Milestone: --- The doc to target_clones says # For instance, on an x86, you could compile a function with # `target_clones("sse4.1,avx")'. GCC creates two function clones, # one compiled with `-msse4.1' and another with `-mavx'. It also # creates a resolver function (see the `ifunc' attribute above) that # dynamically selects a clone suitable for current architecture. Gcc creates the three functions all right, but it does not create the resolver function; or at least I am unable to find it in the assembly code. double foo(double *, double *, int) __attribute__ ((target_clones("avx,default"))); double foo(double *a, double *b, int n) { double s; int i; s = 0.0; for (i=0; i<n; i++) s += a[i] + b[i]; return s; } ig25@linux-fd1f:~/Krempel/Target> gcc -O -S target.c ig25@linux-fd1f:~/Krempel/Target> cat target.s .file "target.c" .text .globl foo .type foo, @function foo: .LFB0: .cfi_startproc testl %edx, %edx jle .L4 leal -1(%rdx), %edx addq $1, %rdx movl $0, %eax pxor %xmm0, %xmm0 .L3: movsd (%rdi,%rax,8), %xmm1 addsd (%rsi,%rax,8), %xmm1 addsd %xmm1, %xmm0 addq $1, %rax cmpq %rdx, %rax jne .L3 rep ret .L4: pxor %xmm0, %xmm0 ret .cfi_endproc .LFE0: .size foo, .-foo .type foo.avx.0, @function foo.avx.0: .LFB1: .cfi_startproc testl %edx, %edx jle .L9 leal -1(%rdx), %edx addq $1, %rdx movl $0, %eax vxorpd %xmm0, %xmm0, %xmm0 .L8: vmovsd (%rdi,%rax,8), %xmm1 vaddsd (%rsi,%rax,8), %xmm1, %xmm1 vaddsd %xmm1, %xmm0, %xmm0 addq $1, %rax cmpq %rdx, %rax jne .L8 rep ret .L9: vxorpd %xmm0, %xmm0, %xmm0 ret .cfi_endproc .LFE1: .size foo.avx.0, .-foo.avx.0 .ident "GCC: (GNU) 7.0.0 20161112 (experimental)" .section .note.GNU-stack,"",@progbits