diff options
author | Richard Guenther <rguenther@suse.de> | 2010-09-18 17:13:04 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-09-18 17:13:04 +0000 |
commit | 6a78fd06c54495e0f8dc5c5941c9313fa5046f54 (patch) | |
tree | a815bbcdec274f2c413af28792d44797d60bc848 /gcc/tree-inline.c | |
parent | f52a39cde6dc6d486ada38b4734b799a2eaa6259 (diff) | |
download | gcc-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.c | 14 |
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); } |