This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [rtlanal] Do a better job of costing parallel sets containing flag-setting operations.


On 19/06/17 14:46, Richard Earnshaw (lists) wrote:
> Many parallel set insns are of the form of a single set that also sets
> the condition code flags.  In this case the cost of such an insn is
> normally the cost of the part that doesn't set the flags, since updating
> the condition flags is simply a side effect.
> 
> At present all such insns are treated as having unknown cost (ie 0) and
> combine assumes that such insns are infinitely more expensive than any
> other insn sequence with a non-zero cost.
> 
> This patch addresses this problem by allowing insn_rtx_cost to ignore
> the condition setting part of a PARALLEL iff there is exactly one
> comparison set and one non-comparison set.  If the only set operation is
> a comparison we still use that as the basis of the insn cost.
> 
> 	* rtlanal.c (insn_rtx_cost): If a parallel contains exactly one
> 	comparison set and one other set, use the cost of the
> 	non-comparison set.
> 
> Bootstrapped on aarch64-none-linuxgnu
> 
> OK?
> 

Ping?

R.

> R.
> 
> 
> insn-costs.patch
> 
> 
> diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
> index d9f57c3..5cae793 100644
> --- a/gcc/rtlanal.c
> +++ b/gcc/rtlanal.c
> @@ -5260,23 +5260,41 @@ insn_rtx_cost (rtx pat, bool speed)
>    int i, cost;
>    rtx set;
>  
> -  /* Extract the single set rtx from the instruction pattern.
> -     We can't use single_set since we only have the pattern.  */
> +  /* Extract the single set rtx from the instruction pattern.  We
> +     can't use single_set since we only have the pattern.  We also
> +     consider PARALLELs of a normal set and and a single comparison.
> +     In that case we use the cost of the non-comparison SET operation,
> +     which is most-likely to be the real cost of this operation.  */
>    if (GET_CODE (pat) == SET)
>      set = pat;
>    else if (GET_CODE (pat) == PARALLEL)
>      {
>        set = NULL_RTX;
> +      rtx comparison = NULL_RTX;
> +
>        for (i = 0; i < XVECLEN (pat, 0); i++)
>  	{
>  	  rtx x = XVECEXP (pat, 0, i);
>  	  if (GET_CODE (x) == SET)
>  	    {
> -	      if (set)
> -		return 0;
> -	      set = x;
> +	      if (GET_CODE (SET_SRC (x)) == COMPARE)
> +		{
> +		  if (comparison)
> +		    return 0;
> +		  comparison = x;
> +		}
> +	      else
> +		{
> +		  if (set)
> +		    return 0;
> +		  set = x;
> +		}
>  	    }
>  	}
> +
> +      if (!set && comparison)
> +	set = comparison;
> +
>        if (!set)
>  	return 0;
>      }
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]