The following patch fixes PR81921 (and LTO build of libgo) which I ran
into when trying to enable free-lang-data for non-LTO compiles.

free-lang-data forces a DECL_FUNCTION_SPECIFIC_TARGET for all functions
so we have them ending up with target_option_default_node eventually
which is something ix86_can_inline_p doesn't expect (I tried forcing
a compare of the actual options but that fails as well as we get
spurious differences in use-fpmath, the default node with -m32 
-march=x86_64 doesn't have it while non-default nodes have it).

The patch is what I consider safe for branches, we might want to work
on sth better (actually comparing always and fixing the fpmath issue)
on trunk as followup.

Bootstrap & regtest running on x86_64-unknown-linux-gnu, ok for trunk
and active branches?

Note the change to the ref = false conditional isn't strictly necessary
but it makes -flto and non-flto behave consistently.

Thanks,
Richard.

2017-08-22  Richard Biener  <rguent...@suse.de>

        PR target/81921
        * config/i386/i386.c (ix86_can_inline_p): Treat
        target_option_default_node as non-existent.

Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c      (revision 251266)
+++ gcc/config/i386/i386.c      (working copy)
@@ -7507,12 +7507,12 @@ ix86_can_inline_p (tree caller, tree cal
   tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee);
 
   /* If callee has no option attributes, then it is ok to inline.  */
-  if (!callee_tree)
+  if (!callee_tree || callee_tree == target_option_default_node)
     ret = true;
 
   /* If caller has no option attributes, but callee does then it is not ok to
      inline.  */
-  else if (!caller_tree)
+  else if (!caller_tree || caller_tree == target_option_default_node)
     ret = false;
 
   else
Index: gcc/testsuite/gcc.target/i386/pr81921.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr81921.c     (nonexistent)
+++ gcc/testsuite/gcc.target/i386/pr81921.c     (working copy)
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target lto } */
+/* { dg-options "-flto -march=x86-64" } */
+
+extern __inline int  __attribute__((__gnu_inline__, __always_inline__, 
__artificial__, target("sse2")))
+_mm_loadu_si128 (int const *__P)
+{
+    return *__P;
+}
+
+void __attribute__((target("ssse3"))) foo (void *p)
+{
+  volatile int x = _mm_loadu_si128 (p);
+}

Reply via email to