diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-01-29 12:14:47 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2010-01-29 12:14:47 +0000 |
commit | d68fce26ea56711faa9581d15ab726d207bfa767 (patch) | |
tree | 099818190b187b032b4dfe2e1e0061d89697cfca | |
parent | db671e985683b0dc034a849b7023063779809da9 (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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/df-core.c | 24 | ||||
-rw-r--r-- | gcc/df-scan.c | 5 | ||||
-rw-r--r-- | gcc/df.h | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr42889.c | 13 |
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); @@ -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; +} |