On 08/10/2017 03:39 PM, Jan Hubicka wrote: >>>>>>> - /* If callee has no option attributes, then it is ok to inline. */ >>>>>>> - if (!callee_tree) >>>>>>> + /* If callee has no option attributes (or default), >>>>>>> + then it is ok to inline. */ >>>>>>> + if (!callee_tree || callee_tree == target_option_default_node) >>>>>> >>>>>> I am not sure this actually makes sense, because >>>>>> target_option_default_node is not very >>>>>> meaningful for LTO (it contains whatever was passed to LTO driver). >>>>> >>>>> I see! >>>>> >>>>> Perhaps one can check >>>>>> for explicit optimization/machine attribute and whether caller and >>>>>> callee come from >>> >>> I'm not sure what you mean by 'for explicit optimization/machine attribute' >>> ? > > You can simply do lookup_attribute and see if callee_tree was set because of > attribute > or because of LTO. In current patch the comparsion with > target_option_default_node > still does not make much of sense. But perhaps just > lookup_attribute ("optimize", DECL_ATTRIBUTES (...)) would do the job. This > is already > done in ipa-inline. > > Honza
Like this? Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. Ready to be installed? Martin >>> >>> I'm attaching a new patch, is it closer? >>> >>> Martin >>> >>>>>> same compilation unit, though this is quite hackish and will do >>>>>> unexpected things with COMDATs. >>>>> >>>>> That's quite cumbersome. Any other idea than marking the PR as won't fix? >>>> >>>> Yep, it is not prettiest. The problem is that the concept that callee can >>>> change semantics >>>> when no explicit attribute is present is sloppy. I am not sure how many >>>> programs rely on it >>>> (it is kind of surprising to see functions not being inlined into your >>>> target attribute annotated >>>> function I guess). >>>> Note that we check for original file in inliner already - this can be done >>>> by comparing lto_file_data >>>> of corresponding cgraph nodes. >>>> >>>> Honza >>>> >>>
>From 139ac66628dac7835980326fe92aca9eeff5fe5c Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Tue, 27 Jun 2017 16:39:27 +0200 Subject: [PATCH] Make inlining consistent in LTO and non-LTO mode (PR target/71991). gcc/testsuite/ChangeLog: 2017-06-28 Martin Liska <mli...@suse.cz> PR target/71991 * gcc.dg/torture/pr71991.c: New test. gcc/ChangeLog: 2017-06-28 Martin Liska <mli...@suse.cz> PR target/71991 * config/i386/i386.c (ix86_can_inline_p): Make inlining consistent in LTO and non-LTO mode. --- gcc/config/i386/i386.c | 3 ++- gcc/testsuite/gcc.dg/torture/pr71991.c | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr71991.c diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b04321a8d40..1bb2a0f39be 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -7507,7 +7507,8 @@ ix86_can_inline_p (tree caller, tree callee) 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 + || lookup_attribute ("optimize", DECL_ATTRIBUTES (callee)) == NULL_TREE) ret = true; /* If caller has no option attributes, but callee does then it is not ok to diff --git a/gcc/testsuite/gcc.dg/torture/pr71991.c b/gcc/testsuite/gcc.dg/torture/pr71991.c new file mode 100644 index 00000000000..79c927f6844 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr71991.c @@ -0,0 +1,12 @@ +/* PR target/71991 */ + +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-std=c99" } */ + +static inline int __attribute__ ((__always_inline__)) fn1 () { return 0; } +static inline int __attribute__ ((target("inline-all-stringops"))) fn2 () { return fn1 (); } + +int main() +{ + return fn2(); +} -- 2.13.3