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