patches/gcc/4.0.0/130-pr20973-fix.patch
changeset 402 197e1b49586e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/gcc/4.0.0/130-pr20973-fix.patch	Sun Sep 23 17:08:09 2007 +0000
     1.3 @@ -0,0 +1,80 @@
     1.4 +http://gcc.gnu.org/PR20973
     1.5 +
     1.6 +"gcc 4 (about RC1) miscompiles khtml, in fact something in CSS, which basically 
     1.7 +leads to all websites being misrendered.  I can't easily reduce the testcase, 
     1.8 +but have applied the whole preprocessed source of css/cssstyleselector.ii. 
     1.9 + 
    1.10 +It is to be compiled with g++ -O2 -fPIC -march=i586 -mtune=i686 
    1.11 +-fno-exceptions.  A more detailed analysis will follow, as we've found out 
    1.12 +some things already."
    1.13 +
    1.14 +---
    1.15 +
    1.16 +Subject: Bug 20973
    1.17 +
    1.18 +CVSROOT:	/cvs/gcc
    1.19 +Module name:	gcc
    1.20 +Branch: 	gcc-4_0-branch
    1.21 +Changes by:	matz@gcc.gnu.org	2005-04-22 17:30:21
    1.22 +
    1.23 +Modified files:
    1.24 +	gcc            : ChangeLog reload.c 
    1.25 +
    1.26 +Log message:
    1.27 +	PR middle-end/20973
    1.28 +	* reload.c (push_reload, find_dummy_reload): Check for uninitialized
    1.29 +	pseudos.
    1.30 +
    1.31 +Patches:
    1.32 +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.177&r2=2.7592.2.178
    1.33 +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/reload.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.268&r2=1.268.2.1
    1.34 +
    1.35 +---
    1.36 +
    1.37 +===================================================================
    1.38 +RCS file: /cvs/gcc/gcc/gcc/reload.c,v
    1.39 +retrieving revision 1.268
    1.40 +retrieving revision 1.268.2.1
    1.41 +diff -u -r1.268 -r1.268.2.1
    1.42 +--- gcc/gcc/reload.c	2005/02/24 22:06:06	1.268
    1.43 ++++ gcc/gcc/reload.c	2005/04/22 17:30:15	1.268.2.1
    1.44 +@@ -1520,7 +1520,7 @@
    1.45 +      But if there is no spilling in this block, that is OK.
    1.46 +      An explicitly used hard reg cannot be a spill reg.  */
    1.47 + 
    1.48 +-  if (rld[i].reg_rtx == 0 && in != 0)
    1.49 ++  if (rld[i].reg_rtx == 0 && in != 0 && hard_regs_live_known)
    1.50 +     {
    1.51 +       rtx note;
    1.52 +       int regno;
    1.53 +@@ -1534,6 +1534,11 @@
    1.54 + 	    && REG_P (XEXP (note, 0))
    1.55 + 	    && (regno = REGNO (XEXP (note, 0))) < FIRST_PSEUDO_REGISTER
    1.56 + 	    && reg_mentioned_p (XEXP (note, 0), in)
    1.57 ++	    /* Check that we don't use a hardreg for an uninitialized
    1.58 ++	       pseudo.  See also find_dummy_reload().  */
    1.59 ++	    && (ORIGINAL_REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER
    1.60 ++		|| ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
    1.61 ++				   ORIGINAL_REGNO (XEXP (note, 0))))
    1.62 + 	    && ! refers_to_regno_for_reload_p (regno,
    1.63 + 					       (regno
    1.64 + 						+ hard_regno_nregs[regno]
    1.65 +@@ -1997,7 +2002,17 @@
    1.66 + 				is a subreg, and in that case, out
    1.67 + 				has a real mode.  */
    1.68 + 			     (GET_MODE (out) != VOIDmode
    1.69 +-			      ? GET_MODE (out) : outmode)))
    1.70 ++			      ? GET_MODE (out) : outmode))
    1.71 ++        /* But only do all this if we can be sure, that this input
    1.72 ++           operand doesn't correspond with an uninitialized pseudoreg.
    1.73 ++           global can assign some hardreg to it, which is the same as
    1.74 ++	   a different pseudo also currently live (as it can ignore the
    1.75 ++	   conflict).  So we never must introduce writes to such hardregs,
    1.76 ++	   as they would clobber the other live pseudo using the same.
    1.77 ++	   See also PR20973.  */
    1.78 ++      && (ORIGINAL_REGNO (in) < FIRST_PSEUDO_REGISTER
    1.79 ++          || ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
    1.80 ++			     ORIGINAL_REGNO (in))))
    1.81 +     {
    1.82 +       unsigned int regno = REGNO (in) + in_offset;
    1.83 +       unsigned int nwords = hard_regno_nregs[regno][inmode];