public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/c++-coroutines] Fix target clone indirection elimination
@ 2020-06-29 19:16 Iain D Sandoe
  0 siblings, 0 replies; only message in thread
From: Iain D Sandoe @ 2020-06-29 19:16 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:00e90d3d4cb51fd0fae7b2dbd4bab1db26d6676e

commit 00e90d3d4cb51fd0fae7b2dbd4bab1db26d6676e
Author: Yichao Yu <yyc1992@gmail.com>
Date:   Fri Jun 26 15:46:15 2020 -0600

    Fix target clone indirection elimination
    
    The current logic seems to be comparing the whole attribute tree between
    the callee and caller (or at least the tree starting from the target attribute).
    This is unnecessary and causes strange dependency of the indirection
    elimination on unrelated properties like `noinline`(PR95780) and
    `visibility`(PR95778).
    
    This changes the comparison to be only on the `target` attribute which should
    be the intent of the code.
    
    gcc
    
            * multiple_target.c (redirect_to_specific_clone): Fix tests
            to check individual attribute rather than an attribute list.
    
    gcc/testsuite
    
            * gcc.target/i386/pr95778-1.c: New test.
            * gcc.target/i386/pr95778-2.c: New test.

Diff:
---
 gcc/multiple_target.c                     |  6 ++++--
 gcc/testsuite/gcc.target/i386/pr95778-1.c | 21 +++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/pr95778-2.c | 21 +++++++++++++++++++++
 3 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/gcc/multiple_target.c b/gcc/multiple_target.c
index c1cfe8ff978..b15d004fa4e 100644
--- a/gcc/multiple_target.c
+++ b/gcc/multiple_target.c
@@ -483,7 +483,8 @@ redirect_to_specific_clone (cgraph_node *node)
 					    DECL_ATTRIBUTES (e->callee->decl));
 
       /* Function is not calling proper target clone.  */
-      if (!attribute_list_equal (attr_target, attr_target2))
+      if (attr_target2 == NULL_TREE
+	  || !attribute_value_equal (attr_target, attr_target2))
 	{
 	  while (fv2->prev != NULL)
 	    fv2 = fv2->prev;
@@ -494,7 +495,8 @@ redirect_to_specific_clone (cgraph_node *node)
 	      cgraph_node *callee = fv2->this_node;
 	      attr_target2 = lookup_attribute ("target",
 					       DECL_ATTRIBUTES (callee->decl));
-	      if (attribute_list_equal (attr_target, attr_target2))
+	      if (attr_target2 != NULL_TREE
+		  && attribute_value_equal (attr_target, attr_target2))
 		{
 		  e->redirect_callee (callee);
 		  cgraph_edge::redirect_call_stmt_to_callee (e);
diff --git a/gcc/testsuite/gcc.target/i386/pr95778-1.c b/gcc/testsuite/gcc.target/i386/pr95778-1.c
new file mode 100644
index 00000000000..3238303d696
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr95778-1.c
@@ -0,0 +1,21 @@
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O3 -fPIC -fno-asynchronous-unwind-tables" } */
+/* { dg-require-ifunc "" } */
+
+__attribute__((target_clones("default,avx2")))
+static int
+f2(int *p)
+{
+  asm volatile ("" :: "r"(p) : "memory");
+  return *p;
+}
+
+__attribute__((target_clones("default,avx2")))
+int
+g2(int *p)
+{
+  return f2(p);
+}
+
+/* { dg-final { scan-assembler "g2.default.1:\n\tjmp\tf2.default.1\n" } } */
+/* { dg-final { scan-assembler "g2.avx2.0:\n\tjmp\tf2.avx2.0\n" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr95778-2.c b/gcc/testsuite/gcc.target/i386/pr95778-2.c
new file mode 100644
index 00000000000..e88702d2b82
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr95778-2.c
@@ -0,0 +1,21 @@
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O3 -fPIC -fno-asynchronous-unwind-tables" } */
+/* { dg-require-ifunc "" } */
+
+__attribute__((visibility("internal"),target_clones("default,avx2")))
+int
+f2(int *p)
+{
+  asm volatile ("" :: "r"(p) : "memory");
+  return *p;
+}
+
+__attribute__((target_clones("default,avx2")))
+int
+g2(int *p)
+{
+  return f2(p);
+}
+
+/* { dg-final { scan-assembler "g2.default.1:\n\tjmp\tf2.default.1\n" } } */
+/* { dg-final { scan-assembler "g2.avx2.0:\n\tjmp\tf2.avx2.0\n" } } */


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-29 19:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-29 19:16 [gcc/devel/c++-coroutines] Fix target clone indirection elimination Iain D Sandoe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).