aboutsummaryrefslogtreecommitdiff
path: root/gcc/df-problems.c
diff options
context:
space:
mode:
authorKenneth Zadeck <zadeck@naturalbridge.com>2009-01-03 00:31:39 +0000
committerKenneth Zadeck <zadeck@gcc.gnu.org>2009-01-03 00:31:39 +0000
commitfafe34f91a12944c20cd13bd403ee2111ed19ff7 (patch)
treeacfc015900a56222cebb9128e55478b27fa44d40 /gcc/df-problems.c
parent0ede37fed4a47c959ab369d5028609c0c1a16e00 (diff)
downloadgcc-fafe34f91a12944c20cd13bd403ee2111ed19ff7.zip
gcc-fafe34f91a12944c20cd13bd403ee2111ed19ff7.tar.gz
gcc-fafe34f91a12944c20cd13bd403ee2111ed19ff7.tar.bz2
re PR tree-optimization/35805 ([ira] error in start_allocno_priorities, at ira-color.c:1806)
2009-01-02 Kenneth Zadeck <zadeck@naturalbridge.com> PR rtl-optimization/35805 * df-problems.c (df_lr_finalize): Add recursive call to resolve lr problem if fast dce is able to remove any instructions. * dce.c (dce_process_block): Fix dump message. From-SVN: r143027
Diffstat (limited to 'gcc/df-problems.c')
-rw-r--r--gcc/df-problems.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/gcc/df-problems.c b/gcc/df-problems.c
index 9175f10..0bfef8a 100644
--- a/gcc/df-problems.c
+++ b/gcc/df-problems.c
@@ -1001,25 +1001,34 @@ df_lr_transfer_function (int bb_index)
/* Run the fast dce as a side effect of building LR. */
static void
-df_lr_finalize (bitmap all_blocks ATTRIBUTE_UNUSED)
+df_lr_finalize (bitmap all_blocks)
{
+ df_lr->solutions_dirty = false;
if (df->changeable_flags & DF_LR_RUN_DCE)
{
run_fast_df_dce ();
- if (df_lr->problem_data && df_lr->solutions_dirty)
+
+ /* If dce deletes some instructions, we need to recompute the lr
+ solution before proceeding further. The problem is that fast
+ dce is a pessimestic dataflow algorithm. In the case where
+ it deletes a statement S inside of a loop, the uses inside of
+ S may not be deleted from the dataflow solution because they
+ were carried around the loop. While it is conservatively
+ correct to leave these extra bits, the standards of df
+ require that we maintain the best possible (least fixed
+ point) solution. The only way to do that is to redo the
+ iteration from the beginning. See PR35805 for an
+ example. */
+ if (df_lr->solutions_dirty)
{
- /* If we are here, then it is because we are both verifying
- the solution and the dce changed the function. In that case
- the verification info built will be wrong. So we leave the
- dirty flag true so that the verifier will skip the checking
- part and just clean up.*/
- df_lr->solutions_dirty = true;
+ df_clear_flags (DF_LR_RUN_DCE);
+ df_lr_alloc (all_blocks);
+ df_lr_local_compute (all_blocks);
+ df_worklist_dataflow (df_lr, all_blocks, df->postorder, df->n_blocks);
+ df_lr_finalize (all_blocks);
+ df_set_flags (DF_LR_RUN_DCE);
}
- else
- df_lr->solutions_dirty = false;
}
- else
- df_lr->solutions_dirty = false;
}