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

Re: [PATCH] Fix PR 51505


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, -Os

As 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  <bonzini@gnu.org>

	* 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;

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