This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH] [RTL] Relax CSE check to set REG_EQUAL notes.
- From: Alex Velenko <Alex dot Velenko at arm dot com>
- To: Jeff Law <law at redhat dot com>, Steven Bosscher <stevenb dot gcc at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Marcus Shawcroft <Marcus dot Shawcroft at arm dot com>
- Date: Fri, 10 Apr 2015 10:14:00 +0100
- Subject: Re: [PATCH] [RTL] Relax CSE check to set REG_EQUAL notes.
- Authentication-results: sourceware.org; auth=none
- References: <1425467354-6018-1-git-send-email-alex dot velenko at arm dot com> <CABu31nMVShGV0WrECtz64JO3wvY0xuqWy_iDK9b2jVO2LHik3Q at mail dot gmail dot com> <54FDDB1C dot 2000006 at redhat dot com>
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.
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 gcc.target/arm/pr43920-2.c 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 <Alex.Velenko@arm.com>
* cfgcleanup.c (can_replace_by): Use const int rtx of single set as
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
@@ -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)))
+ 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))
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
location of replacement. */
- src1 = SET_SRC (s1);
- src2 = SET_SRC (s2);
c1 = CONST_INT_P (src1);
c2 = CONST_INT_P (src2);
if (c1 && c2)