aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-loop-distribution.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-05-24 12:40:01 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-05-24 12:40:01 +0000
commit30fd2977745d53f282d1560212e3bea07943a937 (patch)
tree38872e66995c95e8cbb549b062945e2448f38ed6 /gcc/tree-loop-distribution.c
parent37923729c5ab013459a7eeeba5ce53fca75759fe (diff)
downloadgcc-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.c16
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 ();