Hi! If #pragma omp declare simd function has a name set using __asm, DECL_ASSEMBLER_NAME starts with *. We certainly don't want to put that * as part of the mangled name, if not anything else because most of the assemblers don't handle it as part of identifiers.
Fixed thusly, committed to trunk so far. 2015-01-26 Jakub Jelinek <ja...@redhat.com> PR middle-end/64421 * omp-low.c (simd_clone_mangle): If DECL_ASSEMBLER_NAME starts with asterisk, skip the first character. * gcc.dg/vect/pr64421.c: New test. --- gcc/omp-low.c.jj 2015-01-23 19:18:55.000000000 +0100 +++ gcc/omp-low.c 2015-01-26 12:57:14.415403539 +0100 @@ -12663,9 +12663,11 @@ simd_clone_mangle (struct cgraph_node *n } pp_underscore (&pp); - pp_string (&pp, - IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl))); - const char *str = pp_formatted_text (&pp); + const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl)); + if (*str == '*') + ++str; + pp_string (&pp, str); + str = pp_formatted_text (&pp); /* If there already is a SIMD clone with the same mangled name, don't add another one. This can happen e.g. for --- gcc/testsuite/gcc.dg/vect/pr64421.c.jj 2015-01-26 13:48:02.732154064 +0100 +++ gcc/testsuite/gcc.dg/vect/pr64421.c 2015-01-26 13:47:53.000000000 +0100 @@ -0,0 +1,36 @@ +/* PR middle-end/64421 */ +/* { dg-require-effective-target vect_simd_clones } */ +/* { dg-additional-options "-fopenmp-simd" } */ +/* { dg-additional-options "-mavx" { target avx_runtime } } */ + +#include "tree-vect.h" + +#pragma omp declare simd linear (y) notinbranch +int foo (int x, int y) __asm ("bar"); + +#pragma omp declare simd linear (y) notinbranch +int +foo (int x, int y) +{ + return x + y; +} + +int a[1024] = { 1, 2 }; + +int +main () +{ + int i; + check_vect (); + #pragma omp simd + for (i = 0; i < 1024; i++) + a[i] = foo (a[i], i); + if (a[0] != 1 || a[1] != 3) + abort (); + for (i = 2; i < 1024; i++) + if (a[i] != i) + abort (); + return 0; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ Jakub