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] Improve peepholes for LDM with commutative operators


[Sorry about the duplicate mail. My mailer seems to have eaten up the
original reply I sent. ]


On Tue, Feb 28, 2012 at 05:09:05PM -0000, Greta Yorsh wrote:
> Is it OK for GCC 4.7 Stage 4 ?

This is stage4 - I'd like to hear what the RM's think. Technically
it's fixing a regression and is low risk to me.

In any case there are a couple of changes that I'd like done
as explained below.

>
> Thank you,
>
> Greta
>
> gcc/ChangeLog
>
> 2012-02-28  Greta Yorsh  <Greta.Yorsh@arm.com>
>
>         * config/arm/arm-ldmstm.ml: Improved conditions of peepholes that
> generate
>         LDM followed by a commutative operator.
>         * config/arm/ldmstm.md: Regenerated.

Can you mention which 2 peepholes are changed in some way.

> diff --git a/gcc/config/arm/arm-ldmstm.ml b/gcc/config/arm/arm-ldmstm.ml
> index 221edd2..5f5a5e0 100644
> --- a/gcc/config/arm/arm-ldmstm.ml
> +++ b/gcc/config/arm/arm-ldmstm.ml
> @@ -216,9 +216,10 @@ let write_ldm_commutative_peephole thumb =
>      Printf.printf "%s          (match_operand:SI %d \"s_register_operand\" \"\")]))\n" indent (nregs * 2 + 3);
>      Printf.printf "%s   (clobber (reg:CC CC_REGNUM))])]\n" indent
>    end;
> -  Printf.printf "  \"(((operands[%d] == operands[0] && operands[%d] == operands[1])\n" (nregs * 2 + 2) (nregs * 2 + 3);
> -  Printf.printf "     || (operands[%d] == operands[0] && operands[%d] == operands[1]))\n" (nregs * 2 + 3) (nregs * 2 + 2);
> -  Printf.printf "    && peep2_reg_dead_p (%d, operands[0]) && peep2_reg_dead_p (%d, operands[1]))\"\n" (nregs + 1) (nregs + 1);
> +  Printf.printf "  \"(((rtx_equal_p (operands[%d], operands[0]) && rtx_equal_p (operands[%d], operands[1]))\n" (nregs * 2 + 2) (nregs * 2 + 3);
> +  Printf.printf "     || (rtx_equal_p (operands[%d], operands[0]) && rtx_equal_p (operands[%d], operands[1])))\n" (nregs * 2 + 3) (nregs * 2 + 2);
> +  Printf.printf "    && (peep2_reg_dead_p (%d, operands[0]) || rtx_equal_p (operands[0], operands[%d]))\n" (nregs + 1) (nregs * 2);
> +  Printf.printf "    && (peep2_reg_dead_p (%d, operands[1]) || rtx_equal_p (operands[1], operands[%d])))\"\n" (nregs + 1) (nregs * 2);
>    begin
>      if thumb then
>        Printf.printf "  [(set (match_dup %d) (match_op_dup %d [(match_dup %d) (match_dup %d)]))]\n"
> diff --git a/gcc/config/arm/ldmstm.md b/gcc/config/arm/ldmstm.md
> index 5db4a32..5db3d57 100644
> --- a/gcc/config/arm/ldmstm.md
> +++ b/gcc/config/arm/ldmstm.md
> @@ -1160,9 +1160,10 @@
>              [(match_operand:SI 6 "s_register_operand" "")
>               (match_operand:SI 7 "s_register_operand" "")]))
>        (clobber (reg:CC CC_REGNUM))])]
> -  "(((operands[6] == operands[0] && operands[7] == operands[1])
> -     || (operands[7] == operands[0] && operands[6] == operands[1]))
> -    && peep2_reg_dead_p (3, operands[0]) && peep2_reg_dead_p (3, operands[1]))"
> +  "(((rtx_equal_p (operands[6], operands[0]) && rtx_equal_p (operands[7], operands[1]))
> +     || (rtx_equal_p (operands[7], operands[0]) && rtx_equal_p (operands[6], operands[1])))
> +    && (peep2_reg_dead_p (3, operands[0]) || rtx_equal_p (operands[0], operands[4]))
> +    && (peep2_reg_dead_p (3, operands[1]) || rtx_equal_p (operands[1], operands[4])))"

Line > 80 characters -


>    [(parallel
>      [(set (match_dup 4) (match_op_dup 5 [(match_dup 6) (match_dup 7)]))
>       (clobber (reg:CC CC_REGNUM))])]
> @@ -1180,9 +1181,10 @@
>          (match_operator:SI 5 "commutative_binary_operator"
>           [(match_operand:SI 6 "s_register_operand" "")
>            (match_operand:SI 7 "s_register_operand" "")]))]
> -  "(((operands[6] == operands[0] && operands[7] == operands[1])
> -     || (operands[7] == operands[0] && operands[6] == operands[1]))
> -    && peep2_reg_dead_p (3, operands[0]) && peep2_reg_dead_p (3, operands[1]))"
> +  "(((rtx_equal_p (operands[6], operands[0]) && rtx_equal_p (operands[7], operands[1]))
> +     || (rtx_equal_p (operands[7], operands[0]) && rtx_equal_p (operands[6], operands[1])))

Again line > 80 characters.

Instead of rtx_equal_p, check that the REGNOs are equal.
That will be cheaper: we know these are register_operands.

For bonus points you use peep2_regno_dead_p with REGNO (operands[n])
instead of peep2_reg_dead_p. If we are accessing REGNO might as well
reuse it :).

regards
Ramana


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