Ping.

(Sorry for the very aggressive ping; this fixes 764 testsuite failures
on powerpc-linux).


Segher


On Sun, May 28, 2017 at 12:31:12PM +0000, Segher Boessenkool wrote:
> __atomic_add_fetch adds a value to some memory, and returns the result.
> If there is no direct support for this, expand_builtin_atomic_fetch_op
> is asked to implement this as __atomic_fetch_add (which returns the
> original value of the mem), followed by the addition.  Now, the
> __atomic_add_fetch could have been a tail call, but we shouldn't
> perform the __atomic_fetch_add as a tail call: following code would
> not be executed, and in fact thrown away because there is a barrier
> after tail calls.
> 
> This fixes it.
> 
> Tested on powerpc64-linux {-m32,-m64}.  Is this okay for trunk?
> 
> 
> Segher
> 
> 
> 2017-05-28  Segher Boessenkool  <seg...@kernel.crashing.org>
> 
>       PR middle-end/80902
>       * builtins.c (expand_builtin_atomic_fetch_op): If emitting code after
>       a call, force the call to not be a tail call.
> 
> ---
>  gcc/builtins.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/gcc/builtins.c b/gcc/builtins.c
> index 4f6c9c4..3a70693 100644
> --- a/gcc/builtins.c
> +++ b/gcc/builtins.c
> @@ -6079,6 +6079,12 @@ expand_builtin_atomic_fetch_op (machine_mode mode, 
> tree exp, rtx target,
>    gcc_assert (TREE_OPERAND (addr, 0) == fndecl);
>    TREE_OPERAND (addr, 0) = builtin_decl_explicit (ext_call);
>  
> +  /* If we will emit code after the call, the call can not be a tail call.
> +     If it is emitted as a tail call, a barrier is emitted after it, and
> +     then all trailing code is removed.  */
> +  if (!ignore)
> +    CALL_EXPR_TAILCALL (exp) = 0;
> +
>    /* Expand the call here so we can emit trailing code.  */
>    ret = expand_call (exp, target, ignore);
>  
> -- 
> 1.9.3

Reply via email to