diff options
author | Tom de Vries <tom@codesourcery.com> | 2011-10-18 08:57:39 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2011-10-18 08:57:39 +0000 |
commit | 266fbb797168bffea7bf23c20c2a5562d73bb8ca (patch) | |
tree | 3b1b6394f8dab21f1dae90612735039580316aaf | |
parent | cab35794426a18f99a26d47b2c94546569cfacc1 (diff) | |
download | gcc-266fbb797168bffea7bf23c20c2a5562d73bb8ca.zip gcc-266fbb797168bffea7bf23c20c2a5562d73bb8ca.tar.gz gcc-266fbb797168bffea7bf23c20c2a5562d73bb8ca.tar.bz2 |
re PR tree-optimization/50672 (ice: verify_ssa failed: no immediate_use list)
2011-10-18 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/50672
* tree-ssa-dce.c (mark_virtual_operand_for_renaming): New function,
factored out of ...
(mark_virtual_phi_result_for_renaming): Use
mark_virtual_operand_for_renaming.
* tree-flow.h (mark_virtual_operand_for_renaming): Declare.
* tree-ssa-tail-merge.c (release_last_vdef): New function.
(purge_bbs): Add update_vops parameter. Call release_last_vdef for each
deleted basic block.
(tail_merge_optimize): Add argument to call to purge_bbs.
From-SVN: r180126
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/tree-flow.h | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-dce.c | 37 | ||||
-rw-r--r-- | gcc/tree-ssa-tail-merge.c | 44 |
4 files changed, 78 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19f851d..5ef215e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2011-10-18 Tom de Vries <tom@codesourcery.com> + + PR tree-optimization/50672 + * tree-ssa-dce.c (mark_virtual_operand_for_renaming): New function, + factored out of ... + (mark_virtual_phi_result_for_renaming): Use + mark_virtual_operand_for_renaming. + * tree-flow.h (mark_virtual_operand_for_renaming): Declare. + * tree-ssa-tail-merge.c (release_last_vdef): New function. + (purge_bbs): Add update_vops parameter. Call release_last_vdef for each + deleted basic block. + (tail_merge_optimize): Add argument to call to purge_bbs. + 2011-10-18 Richard Guenther <rguenther@suse.de> PR middle-end/50716 diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 1152b7d..dcfbb9d 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -715,6 +715,7 @@ bool stmt_dominates_stmt_p (gimple, gimple); void mark_virtual_ops_for_renaming (gimple); /* In tree-ssa-dce.c */ +void mark_virtual_operand_for_renaming (tree); void mark_virtual_phi_result_for_renaming (gimple); /* In tree-ssa-threadedge.c */ diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index b84b6f9..5a6a38e 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -982,18 +982,36 @@ propagate_necessity (struct edge_list *el) } } -/* Replace all uses of result of PHI by underlying variable and mark it +/* Replace all uses of NAME by underlying variable and mark it for renaming. */ void -mark_virtual_phi_result_for_renaming (gimple phi) +mark_virtual_operand_for_renaming (tree name) { bool used = false; imm_use_iterator iter; use_operand_p use_p; gimple stmt; - tree result_ssa, result_var; + tree name_var; + + name_var = SSA_NAME_VAR (name); + FOR_EACH_IMM_USE_STMT (stmt, iter, name) + { + FOR_EACH_IMM_USE_ON_STMT (use_p, iter) + SET_USE (use_p, name_var); + update_stmt (stmt); + used = true; + } + if (used) + mark_sym_for_renaming (name_var); +} +/* Replace all uses of result of PHI by underlying variable and mark it + for renaming. */ + +void +mark_virtual_phi_result_for_renaming (gimple phi) +{ if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, "Marking result for renaming : "); @@ -1001,19 +1019,10 @@ mark_virtual_phi_result_for_renaming (gimple phi) fprintf (dump_file, "\n"); } - result_ssa = gimple_phi_result (phi); - result_var = SSA_NAME_VAR (result_ssa); - FOR_EACH_IMM_USE_STMT (stmt, iter, result_ssa) - { - FOR_EACH_IMM_USE_ON_STMT (use_p, iter) - SET_USE (use_p, result_var); - update_stmt (stmt); - used = true; - } - if (used) - mark_sym_for_renaming (result_var); + mark_virtual_operand_for_renaming (gimple_phi_result (phi)); } + /* Remove dead PHI nodes from block BB. */ static bool diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index 611a30f..529388c 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -773,18 +773,56 @@ same_succ_flush_bbs (bitmap bbs) } } +/* Release the last vdef in BB, either normal or phi result. */ + +static void +release_last_vdef (basic_block bb) +{ + gimple_stmt_iterator i; + + for (i = gsi_last_bb (bb); !gsi_end_p (i); gsi_prev_nondebug (&i)) + { + gimple stmt = gsi_stmt (i); + if (gimple_vdef (stmt) == NULL_TREE) + continue; + + mark_virtual_operand_for_renaming (gimple_vdef (stmt)); + return; + } + + for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i)) + { + gimple phi = gsi_stmt (i); + tree res = gimple_phi_result (phi); + + if (is_gimple_reg (res)) + continue; + + mark_virtual_phi_result_for_renaming (phi); + return; + } + +} + /* Delete all deleted_bbs. */ static void -purge_bbs (void) +purge_bbs (bool update_vops) { unsigned int i; bitmap_iterator bi; + basic_block bb; same_succ_flush_bbs (deleted_bbs); EXECUTE_IF_SET_IN_BITMAP (deleted_bbs, 0, i, bi) - delete_basic_block (BASIC_BLOCK (i)); + { + bb = BASIC_BLOCK (i); + if (!update_vops) + release_last_vdef (bb); + + delete_basic_block (bb); + } bitmap_and_compl_into (deleted_bb_preds, deleted_bbs); bitmap_clear (deleted_bbs); @@ -1665,7 +1703,7 @@ tail_merge_optimize (unsigned int todo) break; free_dominance_info (CDI_DOMINATORS); - purge_bbs (); + purge_bbs (update_vops); if (iteration_nr == max_iterations) break; |