From 597ae07482f698e4d1f03861ef775fb6703627f9 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 24 Jul 2006 13:27:53 +0200 Subject: [PATCH] re PR middle-end/28071 (A file that can not be compiled in reasonable time/space) 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. From-SVN: r115713 --- gcc/ChangeLog | 7 +++++++ gcc/tree-cfg.c | 21 +++++++++++++-------- gcc/tree-iterator.c | 3 ++- 3 files changed, 22 insertions(+), 9 deletions(-) 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; } -- 2.30.2