aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-inline.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-09-18 17:13:04 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-09-18 17:13:04 +0000
commit6a78fd06c54495e0f8dc5c5941c9313fa5046f54 (patch)
treea815bbcdec274f2c413af28792d44797d60bc848 /gcc/tree-inline.c
parentf52a39cde6dc6d486ada38b4734b799a2eaa6259 (diff)
downloadgcc-6a78fd06c54495e0f8dc5c5941c9313fa5046f54.zip
gcc-6a78fd06c54495e0f8dc5c5941c9313fa5046f54.tar.gz
gcc-6a78fd06c54495e0f8dc5c5941c9313fa5046f54.tar.bz2
re PR tree-optimization/45709 (internal compiler error: in add_phi_arg, at tree-phinodes.c:395)
2010-09-18 Richard Guenther <rguenther@suse.de> PR tree-optimization/45709 * tree-inline.c (copy_phis_for_bb): Delay commit of edge insertions until after all PHI nodes of the block are processed. * g++.dg/torture/pr45709-2.C: New testcase. From-SVN: r164397
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r--gcc/tree-inline.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 32cd852..ec7aacf 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -1977,12 +1977,13 @@ copy_phis_for_bb (basic_block bb, copy_body_data *id)
edge_iterator ei;
gimple phi;
gimple_stmt_iterator si;
+ edge new_edge;
+ bool inserted = false;
for (si = gsi_start (phi_nodes (bb)); !gsi_end_p (si); gsi_next (&si))
{
tree res, new_res;
gimple new_phi;
- edge new_edge;
phi = gsi_stmt (si);
res = PHI_RESULT (phi);
@@ -2021,17 +2022,20 @@ copy_phis_for_bb (basic_block bb, copy_body_data *id)
&& !is_gimple_val (new_arg))
{
gimple_seq stmts = NULL;
- basic_block tem;
new_arg = force_gimple_operand (new_arg, &stmts, true, NULL);
- tem = gsi_insert_seq_on_edge_immediate (new_edge, stmts);
- if (tem)
- new_edge = single_succ_edge (tem);
+ gsi_insert_seq_on_edge (new_edge, stmts);
+ inserted = true;
}
add_phi_arg (new_phi, new_arg, new_edge,
gimple_phi_arg_location_from_edge (phi, old_edge));
}
}
}
+
+ /* Commit the delayed edge insertions. */
+ if (inserted)
+ FOR_EACH_EDGE (new_edge, ei, new_bb->preds)
+ gsi_commit_one_edge_insert (new_edge, NULL);
}