This is the mail archive of the gcc@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]

ira.c update_equiv_regs patch causes gcc/testsuite/gcc.target/arm/pr43920-2.c regression


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


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