diff mbox series

Properly redirect alias for MVC (PR ipa/84722).

Message ID e2476691-76e2-424b-61e7-2e27b2225cce@suse.cz
State New
Headers show
Series Properly redirect alias for MVC (PR ipa/84722). | expand

Commit Message

Martin Liška March 13, 2018, 8:21 a.m. UTC
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  <mliska@suse.cz>

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

gcc/testsuite/ChangeLog:

2018-03-12  Martin Liska  <mliska@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

Comments

Martin Liška March 16, 2018, 2:50 p.m. UTC | #1
On 03/13/2018 09:21 AM, Martin Liška wrote:
> 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  <mliska@suse.cz>
> 
>     PR ipa/84722
>     * multiple_target.c (create_dispatcher_calls): Redirect also
>     an alias.
> 
> gcc/testsuite/ChangeLog:
> 
> 2018-03-12  Martin Liska  <mliska@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
> 
> 

Honza approved that offline.

Martin
diff mbox series

Patch

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);
+}