[PATCH] Fix PR81921

Kyrill Tkachov kyrylo.tkachov@foss.emea.arm.com
Tue Aug 22 13:52:00 GMT 2017


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 <rguenther@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  <rguenther@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  <rguenther@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



More information about the Gcc-patches mailing list