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