re PR debug/52983 (internal compiler error: in df_uses_record, at df-scan.c:3243)
authorAlexandre Oliva <aoliva@redhat.com>
Wed, 13 Jun 2012 20:41:55 +0000 (20:41 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Wed, 13 Jun 2012 20:41:55 +0000 (20:41 +0000)
PR debug/52983
PR debug/48866
* dce.c (word_dce_process_block): Insert debug temps only if the
insn is not marked.
(dce_process_block): Likewise, and if debug.used is not empty,
and only after iterating over all DEFs that might mark the insn.

From-SVN: r188527

gcc/ChangeLog
gcc/dce.c

index 6969253b2578f5c755c8499c075ebfa7478f1b68..c17e7ad511ee6b7643e7a0e5cfb18cedcf9b3961 100644 (file)
@@ -1,3 +1,12 @@
+2012-06-13  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR debug/52983
+       PR debug/48866
+       * dce.c (word_dce_process_block): Insert debug temps only if the
+       insn is not marked.
+       (dce_process_block): Likewise, and if debug.used is not empty,
+       and only after iterating over all DEFs that might mark the insn.
+
 2012-06-13  Alexandre Oliva  <aoliva@redhat.com>
 
        * common.opt (ftree-coalesce-inlined-vars): New.
index c706296c663e052ad9aafd21e2ffe52b93fcae47..86edea11c55602180116ef4b1846ece2fea7f3a0 100644 (file)
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -857,8 +857,9 @@ 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);
-
-       if (debug.used && !bitmap_empty_p (debug.used))
+       /* Insert debug temps for dead REGs used in subsequent debug
+          insns.  */
+       else if (debug.used && !bitmap_empty_p (debug.used))
          {
            df_ref *def_rec;
 
@@ -939,18 +940,13 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au)
        /* The insn is needed if there is someone who uses the output.  */
        if (!needed)
          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);
-
-             if (bitmap_bit_p (local_live, DF_REF_REGNO (*def_rec))
-                 || bitmap_bit_p (au, DF_REF_REGNO (*def_rec)))
-               {
-                 needed = true;
-                 mark_insn (insn, true);
-                 break;
-               }
-           }
+           if (bitmap_bit_p (local_live, DF_REF_REGNO (*def_rec))
+               || bitmap_bit_p (au, DF_REF_REGNO (*def_rec)))
+             {
+               needed = true;
+               mark_insn (insn, true);
+               break;
+             }
 
        /* No matter if the instruction is needed or not, we remove
           any regno in the defs from the live set.  */
@@ -960,6 +956,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))
+         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);
       }
 
   dead_debug_finish (&debug, NULL);