summaryrefslogtreecommitdiff
path: root/patches/gcc/4.0.0/pr20973-fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/gcc/4.0.0/pr20973-fix.patch')
-rw-r--r--patches/gcc/4.0.0/pr20973-fix.patch80
1 files changed, 80 insertions, 0 deletions
diff --git a/patches/gcc/4.0.0/pr20973-fix.patch b/patches/gcc/4.0.0/pr20973-fix.patch
new file mode 100644
index 0000000..7451219
--- /dev/null
+++ b/patches/gcc/4.0.0/pr20973-fix.patch
@@ -0,0 +1,80 @@
+http://gcc.gnu.org/PR20973
+
+"gcc 4 (about RC1) miscompiles khtml, in fact something in CSS, which basically
+leads to all websites being misrendered. I can't easily reduce the testcase,
+but have applied the whole preprocessed source of css/cssstyleselector.ii.
+
+It is to be compiled with g++ -O2 -fPIC -march=i586 -mtune=i686
+-fno-exceptions. A more detailed analysis will follow, as we've found out
+some things already."
+
+---
+
+Subject: Bug 20973
+
+CVSROOT: /cvs/gcc
+Module name: gcc
+Branch: gcc-4_0-branch
+Changes by: matz@gcc.gnu.org 2005-04-22 17:30:21
+
+Modified files:
+ gcc : ChangeLog reload.c
+
+Log message:
+ PR middle-end/20973
+ * reload.c (push_reload, find_dummy_reload): Check for uninitialized
+ pseudos.
+
+Patches:
+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
+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
+
+---
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/reload.c,v
+retrieving revision 1.268
+retrieving revision 1.268.2.1
+diff -u -r1.268 -r1.268.2.1
+--- gcc/gcc/reload.c 2005/02/24 22:06:06 1.268
++++ gcc/gcc/reload.c 2005/04/22 17:30:15 1.268.2.1
+@@ -1520,7 +1520,7 @@
+ But if there is no spilling in this block, that is OK.
+ An explicitly used hard reg cannot be a spill reg. */
+
+- if (rld[i].reg_rtx == 0 && in != 0)
++ if (rld[i].reg_rtx == 0 && in != 0 && hard_regs_live_known)
+ {
+ rtx note;
+ int regno;
+@@ -1534,6 +1534,11 @@
+ && REG_P (XEXP (note, 0))
+ && (regno = REGNO (XEXP (note, 0))) < FIRST_PSEUDO_REGISTER
+ && reg_mentioned_p (XEXP (note, 0), in)
++ /* Check that we don't use a hardreg for an uninitialized
++ pseudo. See also find_dummy_reload(). */
++ && (ORIGINAL_REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER
++ || ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
++ ORIGINAL_REGNO (XEXP (note, 0))))
+ && ! refers_to_regno_for_reload_p (regno,
+ (regno
+ + hard_regno_nregs[regno]
+@@ -1997,7 +2002,17 @@
+ is a subreg, and in that case, out
+ has a real mode. */
+ (GET_MODE (out) != VOIDmode
+- ? GET_MODE (out) : outmode)))
++ ? GET_MODE (out) : outmode))
++ /* But only do all this if we can be sure, that this input
++ operand doesn't correspond with an uninitialized pseudoreg.
++ global can assign some hardreg to it, which is the same as
++ a different pseudo also currently live (as it can ignore the
++ conflict). So we never must introduce writes to such hardregs,
++ as they would clobber the other live pseudo using the same.
++ See also PR20973. */
++ && (ORIGINAL_REGNO (in) < FIRST_PSEUDO_REGISTER
++ || ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
++ ORIGINAL_REGNO (in))))
+ {
+ unsigned int regno = REGNO (in) + in_offset;
+ unsigned int nwords = hard_regno_nregs[regno][inmode];