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

Re: BUG in 2.95.3 - wrong asm code provokes an input variable to be nullified


On Thu, 14 Jun 2001, Maxime Austruy wrote:

> In certain conditions (still not clear) gcc overwrites a parameter
> given to a function. The attached file is the preprocessed (ready
> to be compiled) file which generates the error.

This happens because regmove munges an insn carrying a REG_EQUIV note
without updating the note.  I'm currently testing the following patch,
and I'll check it in on the 2.95 branch and the mainline once the tests
have completed.  This should be a candidate for 3.0.1 as well.


Bernd

	* regmove.c (optimize_reg_copy_3): Do nothing if previous insn
	carries a REG_EQUIV note.  If it carries REG_EQUAL, delete the
	note.

Index: regmove.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/regmove.c,v
retrieving revision 1.59.4.1
diff -u -p -r1.59.4.1 regmove.c
--- regmove.c	1999/10/12 05:44:39	1.59.4.1
+++ regmove.c	2001/06/19 12:46:45
@@ -693,6 +693,9 @@ optimize_reg_copy_3 (insn, dest, src)
     }
   if (! (set = single_set (p))
       || GET_CODE (SET_SRC (set)) != MEM
+      /* If there's a REG_EQUIV note, this must be an insn that loads an
+	 argument.  Prefer keeping the note over doing this optimization.  */
+      || find_reg_note (p, REG_EQUIV, NULL_RTX)
       || SET_DEST (set) != src_reg)
     return;

@@ -736,6 +739,12 @@ optimize_reg_copy_3 (insn, dest, src)
       /* One or more changes were no good.  Back out everything.  */
       PUT_MODE (src_reg, old_mode);
       XEXP (src, 0) = src_reg;
+    }
+  else
+    {
+      rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
+      if (note)
+	remove_note (p, note);
     }
 }



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