]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR debug/54953
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Oct 2012 08:08:01 +0000 (08:08 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Oct 2012 08:08:01 +0000 (08:08 +0000)
* valtrack.h (DEBUG_TEMP_AFTER_WITH_REG_FORCE): New.
* valtrack.c (dead_debug_insert_temp): Use emit_debug_insn_after
even for where == DEBUG_TEMP_AFTER_WITH_REG_FORCE.
* dce.c (word_dce_process_block, dce_process_block): Pass
DEBUG_TEMP_AFTER_WITH_REG_FORCE if insn is needed and therefore
not going to be eliminated.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192978 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dce.c
gcc/valtrack.c
gcc/valtrack.h

index 4ad17e712bd788ab8afe43b97bea2af5861d65a1..a27c0df5b5e5dc27d494c406ef11d7d2b6472021 100644 (file)
@@ -1,3 +1,13 @@
+2012-10-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/54953
+       * valtrack.h (DEBUG_TEMP_AFTER_WITH_REG_FORCE): New.
+       * valtrack.c (dead_debug_insert_temp): Use emit_debug_insn_after
+       even for where == DEBUG_TEMP_AFTER_WITH_REG_FORCE.
+       * dce.c (word_dce_process_block, dce_process_block): Pass
+       DEBUG_TEMP_AFTER_WITH_REG_FORCE if insn is needed and therefore
+       not going to be eliminated.
+
 2012-10-29  Lawrence Crowl  <crowl@google.com>
 
        * sbitmap.h (sbitmap_copy): Rename bitmap_copy.
index 4c088a48fa497c646d5a3b912d4419d1f58d51cb..efc26222e7e9423024b309e2ee3d97ee3f0fdcd3 100644 (file)
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -1,5 +1,5 @@
 /* RTL dead code elimination.
-   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
+   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -880,7 +880,10 @@ word_dce_process_block (basic_block bb, bool redo_out,
 
            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);
+                                     marked_insn_p (insn)
+                                     && !control_flow_insn_p (insn)
+                                     ? DEBUG_TEMP_AFTER_WITH_REG_FORCE
+                                     : DEBUG_TEMP_BEFORE_WITH_VALUE);
          }
 
        if (dump_file)
@@ -981,7 +984,9 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au,
        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);
+                                   needed && !control_flow_insn_p (insn)
+                                   ? DEBUG_TEMP_AFTER_WITH_REG_FORCE
+                                   : DEBUG_TEMP_BEFORE_WITH_VALUE);
       }
 
   dead_debug_local_finish (&debug, NULL);
index 8cc326900ed6078c9690e1b4da3bf61f41637a3c..c1de41c74e747c4aa58709fbf7323164754583af 100644 (file)
@@ -684,7 +684,8 @@ dead_debug_insert_temp (struct dead_debug_local *debug, unsigned int uregno,
                               DEBUG_EXPR_TREE_DECL (dval), breg,
                               VAR_INIT_STATUS_INITIALIZED);
 
-  if (where == DEBUG_TEMP_AFTER_WITH_REG)
+  if (where == DEBUG_TEMP_AFTER_WITH_REG
+      || where == DEBUG_TEMP_AFTER_WITH_REG_FORCE)
     bind = emit_debug_insn_after (bind, insn);
   else
     bind = emit_debug_insn_before (bind, insn);
index 44f2d213e65ffc0d0f95da65b8ab5a319dff4281..a925e27a509ad3e07f9b9a42feacdcce888914fb 100644 (file)
@@ -131,7 +131,12 @@ enum debug_temp_where
     /* Bind a newly-created debug temporary to a REG for UREGNO, and
        insert the debug insn after INSN.  REG is expected to be set at
        INSN.  */
-    DEBUG_TEMP_AFTER_WITH_REG = 1
+    DEBUG_TEMP_AFTER_WITH_REG = 1,
+    /* Like DEBUG_TEMP_AFTER_WITH_REG, but force addition of a debug
+       temporary even if there is just a single debug use.  This is used
+       on regs that are becoming REG_DEAD on INSN and so uses of the
+       reg later on are invalid.  */
+    DEBUG_TEMP_AFTER_WITH_REG_FORCE = 2
   };
 
 extern void dead_debug_global_init (struct dead_debug_global *, bitmap);