On 01/29/2012 04:09 PM, Eric Botcazou wrote:
As discussed in Bugzilla, this is the patch implementing Paolo's suggestion of killing REG_EQUAL/REG_EQUIV notes from df_kill_notes. The code assumes there is at most one such note per insn.That's wrong though and wreaks havoc during reload, e.g.: (insn 169 60 62 4 (set (reg:TF 158) (mem/c:TF (plus:SI (reg/f:SI 101 %sfp) (const_int -16 [0xfffffffffffffff0])) [3 S16 A64])) 960513-1.c:13 97 {*movtf_insn_sp32} (expr_list:REG_EQUIV (mem/c:TF (plus:SI (reg/f:SI 101 %sfp) (const_int -16 [0xfffffffffffffff0])) [3 S16 A64]) (expr_list:REG_EQUAL (mult:TF (reg/v:TF 110 [ d ]) (reg:TF 154)) (nil)))) because the REG_EQUIV note disappears behind reload's back and it isn't prepared for that. This is the cause of the following regression on SPARC: FAIL: gcc.c-torture/execute/960513-1.c execution, -OsAs well as: FAIL: gcc.c-torture/execute/stdarg-2.c execution, -O2 FAIL: gcc.c-torture/execute/stdarg-2.c execution, -O3 -fomit-frame-pointer FAIL: gcc.c-torture/execute/stdarg-2.c execution, -O3 -g FAIL: gcc.c-torture/execute/stdarg-2.c execution, -Os FAIL: gcc.c-torture/execute/stdarg-2.c execution, -O2 -flto -flto-partition=none FAIL: gcc.c-torture/execute/stdarg-2.c execution, -O2 -flto for the exact same reason.
Does this help? Paolo
2012-01-30 Paolo Bonzini <[email protected]> * df-problems.c (df_kill_notes): Check that the use refers to the note under examination. Index: df-problems.c =================================================================== --- df-problems.c (revision 183693) +++ df-problems.c (working copy) @@ -2814,8 +2814,10 @@ df_kill_notes (rtx insn, bitmap live) { df_ref use = *use_rec; if (DF_REF_REGNO (use) > FIRST_PSEUDO_REGISTER + && DF_REF_LOC (use) && (DF_REF_FLAGS (use) & DF_REF_IN_NOTE) - && ! bitmap_bit_p (live, DF_REF_REGNO (use))) + && ! bitmap_bit_p (live, DF_REF_REGNO (use)) + && loc_mentioned_in_p (DF_REF_LOC (use), XEXP (link, 0))) { deleted = true; break;
