This is the mail archive of the 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] [RTL] Relax CSE check to set REG_EQUAL notes.

On 09/03/15 17:40, Jeff Law wrote:
On 03/09/15 03:53, Steven Bosscher wrote:
On Wed, Mar 4, 2015 at 12:09 PM, Alex Velenko wrote:
For example, in arm testcase pr43920-2.c, CSE previously decided not to put
an "obvious" note on insn 9, as set value was the same as note value.
At the same time, other insns set up as -1 were set up through a register
and did get a note:

...which is the point of the REG_EQUAL notes. In insn 8 there is a
REG_EQUAL note to show that the value of r111 is known. In insn 9 the
known value is, well, known from SET_SRC so there is no need for a
REG_EQUAL note. Adding REG_EQUAL notes in such cases is just wasteful.
RIght.  I'd rather look into why later passes aren't discovering
whatever equivalences are important rather than adding the redundant notes.

Regardless, I think this is a gcc-6 issue, so I'm not likely to look at
it in the immediate future.


Hi Jeff,
I reworked the patch to satisfy your preference.

This patch enables cfgcleanup.c to use const int rtx as REG_EQUAL notes.
For example, this benefits Jump2 to find extra optimisation opportunities.
This patch fixes for arm-none-eabi.

Bootstraped on x86, run full regression run on arm-none-eabi and

Is this patch ok?


2015-03-17  Alex Velenko  <>

    * cfgcleanup.c (can_replace_by): Use const int rtx of single set as
    REG_EQUAL note.
 gcc/cfgcleanup.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index cee152e..b28a1d3 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -1046,7 +1046,7 @@ equal_different_set_p (rtx p1, rtx s1, rtx p2, rtx s2)
 static enum replace_direction
 can_replace_by (rtx_insn *i1, rtx_insn *i2)
-  rtx s1, s2, d1, d2, src1, src2, note1, note2;
+  rtx s1, s2, d1, d2, src1, src2, note1, note2, cmp_rtx1, cmp_rtx2;
   bool c1, c2;

   /* Check for 2 sets.  */
@@ -1062,12 +1062,29 @@ can_replace_by (rtx_insn *i1, rtx_insn *i2)
         ? rtx_renumbered_equal_p (d1, d2) : rtx_equal_p (d1, d2)))
     return dir_none;

+  src1 = SET_SRC (s1);
+  src2 = SET_SRC (s2);
/* Find identical req_equiv or reg_equal note, which implies that the 2 sets
      set dest to the same value.  */
   note1 = find_reg_equal_equiv_note (i1);
   note2 = find_reg_equal_equiv_note (i2);
-  if (!note1 || !note2 || !rtx_equal_p (XEXP (note1, 0), XEXP (note2, 0))
-      || !CONST_INT_P (XEXP (note1, 0)))
+  cmp_rtx1 = NULL_RTX;
+  cmp_rtx2 = NULL_RTX;
+  if (note1)
+    cmp_rtx1 = XEXP (note1, 0);
+  else if (CONST_INT_P (src1))
+    cmp_rtx1 = src1;
+  if (note2)
+    cmp_rtx2 = XEXP (note2, 0);
+  else if (CONST_INT_P (src2))
+    cmp_rtx2 = src2;
+  if (!cmp_rtx1 || !cmp_rtx2 || !rtx_equal_p (cmp_rtx1, cmp_rtx2)
+      || !CONST_INT_P (cmp_rtx1))
     return dir_none;

   if (!equal_different_set_p (PATTERN (i1), s1, PATTERN (i2), s2))
@@ -1079,8 +1096,6 @@ can_replace_by (rtx_insn *i1, rtx_insn *i2)
        (set (dest) (reg))
because we don't know if the reg is live and has the same value at the
      location of replacement.  */
-  src1 = SET_SRC (s1);
-  src2 = SET_SRC (s2);
   c1 = CONST_INT_P (src1);
   c2 = CONST_INT_P (src2);
   if (c1 && c2)

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