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];
|