OSDN Git Service

PR rtl-optimization/42889
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 Jan 2010 12:14:47 +0000 (12:14 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 Jan 2010 12:14:47 +0000 (12:14 +0000)
* df.h (df_set_bb_dirty_nonlr): New prototype.
* df-core.c (df_set_bb_dirty_nonlr): New function.
* df-scan.c (df_insn_rescan): Call it instead of
df_set_bb_dirty for DEBUG_INSNs.

* gcc.dg/pr42889.c: New test.

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

gcc/ChangeLog
gcc/df-core.c
gcc/df-scan.c
gcc/df.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr42889.c [new file with mode: 0644]

index 39fd7f8..5856b0c 100644 (file)
@@ -1,3 +1,11 @@
+2010-01-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/42889
+       * df.h (df_set_bb_dirty_nonlr): New prototype.
+       * df-core.c (df_set_bb_dirty_nonlr): New function.
+       * df-scan.c (df_insn_rescan): Call it instead of
+       df_set_bb_dirty for DEBUG_INSNs.
+
 2010-01-29  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/37448
index 5ec802d..cee00b9 100644 (file)
@@ -1354,6 +1354,30 @@ df_set_bb_dirty (basic_block bb)
 }
 
 
+/* Mark BB as needing it's transfer functions as being out of
+   date, except for LR problem.  Used when analyzing DEBUG_INSNs,
+   as LR problem can trigger DCE, and DEBUG_INSNs shouldn't ever
+   shorten or enlarge lifetime of regs.  */
+
+void
+df_set_bb_dirty_nonlr (basic_block bb)
+{
+  if (df)
+    {
+      int p;
+      for (p = 1; p < df->num_problems_defined; p++)
+       {
+         struct dataflow *dflow = df->problems_in_order[p];
+         if (dflow == df_lr)
+           continue;
+         if (dflow->out_of_date_transfer_functions)
+           bitmap_set_bit (dflow->out_of_date_transfer_functions, bb->index);
+         dflow->solutions_dirty = true;
+       }
+    }
+}
+
+
 /* Clear the dirty bits.  This is called from places that delete
    blocks.  */
 static void
index 6c8c42b..c3a3dc7 100644 (file)
@@ -1301,7 +1301,10 @@ df_insn_rescan (rtx insn)
     }
 
   df_refs_add_to_chains (&collection_rec, bb, insn);
-  df_set_bb_dirty (bb);
+  if (DEBUG_INSN_P (insn))
+    df_set_bb_dirty_nonlr (bb);
+  else
+    df_set_bb_dirty (bb);
 
   VEC_free (df_ref, stack, collection_rec.def_vec);
   VEC_free (df_ref, stack, collection_rec.use_vec);
index f8b28ad..194cbcf 100644 (file)
--- a/gcc/df.h
+++ b/gcc/df.h
@@ -912,6 +912,7 @@ extern void df_simple_dataflow (enum df_flow_dir, df_init_function,
 extern void df_mark_solutions_dirty (void);
 extern bool df_get_bb_dirty (basic_block);
 extern void df_set_bb_dirty (basic_block);
+extern void df_set_bb_dirty_nonlr (basic_block);
 extern void df_compact_blocks (void);
 extern void df_bb_replace (int, basic_block);
 extern void df_bb_delete (int);
index a4c134d..d7648a9 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/42889
+       * gcc.dg/pr42889.c: New test.
+
 2010-01-28  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/pr42881.c: Use SSE2.
diff --git a/gcc/testsuite/gcc.dg/pr42889.c b/gcc/testsuite/gcc.dg/pr42889.c
new file mode 100644 (file)
index 0000000..d342173
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR rtl-optimization/42889 */
+/* { dg-do compile } */
+/* { dg-options "-O -fgcse -fcompare-debug" } */
+
+extern int A[], B[];
+
+int
+foo (int x, int c, int i)
+{
+  if (A[i] && B[i])
+    x = x % ((c & 4) ? 8 : 4);
+  return x;
+}