]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/20973 (kdelibs (khtml) miscompiled by reload)
authorMichael Matz <matz@suse.de>
Wed, 20 Apr 2005 14:30:38 +0000 (14:30 +0000)
committerMichael Matz <matz@gcc.gnu.org>
Wed, 20 Apr 2005 14:30:38 +0000 (14:30 +0000)
        PR20973
        * reload.c (push_reload, find_dummy_reload): Check for uninitialized
        pseudos.

From-SVN: r98460

gcc/ChangeLog
gcc/reload.c

index 03c3961fde14568e0c5c11170ce98d8749f8f01d..b6f7eab1973c7c1402a06b63b5474e47623acb23 100644 (file)
@@ -1,3 +1,9 @@
+2005-04-20  Michael Matz  <matz@suse.de>
+
+       PR20973
+       * reload.c (push_reload, find_dummy_reload): Check for uninitialized
+       pseudos.
+
 2005-04-20  Kazu Hirata  <kazu@cs.umass.edu>
 
        * tree-ssa-phiopt.c: Fix comment typos.
index 7d42492a98d6899b0c9284b6a7f41e1647c8362d..29154753b85949e3e53114b3a7ff851e87d6ac0d 100644 (file)
@@ -1520,7 +1520,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
      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 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
            && 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 @@ find_dummy_reload (rtx real_in, rtx real_out, rtx *inloc, rtx *outloc,
                                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];