Fix multiple target clones nodes (PR lto/66295).
authorMartin Liska <mliska@suse.cz>
Tue, 14 Mar 2017 11:59:59 +0000 (12:59 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 14 Mar 2017 11:59:59 +0000 (11:59 +0000)
2017-03-14  Martin Liska  <mliska@suse.cz>

PR lto/66295
* multiple_target.c (expand_target_clones): Drop local.local
flag for default implementation.
2017-03-14  Martin Liska  <mliska@suse.cz>

PR lto/66295
* gcc.dg/tree-prof/pr66295.c: New test.

From-SVN: r246119

gcc/ChangeLog
gcc/multiple_target.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-prof/pr66295.c [new file with mode: 0644]

index 8b84aabe0ef2eecea22458830b819dbb088f6ffb..458faddc8aed30e0e8d653d5a75105d7b5448019 100644 (file)
@@ -1,3 +1,9 @@
+2017-03-14  Martin Liska  <mliska@suse.cz>
+
+       PR lto/66295
+       * multiple_target.c (expand_target_clones): Drop local.local
+       flag for default implementation.
+
 2017-03-14  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/80030
index 7b735ae81ae910876229288cc80f3014bdb20cae..4a835bbcc176714af6f30bcc3387b5058662a86f 100644 (file)
@@ -327,6 +327,7 @@ expand_target_clones (struct cgraph_node *node, bool definition)
   tree attributes = make_attribute ("target", "default",
                                    DECL_ATTRIBUTES (node->decl));
   DECL_ATTRIBUTES (node->decl) = attributes;
+  node->local.local = false;
   location_t saved_loc = input_location;
   input_location = DECL_SOURCE_LOCATION (node->decl);
   bool ret
index a3af805541455dde30df8ac81b5f8af2fc1db6b5..eec5c79acf780f52fe34820068dea09c70260064 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-14  Martin Liska  <mliska@suse.cz>
+
+       PR lto/66295
+       * gcc.dg/tree-prof/pr66295.c: New test.
+
 2017-03-13  Martin Liska  <mliska@suse.cz>
 
        PR middle-end/78339
diff --git a/gcc/testsuite/gcc.dg/tree-prof/pr66295.c b/gcc/testsuite/gcc.dg/tree-prof/pr66295.c
new file mode 100644 (file)
index 0000000..1ab7e6c
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O2" } */
+
+static double bar (double *__restrict, double *__restrict, int)
+__attribute__ ((target_clones("avx,avx2,avx512f,default")));
+
+double
+foo (double *__restrict a, double *__restrict b, int n)
+{
+  return bar (a,b,n);
+}
+
+double
+bar (double *__restrict a, double *__restrict b, int n)        /* { dg-error "attribute\[^\n\r]*foo\[^\n\r]* is unknown" } */
+{
+  double s;
+  int i;
+  s = 0.0;
+  for (i=0; i<n; i++)
+    s += a[i] + b[i];
+
+  return s;
+}
+
+#define N 5
+
+int main ()
+{
+  double a[N] = {1.2f, 1.2f, 1.2f, 1.2f, 1.2f };
+  double b[N] = {1.2f, 1.2f, 1.2f, 1.2f, 1.2f };
+
+  __builtin_printf ("value: %.5f\n", foo (a, b, N));
+  return 0;
+}