patches/gcc/4.0.0/130-pr20973-fix.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Sep 04 17:27:16 2009 +0200 (2009-09-04)
changeset 1512 439a6b292917
permissions -rw-r--r--
TODO: update

Add TODO list for m4, autoconf, automake and libtool.
Building our own versions would remove burden from the users
who have older versions on their distributions, and are not
ready/able/allowed to upgrade.
yann@402
     1
http://gcc.gnu.org/PR20973
yann@402
     2
yann@402
     3
"gcc 4 (about RC1) miscompiles khtml, in fact something in CSS, which basically 
yann@402
     4
leads to all websites being misrendered.  I can't easily reduce the testcase, 
yann@402
     5
but have applied the whole preprocessed source of css/cssstyleselector.ii. 
yann@402
     6
 
yann@402
     7
It is to be compiled with g++ -O2 -fPIC -march=i586 -mtune=i686 
yann@402
     8
-fno-exceptions.  A more detailed analysis will follow, as we've found out 
yann@402
     9
some things already."
yann@402
    10
yann@402
    11
---
yann@402
    12
yann@402
    13
Subject: Bug 20973
yann@402
    14
yann@402
    15
CVSROOT:	/cvs/gcc
yann@402
    16
Module name:	gcc
yann@402
    17
Branch: 	gcc-4_0-branch
yann@402
    18
Changes by:	matz@gcc.gnu.org	2005-04-22 17:30:21
yann@402
    19
yann@402
    20
Modified files:
yann@402
    21
	gcc            : ChangeLog reload.c 
yann@402
    22
yann@402
    23
Log message:
yann@402
    24
	PR middle-end/20973
yann@402
    25
	* reload.c (push_reload, find_dummy_reload): Check for uninitialized
yann@402
    26
	pseudos.
yann@402
    27
yann@402
    28
Patches:
yann@402
    29
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
yann@402
    30
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
yann@402
    31
yann@402
    32
---
yann@402
    33
yann@402
    34
===================================================================
yann@402
    35
RCS file: /cvs/gcc/gcc/gcc/reload.c,v
yann@402
    36
retrieving revision 1.268
yann@402
    37
retrieving revision 1.268.2.1
yann@402
    38
diff -u -r1.268 -r1.268.2.1
yann@402
    39
--- gcc/gcc/reload.c	2005/02/24 22:06:06	1.268
yann@402
    40
+++ gcc/gcc/reload.c	2005/04/22 17:30:15	1.268.2.1
yann@402
    41
@@ -1520,7 +1520,7 @@
yann@402
    42
      But if there is no spilling in this block, that is OK.
yann@402
    43
      An explicitly used hard reg cannot be a spill reg.  */
yann@402
    44
 
yann@402
    45
-  if (rld[i].reg_rtx == 0 && in != 0)
yann@402
    46
+  if (rld[i].reg_rtx == 0 && in != 0 && hard_regs_live_known)
yann@402
    47
     {
yann@402
    48
       rtx note;
yann@402
    49
       int regno;
yann@402
    50
@@ -1534,6 +1534,11 @@
yann@402
    51
 	    && REG_P (XEXP (note, 0))
yann@402
    52
 	    && (regno = REGNO (XEXP (note, 0))) < FIRST_PSEUDO_REGISTER
yann@402
    53
 	    && reg_mentioned_p (XEXP (note, 0), in)
yann@402
    54
+	    /* Check that we don't use a hardreg for an uninitialized
yann@402
    55
+	       pseudo.  See also find_dummy_reload().  */
yann@402
    56
+	    && (ORIGINAL_REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER
yann@402
    57
+		|| ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
yann@402
    58
+				   ORIGINAL_REGNO (XEXP (note, 0))))
yann@402
    59
 	    && ! refers_to_regno_for_reload_p (regno,
yann@402
    60
 					       (regno
yann@402
    61
 						+ hard_regno_nregs[regno]
yann@402
    62
@@ -1997,7 +2002,17 @@
yann@402
    63
 				is a subreg, and in that case, out
yann@402
    64
 				has a real mode.  */
yann@402
    65
 			     (GET_MODE (out) != VOIDmode
yann@402
    66
-			      ? GET_MODE (out) : outmode)))
yann@402
    67
+			      ? GET_MODE (out) : outmode))
yann@402
    68
+        /* But only do all this if we can be sure, that this input
yann@402
    69
+           operand doesn't correspond with an uninitialized pseudoreg.
yann@402
    70
+           global can assign some hardreg to it, which is the same as
yann@402
    71
+	   a different pseudo also currently live (as it can ignore the
yann@402
    72
+	   conflict).  So we never must introduce writes to such hardregs,
yann@402
    73
+	   as they would clobber the other live pseudo using the same.
yann@402
    74
+	   See also PR20973.  */
yann@402
    75
+      && (ORIGINAL_REGNO (in) < FIRST_PSEUDO_REGISTER
yann@402
    76
+          || ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
yann@402
    77
+			     ORIGINAL_REGNO (in))))
yann@402
    78
     {
yann@402
    79
       unsigned int regno = REGNO (in) + in_offset;
yann@402
    80
       unsigned int nwords = hard_regno_nregs[regno][inmode];