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

Reply via email to