Hi Richard,
[roping in more aarch64 maintainers]
On 22/08/17 13:27, Richard Biener wrote:
On Tue, 22 Aug 2017, Uros Bizjak wrote:
On Tue, Aug 22, 2017 at 12:15 PM, Richard Biener <rguent...@suse.de> wrote:
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.
LGTM.
Please give the patch some soaking time in the mainline before
backporting it to release branches.
Thanks. Of course this was copied by other targets (and the x86
one maybe from the default). So the following is an extended patch.
Ok for the rs6000 and aarch64 bits?
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.
* targhooks.c (default_target_can_inline_p): Likewise.
* config/aarch64/aarch64.c (aarch64_can_inline_p): Likewise.
* config/powerpcspe/powerpcspe.c (rs6000_can_inline_p): Likewise.
* config/rs6000/rs6000.c (rs6000_can_inline_p): Likewise.
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);
+}
Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c (revision 251274)
+++ gcc/targhooks.c (working copy)
@@ -1447,12 +1447,12 @@ default_target_can_inline_p (tree caller
tree caller_opts = DECL_FUNCTION_SPECIFIC_TARGET (caller);
/* If callee has no option attributes, then it is ok to inline */
- if (!callee_opts)
+ if (!callee_opts || 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_opts)
+ else if (!caller_opts || caller_tree == target_option_default_node)
ret = false;
/* If both caller and callee have attributes, assume that if the
Index: gcc/config/aarch64/aarch64.c
===================================================================
--- gcc/config/aarch64/aarch64.c (revision 251274)
+++ gcc/config/aarch64/aarch64.c (working copy)
@@ -10074,7 +10074,7 @@ aarch64_can_inline_p (tree caller, tree
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)
return true;
The aarch64 changes looks ok to me FWIW (since I wrote that function)
Kyrill
struct cl_target_option *caller_opts
Index: gcc/config/powerpcspe/powerpcspe.c
===================================================================
--- gcc/config/powerpcspe/powerpcspe.c (revision 251274)
+++ gcc/config/powerpcspe/powerpcspe.c (working copy)
@@ -40185,12 +40185,12 @@ rs6000_can_inline_p (tree caller, tree c
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/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c (revision 251274)
+++ gcc/config/rs6000/rs6000.c (working copy)
@@ -37395,12 +37395,12 @@ rs6000_can_inline_p (tree caller, tree c
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