re PR debug/53740 (--enable-checking=yes,rtl bootstrap failure with ada)
authorRichard Sandiford <rdsandiford@googlemail.com>
Mon, 25 Jun 2012 14:20:19 +0000 (14:20 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 25 Jun 2012 14:20:19 +0000 (14:20 +0000)
PR debug/53740
* df.h, df-problems.c, dce.c: Revert last patch.

From-SVN: r188935

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

index c39b1826d923b896a4341adccff11476fbcc3c43..34f63c17f533e80e56e8ed56c107e60f4b12ba23 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-06-25  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       PR debug/53740
+       * df.h, df-problems.c, dce.c: Revert last patch.
+
 2012-06-25  Iain Sandoe  <iain@codesourcery.com>
 
        * MAINTAINERS (Write After Approval): Update my email address.
index 7e522c19a82b1f7ea5297247e0088134d6b8f40e..8954d5c0c01fd188eee894606c11d53f286f1201 100644 (file)
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -848,7 +848,7 @@ word_dce_process_block (basic_block bb, bool redo_out)
                  == 2 * UNITS_PER_WORD)
              && !bitmap_bit_p (local_live, 2 * DF_REF_REGNO (*use_rec))
              && !bitmap_bit_p (local_live, 2 * DF_REF_REGNO (*use_rec) + 1))
-           dead_debug_add (&debug, *use_rec);
+           dead_debug_add (&debug, *use_rec, DF_REF_REGNO (*use_rec));
       }
     else if (INSN_P (insn))
       {
@@ -938,7 +938,7 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au)
        for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
          if (!bitmap_bit_p (local_live, DF_REF_REGNO (*use_rec))
              && !bitmap_bit_p (au, DF_REF_REGNO (*use_rec)))
-           dead_debug_add (&debug, *use_rec);
+           dead_debug_add (&debug, *use_rec, DF_REF_REGNO (*use_rec));
       }
     else if (INSN_P (insn))
       {
index 2a698d4d5e2f17908368b8e7af3f1d18f488d8b6..a020e28ad2756cda21b4917d9982f11da4f0ae5b 100644 (file)
@@ -3165,10 +3165,10 @@ dead_debug_finish (struct dead_debug *debug, bitmap used)
     }
 }
 
-/* Add USE to DEBUG.  It must be a dead reference to a register in a debug
+/* Add USE to DEBUG.  It must be a dead reference to UREGNO in a debug
    insn.  Create a bitmap for DEBUG as needed.  */
 void
-dead_debug_add (struct dead_debug *debug, df_ref use)
+dead_debug_add (struct dead_debug *debug, df_ref use, unsigned int uregno)
 {
   struct dead_debug_use *newddu = XNEW (struct dead_debug_use);
 
@@ -3179,7 +3179,7 @@ dead_debug_add (struct dead_debug *debug, df_ref use)
   if (!debug->used)
     debug->used = BITMAP_ALLOC (NULL);
 
-  bitmap_set_bit (debug->used, REGNO (*DF_REF_REAL_LOC (use)));
+  bitmap_set_bit (debug->used, uregno);
 }
 
 /* If UREGNO is referenced by any entry in DEBUG, emit a debug insn
@@ -3201,7 +3201,6 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno,
   rtx breg;
   rtx dval;
   rtx bind;
-  rtx cur_reg;
 
   if (!debug->used || !bitmap_clear_bit (debug->used, uregno))
     return 0;
@@ -3210,8 +3209,7 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno,
      the widest referenced mode.  */
   while ((cur = *tailp))
     {
-      cur_reg = *DF_REF_REAL_LOC (cur->use);
-      if (REGNO (cur_reg) == uregno)
+      if (DF_REF_REGNO (cur->use) == uregno)
        {
          *usesp = cur;
          usesp = &cur->next;
@@ -3219,13 +3217,21 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno,
          cur->next = NULL;
          if (!reg
              || (GET_MODE_BITSIZE (GET_MODE (reg))
-                 < GET_MODE_BITSIZE (GET_MODE (cur_reg))))
-           reg = cur_reg;
+                 < GET_MODE_BITSIZE (GET_MODE (*DF_REF_REAL_LOC (cur->use)))))
+           reg = *DF_REF_REAL_LOC (cur->use);
        }
       else
        tailp = &(*tailp)->next;
     }
 
+  /* We may have dangling bits in debug->used for registers that were part
+     of a multi-register use, one component of which has been reset.  */
+  if (reg == NULL)
+    {
+      gcc_checking_assert (!uses);
+      return 0;
+    }
+
   gcc_checking_assert (uses);
 
   breg = reg;
@@ -3334,21 +3340,15 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno,
   /* Adjust all uses.  */
   while ((cur = uses))
     {
-      /* If the reference spans multiple hard registers, we'll have
-        a use for each one.  Only change each reference once.  */
-      cur_reg = *DF_REF_REAL_LOC (cur->use);
-      if (REG_P (cur_reg))
-       {
-         if (GET_MODE (cur_reg) == GET_MODE (reg))
-           *DF_REF_REAL_LOC (cur->use) = dval;
-         else
-           *DF_REF_REAL_LOC (cur->use)
-             = gen_lowpart_SUBREG (GET_MODE (cur_reg), dval);
-         /* ??? Should we simplify subreg of subreg?  */
-         if (debug->to_rescan == NULL)
-           debug->to_rescan = BITMAP_ALLOC (NULL);
-         bitmap_set_bit (debug->to_rescan, INSN_UID (DF_REF_INSN (cur->use)));
-        }
+      if (GET_MODE (*DF_REF_REAL_LOC (cur->use)) == GET_MODE (reg))
+       *DF_REF_REAL_LOC (cur->use) = dval;
+      else
+       *DF_REF_REAL_LOC (cur->use)
+         = gen_lowpart_SUBREG (GET_MODE (*DF_REF_REAL_LOC (cur->use)), dval);
+      /* ??? Should we simplify subreg of subreg?  */
+      if (debug->to_rescan == NULL)
+       debug->to_rescan = BITMAP_ALLOC (NULL);
+      bitmap_set_bit (debug->to_rescan, INSN_UID (DF_REF_INSN (cur->use)));
       uses = cur->next;
       XDELETE (cur);
     }
@@ -3547,7 +3547,7 @@ df_note_bb_compute (unsigned int bb_index,
                         debug insns either.  */
                      if (!bitmap_bit_p (artificial_uses, uregno)
                          && !df_ignore_stack_reg (uregno))
-                       dead_debug_add (&debug, use);
+                       dead_debug_add (&debug, use, uregno);
                      continue;
                    }
                  break;
index b6d168d8ee92e756431f1fc5c01b4a719ae37f9e..1b4882d1d167e08764f3409a5d9a91599afa1575 100644 (file)
--- a/gcc/df.h
+++ b/gcc/df.h
@@ -1138,7 +1138,7 @@ enum debug_temp_where
 
 extern void dead_debug_init (struct dead_debug *, bitmap);
 extern void dead_debug_finish (struct dead_debug *, bitmap);
-extern void dead_debug_add (struct dead_debug *, df_ref);
+extern void dead_debug_add (struct dead_debug *, df_ref, unsigned int);
 extern int dead_debug_insert_temp (struct dead_debug *,
                                   unsigned int uregno, rtx insn,
                                   enum debug_temp_where);