diff options
author | Richard Biener <rguenther@suse.de> | 2016-05-24 12:40:01 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-05-24 12:40:01 +0000 |
commit | 30fd2977745d53f282d1560212e3bea07943a937 (patch) | |
tree | 38872e66995c95e8cbb549b062945e2448f38ed6 /gcc/tree-loop-distribution.c | |
parent | 37923729c5ab013459a7eeeba5ce53fca75759fe (diff) | |
download | gcc-30fd2977745d53f282d1560212e3bea07943a937.zip gcc-30fd2977745d53f282d1560212e3bea07943a937.tar.gz gcc-30fd2977745d53f282d1560212e3bea07943a937.tar.bz2 |
re PR tree-optimization/71253 (ICE during loop distribution w/ -O2 -ftree-loop-distribution)
2016-05-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/71253
* cfganal.h (control_dependences): Make robust against edge
and BB removal.
(control_dependences::control_dependences): Remove edge_list argument.
(control_dependences::get_edge): Remove.
(control_dependences::get_edge_src): Add.
(control_dependences::get_edge_dest): Likewise.
(control_dependences::m_el): Make a vector of edge src/dest index.
* cfganal.c (control_dependences::find_control_dependence): Adjust.
(control_dependences::control_dependences): Likewise.
(control_dependences::~control_dependence): Likewise.
(control_dependences::get_edge): Remove.
(control_dependences::get_edge_src): Add.
(control_dependences::get_edge_dest): Likewise.
* tree-ssa-dce.c (mark_control_dependent_edges_necessary): Use
get_edge_src.
(perform_tree_ssa_dce): Adjust.
* tree-loop-distribution.c (create_edge_for_control_dependence): Use
get_edge_src.
(pass_loop_distribution::execute): Adjust. Do loop destroying
conditional on changed.
* gcc.dg/torture/pr71253.c: New testcase.
From-SVN: r236636
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index dbc8e3c..e4163b2 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -278,7 +278,7 @@ create_edge_for_control_dependence (struct graph *rdg, basic_block bb, EXECUTE_IF_SET_IN_BITMAP (cd->get_edges_dependent_on (bb->index), 0, edge_n, bi) { - basic_block cond_bb = cd->get_edge (edge_n)->src; + basic_block cond_bb = cd->get_edge_src (edge_n); gimple *stmt = last_stmt (cond_bb); if (stmt && is_ctrl_stmt (stmt)) { @@ -1789,7 +1789,7 @@ out: { calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_POST_DOMINATORS); - cd = new control_dependences (create_edge_list ()); + cd = new control_dependences (); free_dominance_info (CDI_POST_DOMINATORS); } bool destroy_p; @@ -1815,14 +1815,14 @@ out: if (cd) delete cd; - /* Destroy loop bodies that could not be reused. Do this late as we - otherwise can end up refering to stale data in control dependences. */ - unsigned i; - FOR_EACH_VEC_ELT (loops_to_be_destroyed, i, loop) - destroy_loop (loop); - if (changed) { + /* Destroy loop bodies that could not be reused. Do this late as we + otherwise can end up refering to stale data in control dependences. */ + unsigned i; + FOR_EACH_VEC_ELT (loops_to_be_destroyed, i, loop) + destroy_loop (loop); + /* Cached scalar evolutions now may refer to wrong or non-existing loops. */ scev_reset_htab (); |