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: [PATCH][ARM] PR60663: Improve RTX costs for asm statements


On 15/04/14 11:56, Kyrill Tkachov wrote:
> Hi all,
> 
> This patch relates to PR60663 where cse got confused due to asm statements being given a cost of zero in the arm backend. Jakub already put in a fix to cse for 4.9.0 (http://gcc.gnu.org/ml/gcc-patches/2014-04/msg00512.html) but we should still fix the costs in arm.
> 
> This patch does that by estimating the number of instructions in the asm statement, adding the cost of the input operands and making sure that it's at least COSTS_N_INSNS (1).
> 
> Tested and bootstrapped on arm-none-linux-gnueabihf.
> 
> Ok for trunk?
> 
> Thanks,
> Kyrill
> 
> 2014-04-15  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
> 
> 	PR rtl-optimization/60663
> 	* config/arm/arm.c (arm_new_rtx_costs): Improve ASM_OPERANDS case,
> 	avoid 0 cost.
> 

I'd be inclined to use 1 + number of operands, rather than MAX.

OK with that change.

R.

> 
> pr60663.patch
> 
> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index 91e4cd8..ce7ee82 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -10758,10 +10758,16 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code,
>        return true;
>  
>      case ASM_OPERANDS:
> -      /* Just a guess.  Cost one insn per input.  */
> -      *cost = COSTS_N_INSNS (ASM_OPERANDS_INPUT_LENGTH (x));
> -      return true;
> +      {
> +      /* Just a guess.  Guess number of instructions in the asm
> +         plus one insn per input.  Always a minimum of COSTS_N_INSNS (1)
> +         though (see PR60663).  */
> +        int asm_length = asm_str_count (ASM_OPERANDS_TEMPLATE (x));
> +        int num_operands = ASM_OPERANDS_INPUT_LENGTH (x);
>  
> +        *cost = COSTS_N_INSNS (MAX (1, asm_length + num_operands));
> +        return true;
> +      }
>      default:
>        if (mode != VOIDmode)
>  	*cost = COSTS_N_INSNS (ARM_NUM_REGS (mode));
> 



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