1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/patches/gcc/4.0.0/pr20973-fix.patch Sat May 19 22:52:47 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];