On 24/03/14 17:21, Kyrill Tkachov wrote:
> Hi all,
> 
> I noticed that we don't handle simple reg-to-reg arithmetic operations in the 
> arm rtx cost functions. We should be adding the cost of alu.arith to the 
> costs 
> of the operands. This patch does that. Since we don't have any cost tables 
> yet 
> that have a non-zero value for that field it shouldn't affect code-gen for 
> any 
> current cores.
> 
> Bootstrapped and tested on arm-none-linux-gnueabihf.
> 
> Ok for next stage1?
> 
> Thanks,
> Kyrill
> 
> 2014-03-24  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>
> 
>      * config/arm/arm.c (arm_new_rtx_costs): Handle reg-to-reg PLUS
>      and MINUS RTXs.
> 

I think the convention for big switch statements like this is to write

        * config/arm/arm.c (arm_new_rtx_costs, case PLUS, MINUS): ....

However...

> 
> rtx-costs-plus-minus.patch
> 
> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index bf5d1b2..3102b67 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -9428,6 +9428,14 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum 
> rtx_code outer_code,
>             *cost += rtx_cost (XEXP (x, 1), code, 1, speed_p);
>             return true;
>           }
> +       else if (REG_P (XEXP (x, 0)))
> +         {
> +           *cost += rtx_cost (XEXP (x, 0), code, 0, speed_p)
> +                    + rtx_cost (XEXP (x, 1), code, 1, speed_p);
> +           if (speed_p)
> +             *cost += extra_cost->alu.arith;
> +           return true;
> +         }
>  

This still doesn't handle the case where the first operand is not a
register.  Furthermore, the only difference between this and what we had
before is that we now add alu.arith to the overall cost.  But we want to
do that anyway.

I think you really just need

          else if (speed_p)
            *cost += extra_cost.alu_arith;

and then let recursion (return false) handle the cost of non-register
operands (register will always cost as zero).

>         return false;
>       }
> @@ -9663,6 +9671,14 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum 
> rtx_code outer_code,
>             *cost += rtx_cost (XEXP (x, 0), PLUS, 0, speed_p);
>             return true;
>           }
> +       else if (REG_P (XEXP (x, 1)))
> +         {
> +           *cost += rtx_cost (XEXP (x, 0), PLUS, 0, speed_p)
> +                    + rtx_cost (XEXP (x, 1), PLUS, 1, speed_p);
> +           if (speed_p)
> +             *cost += extra_cost->alu.arith;
> +           return true;
> +         }

The same here.

>         return false;
>       }
>  
> 
R.


Reply via email to