public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-9926] rs6000: Use default target option node for callee by default [PR111380]
@ 2023-10-16  2:09 Kewen Lin
  0 siblings, 0 replies; only message in thread
From: Kewen Lin @ 2023-10-16  2:09 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:a570462419f5a6ba2880a82d6394419864bd035b

commit r12-9926-ga570462419f5a6ba2880a82d6394419864bd035b
Author: Kewen Lin <linkw@linux.ibm.com>
Date:   Sun Oct 15 21:08:29 2023 -0500

    rs6000: Use default target option node for callee by default [PR111380]
    
    As PR111380 (and the discussion in related PRs) shows, for
    now how function rs6000_can_inline_p treats the callee
    without any target option node is wrong.  It considers it's
    always safe to inline this kind of callee, but actually its
    target flags are from the command line options
    (target_option_default_node), it's possible that the flags
    of callee don't satisfy the condition of inlining, but it
    is still inlined, then result in unexpected consequence.
    
    As the associated test case pr111380-1.c shows, the caller
    main is attributed with power8, but the callee foo is
    compiled with power9 from command line, it's unexpected to
    make main inline foo since foo can contain something that
    requires power9 capability.  Without this patch, for lto
    (with -flto) we can get error message (as it forces the
    callee to have a target option node), but for non-lto, it's
    inlined unexpectedly.
    
    This patch is to make callee adopt target_option_default_node
    when it doesn't have a target option node, it can avoid wrong
    inlining decision and fix the inconsistency between LTO and
    non-LTO.  It also aligns with what the other ports do.
    
            PR target/111380
    
    gcc/ChangeLog:
    
            * config/rs6000/rs6000.cc (rs6000_can_inline_p): Adopt
            target_option_default_node when the callee has no option
            attributes, also simplify the existing code accordingly.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/powerpc/pr111380-1.c: New test.
            * gcc.target/powerpc/pr111380-2.c: New test.
    
    (cherry picked from commit 266dfed68b881702e9660889f63408054b7fa9c0)

Diff:
---
 gcc/config/rs6000/rs6000.cc                   | 65 +++++++++++++--------------
 gcc/testsuite/gcc.target/powerpc/pr111380-1.c | 20 +++++++++
 gcc/testsuite/gcc.target/powerpc/pr111380-2.c | 20 +++++++++
 3 files changed, 70 insertions(+), 35 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 436f194fcd0..1cebeb49d3f 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -25292,49 +25292,44 @@ rs6000_can_inline_p (tree caller, tree callee)
   tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller);
   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
 
-  /* If the callee has no option attributes, then it is ok to inline.  */
+  /* If the caller/callee has option attributes, then use them.
+     Otherwise, use the command line options.  */
   if (!callee_tree)
-    ret = true;
+    callee_tree = target_option_default_node;
+  if (!caller_tree)
+    caller_tree = target_option_default_node;
 
-  else
-    {
-      HOST_WIDE_INT caller_isa;
-      struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
-      HOST_WIDE_INT callee_isa = callee_opts->x_rs6000_isa_flags;
-      HOST_WIDE_INT explicit_isa = callee_opts->x_rs6000_isa_flags_explicit;
+  struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
+  struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree);
 
-      /* If the caller has option attributes, then use them.
-	 Otherwise, use the command line options.  */
-      if (caller_tree)
-	caller_isa = TREE_TARGET_OPTION (caller_tree)->x_rs6000_isa_flags;
-      else
-	caller_isa = rs6000_isa_flags;
+  HOST_WIDE_INT callee_isa = callee_opts->x_rs6000_isa_flags;
+  HOST_WIDE_INT caller_isa = caller_opts->x_rs6000_isa_flags;
+  HOST_WIDE_INT explicit_isa = callee_opts->x_rs6000_isa_flags_explicit;
 
