aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-cfg.c21
-rw-r--r--gcc/tree-iterator.c3
3 files changed, 22 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2151f0a..b03da44 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,13 @@
2006-07-24 Jan Hubicka <jh@suse.cz>
PR rtl-optimization/28071
+ * tree-cfg.c (tree_split_block): Do not allocate new stmt_list nodes.
+ * tree-iterator.c (tsi_split_statement_list_before): Do not crash when
+ splitting before first stmt.
+
+2006-07-24 Jan Hubicka <jh@suse.cz>
+
+ PR rtl-optimization/28071
* ipa-inline.c (update_caller_keys): Remove edges that
are no longer inline candidates.
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 82adabd..ced7807 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -4158,7 +4158,8 @@ tree_redirect_edge_and_branch_force (edge e, basic_block dest)
static basic_block
tree_split_block (basic_block bb, void *stmt)
{
- block_stmt_iterator bsi, bsi_tgt;
+ block_stmt_iterator bsi;
+ tree_stmt_iterator tsi_tgt;
tree act;
basic_block new_bb;
edge e;
@@ -4192,13 +4193,17 @@ tree_split_block (basic_block bb, void *stmt)
}
}
- bsi_tgt = bsi_start (new_bb);
- while (!bsi_end_p (bsi))
- {
- act = bsi_stmt (bsi);
- bsi_remove (&bsi, false);
- bsi_insert_after (&bsi_tgt, act, BSI_NEW_STMT);
- }
+ if (bsi_end_p (bsi))
+ return new_bb;
+
+ /* Split the statement list - avoid re-creating new containers as this
+ brings ugly quadratic memory consumption in the inliner.
+ (We are still quadratic since we need to update stmt BB pointers,
+ sadly.) */
+ new_bb->stmt_list = tsi_split_statement_list_before (&bsi.tsi);
+ for (tsi_tgt = tsi_start (new_bb->stmt_list);
+ !tsi_end_p (tsi_tgt); tsi_next (&tsi_tgt))
+ set_bb_for_stmt (tsi_stmt (tsi_tgt), new_bb);
return new_bb;
}
diff --git a/gcc/tree-iterator.c b/gcc/tree-iterator.c
index ad2b47e..77e2345 100644
--- a/gcc/tree-iterator.c
+++ b/gcc/tree-iterator.c
@@ -289,7 +289,8 @@ tsi_split_statement_list_before (tree_stmt_iterator *i)
STATEMENT_LIST_TAIL (new_sl) = STATEMENT_LIST_TAIL (old_sl);
STATEMENT_LIST_TAIL (old_sl) = prev;
cur->prev = NULL;
- prev->next = NULL;
+ if (prev)
+ prev->next = NULL;
return new_sl;
}