Hi.

When having a weak alias that points to a multi-versioning function, one
needs to redirect the alias properly.

Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.

Ready for trunk?
Thanks,
Martin

gcc/ChangeLog:

2018-03-12  Martin Liska  <mli...@suse.cz>

        PR ipa/84722
        * multiple_target.c (create_dispatcher_calls): Redirect also
        an alias.

gcc/testsuite/ChangeLog:

2018-03-12  Martin Liska  <mli...@suse.cz>

        PR ipa/84722
        * gcc.target/i386/mvc10.c: New test.
---
 gcc/multiple_target.c                 |  7 +++++++
 gcc/testsuite/gcc.target/i386/mvc10.c | 16 ++++++++++++++++
 2 files changed, 23 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/i386/mvc10.c


diff --git a/gcc/multiple_target.c b/gcc/multiple_target.c
index a6767985774..95297f3cd30 100644
--- a/gcc/multiple_target.c
+++ b/gcc/multiple_target.c
@@ -145,6 +145,13 @@ create_dispatcher_calls (struct cgraph_node *node)
 		    walk_gimple_stmt (&it, NULL, replace_function_decl, &wi);
 		}
 	    }
+	  else if (ref->use == IPA_REF_ALIAS)
+	    {
+	      symtab_node *source = ref->referring;
+	      ref->remove_reference ();
+	      source->create_reference (inode, IPA_REF_ALIAS);
+	      source->add_to_same_comdat_group (inode);
+	    }
 	  else
 	    gcc_unreachable ();
 	}
diff --git a/gcc/testsuite/gcc.target/i386/mvc10.c b/gcc/testsuite/gcc.target/i386/mvc10.c
new file mode 100644
index 00000000000..9a7b609c0b3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mvc10.c
@@ -0,0 +1,16 @@
+/* PR ipa/84722.  */
+/* { dg-do run } */
+/* { dg-require-ifunc "" } */
+
+__attribute__ ((target_clones ("avx", "arch=core-avx2", "default"))) int
+foo (int i)
+{
+  return i - 1;
+}
+int weaks (int i) __attribute__ ((weak, alias ("foo")));
+
+int
+main (int argc, char **argv)
+{
+  return weaks (argc);
+}

Reply via email to