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: PR rtl-optimization/46603


> Eric, could you please take a look again at your reload bug fix
> first posted at:
>
> 	http://gcc.gnu.org/ml/gcc-patches/2009-11/msg01671.html
>
> It looks correct to me, and I can reproduce it with the VIS3 fp moves
> enabled by simply adjusting the costs and register class preferences
> such that IRA uses float regs more aggressively than it should.

OK, bootstrapped/regtested on SPARC/Solaris and x86-64/Linux, applied.


2011-10-25  Eric Botcazou  <ebotcazou@adacore.com>

	PR rtl-optimization/46603
	* reload.c (push_reload): In the out case, reload the subreg as well
	as the reg if it has word mode.


2011-10-25  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc.dg/vect/slp-multitypes-2.c: Do not XFAIL on SPARC 32-bit.


-- 
Eric Botcazou
Index: reload.c
===================================================================
--- reload.c	(revision 180423)
+++ reload.c	(working copy)
@@ -1117,10 +1117,10 @@ push_reload (rtx in, rtx out, rtx *inloc
 
   /* Similarly for paradoxical and problematical SUBREGs on the output.
      Note that there is no reason we need worry about the previous value
-     of SUBREG_REG (out); even if wider than out,
-     storing in a subreg is entitled to clobber it all
-     (except in the case of STRICT_LOW_PART,
-     and in that case the constraint should label it input-output.)  */
+     of SUBREG_REG (out); even if wider than out, storing in a subreg is
+     entitled to clobber it all (except in the case of a word mode subreg
+     or of a STRICT_LOW_PART, in that latter case the constraint should
+     label it input-output.)  */
   if (out != 0 && GET_CODE (out) == SUBREG
       && (subreg_lowpart_p (out) || strict_low)
 #ifdef CANNOT_CHANGE_MODE_CLASS
@@ -1142,16 +1142,6 @@ push_reload (rtx in, rtx out, rtx *inloc
 			   / UNITS_PER_WORD)))
 #endif
 		  ))
-	  || (REG_P (SUBREG_REG (out))
-	      && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER
-	      && ((GET_MODE_SIZE (outmode) <= UNITS_PER_WORD
-		   && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))
-		       > UNITS_PER_WORD)
-		   && ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))
-			/ UNITS_PER_WORD)
-		       != (int) hard_regno_nregs[REGNO (SUBREG_REG (out))]
-						[GET_MODE (SUBREG_REG (out))]))
-		  || ! HARD_REGNO_MODE_OK (subreg_regno (out), outmode)))
 	  || (secondary_reload_class (0, rclass, outmode, out) != NO_REGS
 	      && (secondary_reload_class (0, rclass, GET_MODE (SUBREG_REG (out)),
 					  SUBREG_REG (out))
Index: testsuite/gcc.dg/vect/slp-multitypes-2.c
===================================================================
--- testsuite/gcc.dg/vect/slp-multitypes-2.c	(revision 180423)
+++ testsuite/gcc.dg/vect/slp-multitypes-2.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-xfail-run-if "PR rtl-optimization/46603" { sparc*-*-* && { ilp32 && gas } } } */
 
 #include <stdarg.h>
 #include "tree-vect.h"

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