re PR middle-end/68762 (link error for inline function decorated with OpenMP declare...
authorJakub Jelinek <jakub@gcc.gnu.org>
Mon, 8 Aug 2016 19:45:53 +0000 (21:45 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 8 Aug 2016 19:45:53 +0000 (21:45 +0200)
PR middle-end/68762
* omp-simd-clone.c: Include varasm.h.
(simd_clone_create): Copy over DECL_COMDAT, DECL_WEAK, DECL_EXTERNAL,
DECL_VISIBILITY, DECL_VISIBILITY_SPECIFIED, DECL_DLLIMPORT_P and for
DECL_ONE_ONLY call make_decl_one_only.  Fix up spelling in comment and
update function name.

* g++.dg/vect/pr68762-1.cc: New test.
* g++.dg/vect/pr68762-2.cc: New test.
* g++.dg/vect/pr68762.h: New file.

From-SVN: r239248

gcc/ChangeLog
gcc/omp-simd-clone.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vect/pr68762-1.cc [new file with mode: 0644]
gcc/testsuite/g++.dg/vect/pr68762-2.cc [new file with mode: 0644]
gcc/testsuite/g++.dg/vect/pr68762.h [new file with mode: 0644]

index 1d1f3594d01f696d9137fc58b1a978da001dd557..e6f076194df95eef153dacc0152e39f0d0b5145f 100644 (file)
@@ -1,4 +1,13 @@
-2016-07-29  Pitchumani Sivanupandi <pitchumani.s@atmel.com>
+2016-08-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/68762
+       * omp-simd-clone.c: Include varasm.h.
+       (simd_clone_create): Copy over DECL_COMDAT, DECL_WEAK, DECL_EXTERNAL,
+       DECL_VISIBILITY, DECL_VISIBILITY_SPECIFIED, DECL_DLLIMPORT_P and for
+       DECL_ONE_ONLY call make_decl_one_only.  Fix up spelling in comment and
+       update function name.
+
+2016-07-29  Pitchumani Sivanupandi  <pitchumani.s@atmel.com>
 
        * config/avr/driver-avr.c (specfiles_doc_url): Remove.
        (avr_diagnose_devicespecs_error): Remove.
index ad7e83b49e86b2f3ff908a52e14eb539e00be150..467d8725225750e5bbc1609aa0bcc3b224e8fda8 100644 (file)
@@ -47,6 +47,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "symbol-summary.h"
 #include "ipa-prop.h"
 #include "tree-eh.h"
+#include "varasm.h"
 
 
 /* Allocate a fresh `simd_clone' and return it.  NARGS is the number
@@ -435,9 +436,18 @@ simd_clone_create (struct cgraph_node *old_node)
     return new_node;
 
   TREE_PUBLIC (new_node->decl) = TREE_PUBLIC (old_node->decl);
-
-  /* The function cgraph_function_versioning () will force the new
-     symbol local.  Undo this, and inherit external visability from
+  DECL_COMDAT (new_node->decl) = DECL_COMDAT (old_node->decl);
+  DECL_WEAK (new_node->decl) = DECL_WEAK (old_node->decl);
+  DECL_EXTERNAL (new_node->decl) = DECL_EXTERNAL (old_node->decl);
+  DECL_VISIBILITY_SPECIFIED (new_node->decl)
+    = DECL_VISIBILITY_SPECIFIED (old_node->decl);
+  DECL_VISIBILITY (new_node->decl) = DECL_VISIBILITY (old_node->decl);
+  DECL_DLLIMPORT_P (new_node->decl) = DECL_DLLIMPORT_P (old_node->decl);
+  if (DECL_ONE_ONLY (old_node->decl))
+    make_decl_one_only (new_node->decl, DECL_ASSEMBLER_NAME (new_node->decl));
+
+  /* The method cgraph_version_clone_with_body () will force the new
+     symbol local.  Undo this, and inherit external visibility from
      the old node.  */
   new_node->local.local = old_node->local.local;
   new_node->externally_visible = old_node->externally_visible;
index 63b3f909050491ff398ab63505c4710fa70cb80d..0822a8af2fa376f23d431b1f89ed50c9bbaa4d91 100644 (file)
@@ -1,3 +1,10 @@
+2016-08-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/68762
+       * g++.dg/vect/pr68762-1.cc: New test.
+       * g++.dg/vect/pr68762-2.cc: New test.
+       * g++.dg/vect/pr68762.h: New file.
+
 2016-08-08  Martin Sebor  <msebor@redhat.com>
 
        PR testsuite/72838
diff --git a/gcc/testsuite/g++.dg/vect/pr68762-1.cc b/gcc/testsuite/g++.dg/vect/pr68762-1.cc
new file mode 100644 (file)
index 0000000..118a301
--- /dev/null
@@ -0,0 +1,26 @@
+// PR middle-end/68762
+// { dg-require-effective-target vect_simd_clones }
+// { dg-additional-options "-fopenmp-simd -fno-inline" }
+// { dg-additional-options "-mavx" { target avx_runtime } }
+// { dg-additional-sources "pr68762-2.cc" }
+
+#include "pr68762.h"
+
+double v[64];
+
+double
+bar ()
+{
+  double sum = 0.0;
+  #pragma omp simd reduction (+: sum)
+  for (int i = 0; i < 64; i++)
+    sum += foo (v[i]);
+  return sum;
+}
+
+int
+main ()
+{
+  if (bar () != 0.0)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/g++.dg/vect/pr68762-2.cc b/gcc/testsuite/g++.dg/vect/pr68762-2.cc
new file mode 100644 (file)
index 0000000..38d624e
--- /dev/null
@@ -0,0 +1,17 @@
+// PR middle-end/68762
+// { dg-do compile }
+
+#include "pr68762.h"
+
+#pragma omp declare simd
+double
+baz (double x)
+{
+  return x;
+}
+
+double
+fn (double x)
+{
+  return foo (x);
+}
diff --git a/gcc/testsuite/g++.dg/vect/pr68762.h b/gcc/testsuite/g++.dg/vect/pr68762.h
new file mode 100644 (file)
index 0000000..8c34592
--- /dev/null
@@ -0,0 +1,11 @@
+// PR middle-end/68762
+
+#pragma omp declare simd
+double baz (double x);
+
+#pragma omp declare simd
+inline double
+foo (double d)
+{
+  return baz (d);
+}