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]

Fix PR bootstrap/71435


This fixes a bootstrap comparison failure on SPARC/Linux introduced by the 
reload change made for PR target/60040, which added calls to finish_spills 
without previously calling select_reload_regs.  This left finish_spills work 
on uninitialized data, hence the comparison failure.

The patch changes the new calls to pass 0 to finish_spills so that global 
reallocation is not done for them, but only after select_reload_regs is called 
in a next reload round.  In practice this should have a fairly limited impact 
and indeed there is no change in code generation at -O2 on SPARC for a build 
of the compiler proper without the special option of PR bootstrap/71435.

Bootstrapped/regtested on SPARC/Solaris and Linux, applied on the mainline.


2016-06-18  Eric Botcazou  <ebotcazou@adacore.com>

	PR bootstrap/71435
	* reload1.c (reload): Pass 0 to finish_spills when called because
	update_eliminables_and_spill returns true and remove did_spill.
	(finish_spills): Adjust comment and document GLOBAL parameter.

-- 
Eric Botcazou
Index: reload1.c
===================================================================
--- reload1.c	(revision 237526)
+++ reload1.c	(working copy)
@@ -897,7 +897,6 @@ reload (rtx_insn *first, int global)
   for (;;)
     {
       int something_changed;
-      int did_spill;
       HOST_WIDE_INT starting_frame_size;
 
       starting_frame_size = get_frame_size ();
@@ -982,7 +981,7 @@ reload (rtx_insn *first, int global)
       if (something_was_spilled || starting_frame_size != get_frame_size ())
 	{
 	  if (update_eliminables_and_spill ())
-	    finish_spills (global);
+	    finish_spills (0);
 	  continue;
 	}
 
@@ -1001,8 +1000,6 @@ reload (rtx_insn *first, int global)
 	   is used.  */
 	CLEAR_REG_SET (&spilled_pseudos);
 
-      did_spill = 0;
-
       something_changed = 0;
 
       /* If we allocated any new memory locations, make another pass
@@ -1019,7 +1016,7 @@ reload (rtx_insn *first, int global)
 
       if (update_eliminables_and_spill ())
 	{
-	  did_spill = 1;
+	  finish_spills (0);
 	  something_changed = 1;
 	}
       else
@@ -1027,11 +1024,10 @@ reload (rtx_insn *first, int global)
 	  select_reload_regs ();
 	  if (failure)
 	    goto failed;
+	  if (insns_need_reload)
+	    something_changed |= finish_spills (global);
 	}
 
-      if (insns_need_reload != 0 || did_spill)
-	something_changed |= finish_spills (global);
-
       if (! something_changed)
 	break;
 
@@ -4281,10 +4277,13 @@ spill_hard_reg (unsigned int regno, int
       SET_REGNO_REG_SET (&spilled_pseudos, i);
 }
 
-/* After find_reload_regs has been run for all insn that need reloads,
-   and/or spill_hard_regs was called, this function is used to actually
-   spill pseudo registers and try to reallocate them.  It also sets up the
-   spill_regs array for use by choose_reload_regs.  */
+/* After spill_hard_reg was called and/or find_reload_regs was run for all
+   insns that need reloads, this function is used to actually spill pseudo
+   registers and try to reallocate them.  It also sets up the spill_regs
+   array for use by choose_reload_regs.
+
+   GLOBAL nonzero means we should attempt to reallocate any pseudo registers
+   that we displace from hard registers.  */
 
 static int
 finish_spills (int global)

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