-      cgraph_node *callee_node = cgraph_node::get (callee);
-      if (ipa_fn_summaries && ipa_fn_summaries->get (callee_node) != NULL)
+  cgraph_node *callee_node = cgraph_node::get (callee);
+  if (ipa_fn_summaries && ipa_fn_summaries->get (callee_node) != NULL)
+    {
+      unsigned int info = ipa_fn_summaries->get (callee_node)->target_info;
+      if ((info & RS6000_FN_TARGET_INFO_HTM) == 0)
 	{
-	  unsigned int info = ipa_fn_summaries->get (callee_node)->target_info;
-	  if ((info & RS6000_FN_TARGET_INFO_HTM) == 0)
-	    {
-	      callee_isa &= ~OPTION_MASK_HTM;
-	      explicit_isa &= ~OPTION_MASK_HTM;
-	    }
+	  callee_isa &= ~OPTION_MASK_HTM;
+	  explicit_isa &= ~OPTION_MASK_HTM;
 	}
+    }
 
-      /* Ignore -mpower8-fusion and -mpower10-fusion options for inlining
-	 purposes.  */
-      callee_isa &= ~(OPTION_MASK_P8_FUSION | OPTION_MASK_P10_FUSION);
-      explicit_isa &= ~(OPTION_MASK_P8_FUSION | OPTION_MASK_P10_FUSION);
+  /* Ignore -mpower8-fusion and -mpower10-fusion options for inlining
+     purposes.  */
+  callee_isa &= ~(OPTION_MASK_P8_FUSION | OPTION_MASK_P10_FUSION);
+  explicit_isa &= ~(OPTION_MASK_P8_FUSION | OPTION_MASK_P10_FUSION);
 
-      /* The callee's options must be a subset of the caller's options, i.e.
-	 a vsx function may inline an altivec function, but a no-vsx function
-	 must not inline a vsx function.  However, for those options that the
-	 callee has explicitly enabled or disabled, then we must enforce that
-	 the callee's and caller's options match exactly; see PR70010.  */
-      if (((caller_isa & callee_isa) == callee_isa)
-	  && (caller_isa & explicit_isa) == (callee_isa & explicit_isa))
-	ret = true;
-    }
+  /* The callee's options must be a subset of the caller's options, i.e.
+     a vsx function may inline an altivec function, but a no-vsx function
+     must not inline a vsx function.  However, for those options that the
+     callee has explicitly enabled or disabled, then we must enforce that
+     the callee's and caller's options match exactly; see PR70010.  */
+  if (((caller_isa & callee_isa) == callee_isa)
+      && (caller_isa & explicit_isa) == (callee_isa & explicit_isa))
+    ret = true;
 
   if (TARGET_DEBUG_TARGET)
     fprintf (stderr, "rs6000_can_inline_p:, caller %s, callee %s, %s inline\n",
diff --git a/gcc/testsuite/gcc.target/powerpc/pr111380-1.c b/gcc/testsuite/gcc.target/powerpc/pr111380-1.c
new file mode 100644
index 00000000000..57ae75ef73a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr111380-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+/* { dg-options "-O2 -mdejagnu-cpu=power9" } */
+
+/* Verify it emits error message on inlining even without LTO.  */
+
+vector int c, a, b;
+
+static inline void __attribute__ ((__always_inline__))
+foo () /* { dg-error "inlining failed in call to .* target specific option mismatch" } */
+{
+  c = a + b;
+}
+
+__attribute__ ((target ("cpu=power8")))
+int main ()
+{
+  foo (); /* { dg-message "called from here" } */
+  c = a + b;
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr111380-2.c b/gcc/testsuite/gcc.target/powerpc/pr111380-2.c
new file mode 100644
index 00000000000..7b363940643
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr111380-2.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+/* { dg-options "-O2 -mno-vsx" } */
+
+/* Verify it emits error message on inlining even without LTO.  */
+
+vector int c, a, b;
+
+static inline void __attribute__ ((__always_inline__))
+foo () /* { dg-error "inlining failed in call to .* target specific option mismatch" } */
+{
+  c = a + b;
+}
+
+__attribute__ ((target ("vsx")))
+int main ()
+{
+  foo (); /* { dg-message "called from here" } */
+  c = a + b;
+}

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

only message in thread, other threads:[~2023-10-16  2:09 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-16  2:09 [gcc r12-9926] rs6000: Use default target option node for callee by default [PR111380] Kewen Lin

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).