This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
ira.c update_equiv_regs patch causes gcc/testsuite/gcc.target/arm/pr43920-2.c regression
- From: Shiva Chen <shiva0217 at gmail dot com>
- To: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Fri, 17 Apr 2015 17:57:48 +0800
- Subject: ira.c update_equiv_regs patch causes gcc/testsuite/gcc.target/arm/pr43920-2.c regression
- Authentication-results: sourceware.org; auth=none
Hi,
I think the rtl dump in
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64916
is not jump2 phase rtl dump.
Because jump2 is after ira, the register number should be hardware
register number.
the jump2 rtl dump should as follow
...
31: NOTE_INSN_BASIC_BLOCK 5
32: [r6:SI]=r4:SI
REG_DEAD r6:SI
REG_DEAD r4:SI
33: [r5:SI]=r0:SI
REG_DEAD r5:SI
REG_DEAD r0:SI
7: r0:SI=0
REG_EQUAL 0
85: use r0:SI
86: {return;sp:SI=sp:SI+0x18;r3:SI=[sp:SI];r4:SI=[sp:SI+0x4];r5:SI=[sp:SI+0x8];r6:SI=[sp:SI+0xc];r7:SI=[sp:SI+0x10];pc:SI=[sp:SI+0x14];}
REG_UNUSED pc:SI
REG_UNUSED r3:SI
REG_CFA_RESTORE r7:SI
REG_CFA_RESTORE r6:SI
REG_CFA_RESTORE r5:SI
REG_CFA_RESTORE r4:SI
REG_CFA_RESTORE r3:SI
77: barrier
46: L46:
45: NOTE_INSN_BASIC_BLOCK 6
8: r0:SI=r4:SI
REG_DEAD r4:SI
REG_EQUAL 0xffffffffffffffff
87: use r0:SI
88: {return;sp:SI=sp:SI+0x18;r3:SI=[sp:SI];r4:SI=[sp:SI+0x4];r5:SI=[sp:SI+0x8];r6:SI=[sp:SI+0xc];r7:SI=[sp:SI+0x10];pc:SI=[sp:SI+0x14];}
REG_UNUSED pc:SI
REG_UNUSED r3:SI
REG_CFA_RESTORE r7:SI
REG_CFA_RESTORE r6:SI
REG_CFA_RESTORE r5:SI
REG_CFA_RESTORE r4:SI
REG_CFA_RESTORE r3:SI
79: barrier
54: L54:
53: NOTE_INSN_BASIC_BLOCK 7
9: r0:SI=0xffffffffffffffff <== lost REG_EQUAL after patch
34: L34:
35: NOTE_INSN_BASIC_BLOCK 8
41: use r0:SI
90: {return;sp:SI=sp:SI+0x18;r3:SI=[sp:SI];r4:SI=[sp:SI+0x4];r5:SI=[sp:SI+0x8];r6:SI=[sp:SI+0xc];r7:SI=[sp:SI+0x10];pc:SI=[sp:SI+0x14];}
REG_UNUSED pc:SI
REG_UNUSED r3:SI
REG_CFA_RESTORE r7:SI
REG_CFA_RESTORE r6:SI
REG_CFA_RESTORE r5:SI
REG_CFA_RESTORE r4:SI
REG_CFA_RESTORE r3:SI
89: barrier
try_forward_edges(remove basic block 6) fail by try_crossjump_bb didn't occur.
try_crossjump_bb (remove insns in basic block 6) fail by comparison
between insn 9 and insn 8 not eqaul.
The comparison in function can_replace_by use REG_EQUAL to compare
register content.
The REG_EQAUL lost in insn 9, so the comparison fail.
But we may still have chance to remove basic block 6 in this case.
Because right hand value of insn 9 is already a constant.
We could get comparison equal by comparing between insn 8's register
note and insn 9's RHS if RHS is a constant integer.
Possible patch for can_replace_by in cfgcleanup.c.
- if (!note1 || !note2 || !rtx_equal_p (XEXP (note1, 0), XEXP (note2, 0))
- || !CONST_INT_P (XEXP (note1, 0)))
+
+ if (!note1 || !CONST_INT_P (XEXP (note1, 0)))
return dir_none;
+ if (note2)
+ {
+ if (!rtx_equal_p (XEXP (note1, 0), XEXP (note2, 0)))
+ return dir_none;
+ }
+ else
+ {
+ if (!CONST_INT_P (SET_SRC (s2))
+ || !rtx_equal_p (XEXP (note1, 0), SET_SRC (s2)))
+ return dir_none;
+ }
+
I'm not sure the idea is ok or it might crash something.
Any suggestion would be very helpful.
Thanks in advance.
Shiva Chen