diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2151f0a6c37..b03da442bc8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-07-24 Jan Hubicka + + 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 PR rtl-optimization/28071 diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 82adabda063..ced78077047 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 ad2b47ea8cd..77e2345e4c2 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; }