diff mbox

[ARM] Improve peepholes for LDM with commutative operators

Message ID 001001ccf6ed$50351580$f09f4080$@Yorsh@arm.com
State New
Headers show

Commit Message

Greta Yorsh Feb. 29, 2012, 2:20 p.m. UTC
I'm attaching a new version of the patch. Fixed all comments and retested.
No regression on qemu --with-cpu cortex-a9.

Thank you,

Greta

gcc/ChangeLog

2012-02-29  Greta Yorsh  <Greta.Yorsh@arm.com>

	* config/arm/arm-ldmstm.ml (write_ldm_commutative_peephole):
Improved
	conditions of peepholes generating LDM followed by commutative
operator.
	* config/arm/ldmstm.md: Regenerated.


> -----Original Message-----
> From: Ramana Radhakrishnan [mailto:ramana.radhakrishnan@linaro.org]
> Sent: 29 February 2012 00:41
> To: Greta Yorsh
> Cc: gcc-patches@gcc.gnu.org; ramana@gcc.gnu.org; paul@codesourcery.com;
> nickc@redhat.com
> Subject: 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
diff mbox

Patch

diff --git a/gcc/config/arm/arm-ldmstm.ml b/gcc/config/arm/arm-ldmstm.ml
index 221edd2..c6b072e 100644
--- a/gcc/config/arm/arm-ldmstm.ml
+++ b/gcc/config/arm/arm-ldmstm.ml
@@ -216,9 +216,14 @@  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 "  \"((((REGNO (operands[%d]) == REGNO (operands[0]))\n" (nregs * 2 + 2);
+  Printf.printf "         && (REGNO (operands[%d]) == REGNO (operands[1])))\n"  (nregs * 2 + 3);
+  Printf.printf "      || ((REGNO (operands[%d]) == REGNO (operands[0]))\n" (nregs * 2 + 3);
+  Printf.printf "         && (REGNO (operands[%d]) == REGNO (operands[1]))))\n" (nregs * 2 + 2);
+  Printf.printf "    && (peep2_regno_dead_p (%d, REGNO (operands[0]))\n" (nregs + 1);
+  Printf.printf "      || (REGNO (operands[0]) == REGNO (operands[%d])))\n"  (nregs * 2);
+  Printf.printf "    && (peep2_regno_dead_p (%d, REGNO (operands[1]))\n" (nregs + 1);
+  Printf.printf "      || (REGNO (operands[1]) == REGNO (operands[%d]))))\"\n" (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..0835f16 100644
--- a/gcc/config/arm/ldmstm.md
+++ b/gcc/config/arm/ldmstm.md
@@ -1160,9 +1160,14 @@ 
             [(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]))"
+  "((((REGNO (operands[6]) == REGNO (operands[0]))
+         && (REGNO (operands[7]) == REGNO (operands[1])))
+      || ((REGNO (operands[7]) == REGNO (operands[0]))
+         && (REGNO (operands[6]) == REGNO (operands[1]))))
+    && (peep2_regno_dead_p (3, REGNO (operands[0]))
+      || (REGNO (operands[0]) == REGNO (operands[4])))
+    && (peep2_regno_dead_p (3, REGNO (operands[1]))
+      || (REGNO (operands[1]) == REGNO (operands[4]))))"
   [(parallel
     [(set (match_dup 4) (match_op_dup 5 [(match_dup 6) (match_dup 7)]))
      (clobber (reg:CC CC_REGNUM))])]
@@ -1180,9 +1185,14 @@ 
         (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]))"
+  "((((REGNO (operands[6]) == REGNO (operands[0]))
+         && (REGNO (operands[7]) == REGNO (operands[1])))
+      || ((REGNO (operands[7]) == REGNO (operands[0]))
+         && (REGNO (operands[6]) == REGNO (operands[1]))))
+    && (peep2_regno_dead_p (3, REGNO (operands[0]))
+      || (REGNO (operands[0]) == REGNO (operands[4])))
+    && (peep2_regno_dead_p (3, REGNO (operands[1]))
+      || (REGNO (operands[1]) == REGNO (operands[4]))))"
   [(set (match_dup 4) (match_op_dup 5 [(match_dup 6) (match_dup 7)]))]
 {
   if (!gen_ldm_seq (operands, 2, true))