re PR debug/53740 (--enable-checking=yes,rtl bootstrap failure with ada)
authorAlexandre Oliva <aoliva@redhat.com>
Thu, 28 Jun 2012 07:39:25 +0000 (07:39 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Thu, 28 Jun 2012 07:39:25 +0000 (07:39 +0000)
PR debug/53740
PR debug/52983
PR debug/48866
* dce.c (word_dce_process_block): Check whether inserting debug
temps are needed even for needed insns.
(dce_process_block): Likewise.
* df-problems.c (dead_debug_add): Add comment about multi-regs.
(dead_debug_insert_temp): Likewise.  Don't subreg when we're
setting fewer regs than a multi-reg requires.

From-SVN: r189036

gcc/ChangeLog
gcc/dce.c
gcc/df-problems.c

index 09c2d568b514aac699735afdadbd7cb717bb4312..9b5a0f317d2f2a0364fd426fcdd7296cb54de706 100644 (file)
@@ -1,3 +1,15 @@
+2012-06-28  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR debug/53740
+       PR debug/52983
+       PR debug/48866
+       * dce.c (word_dce_process_block): Check whether inserting debug
+       temps are needed even for needed insns.
+       (dce_process_block): Likewise.
+       * df-problems.c (dead_debug_add): Add comment about multi-regs.
+       (dead_debug_insert_temp): Likewise.  Don't subreg when we're
+       setting fewer regs than a multi-reg requires.
+
 2012-06-27  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (alpha_dimode_u): New.
index 8954d5c0c01fd188eee894606c11d53f286f1201..2e58e4343565a7d06f8a02da0675cf83760fa7fc 100644 (file)
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -864,9 +864,12 @@ word_dce_process_block (basic_block bb, bool redo_out)
           anything in local_live.  */
        if (marked_insn_p (insn))
          df_word_lr_simulate_uses (insn, local_live);
+
        /* Insert debug temps for dead REGs used in subsequent debug
-          insns.  */
-       else if (debug.used && !bitmap_empty_p (debug.used))
+          insns.  We may have to emit a debug temp even if the insn
+          was marked, in case the debug use was after the point of
+          death.  */
+       if (debug.used && !bitmap_empty_p (debug.used))
          {
            df_ref *def_rec;
 
@@ -963,9 +966,12 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au)
           anything in local_live.  */
        if (needed)
          df_simulate_uses (insn, local_live);
+
        /* Insert debug temps for dead REGs used in subsequent debug
-          insns.  */
-       else if (debug.used && !bitmap_empty_p (debug.used))
+          insns.  We may have to emit a debug temp even if the insn
+          was marked, in case the debug use was after the point of
+          death.  */
+       if (debug.used && !bitmap_empty_p (debug.used))
          for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
            dead_debug_insert_temp (&debug, DF_REF_REGNO (*def_rec), insn,
                                    DEBUG_TEMP_BEFORE_WITH_VALUE);
index a020e28ad2756cda21b4917d9982f11da4f0ae5b..7afbed982833ab84d74603ce797d5161c91627de 100644 (file)
@@ -3179,6 +3179,9 @@ dead_debug_add (struct dead_debug *debug, df_ref use, unsigned int uregno)
   if (!debug->used)
     debug->used = BITMAP_ALLOC (NULL);
 
+  /* ??? If we dealt with split multi-registers below, we should set
+     all registers for the used mode in case of hardware
+     registers.  */
   bitmap_set_bit (debug->used, uregno);
 }
 
@@ -3269,6 +3272,15 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno,
          /* Hmm...  Something's fishy, we should be setting REG here.  */
          if (REGNO (dest) != REGNO (reg))
            breg = NULL;
+         /* If we're not overwriting all the hardware registers that
+            setting REG in its mode would, we won't know what to bind
+            the debug temp to.  ??? We could bind the debug_expr to a
+            CONCAT or PARALLEL with the split multi-registers, and
+            replace them as we found the corresponding sets.  */
+         else if (REGNO (reg) < FIRST_PSEUDO_REGISTER
+                  && (hard_regno_nregs[REGNO (reg)][GET_MODE (reg)]
+                      != hard_regno_nregs[REGNO (reg)][GET_MODE (dest)]))
+           breg = NULL;
          /* Ok, it's the same (hardware) REG, but with a different
             mode, so SUBREG it.  */
          else