aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-01-29 12:14:47 +0000
committerJakub Jelinek <jakub@redhat.com>2010-01-29 12:14:47 +0000
commitd68fce26ea56711faa9581d15ab726d207bfa767 (patch)
tree099818190b187b032b4dfe2e1e0061d89697cfca
parentdb671e985683b0dc034a849b7023063779809da9 (diff)
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. * gcc.dg/pr42889.c: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@156344 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/df-core.c24
-rw-r--r--gcc/df-scan.c5
-rw-r--r--gcc/df.h1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr42889.c13
6 files changed, 55 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 39fd7f82e01..5856b0ce06d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/df-core.c b/gcc/df-core.c
index 5ec802d0f8b..cee00b9dafd 100644
--- a/gcc/df-core.c
+++ b/gcc/df-core.c
@@ -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
diff --git a/gcc/df-scan.c b/gcc/df-scan.c
index 6c8c42b0f7c..c3a3dc70c89 100644
--- a/gcc/df-scan.c
+++ b/gcc/df-scan.c
@@ -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);
diff --git a/gcc/df.h b/gcc/df.h
index f8b28adc784..194cbcf2639 100644
--- 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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a4c134decf4..d7648a99bec 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..d3421736deb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr42889.c
@@ -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;
+}