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 <[email protected]>
PR ipa/84722
* multiple_target.c (create_dispatcher_calls): Redirect also
an alias.
gcc/testsuite/ChangeLog:
2018-03-12 Martin Liska <[email protected]>
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);
+}