diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-28 22:27:04 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-05-28 22:27:04 +0000 |
commit | 9a755727a963ba66095e1e3ac618d7033c1353ed (patch) | |
tree | 85878c8310af843bb8bfb3a3b2df4ba27bd43cce /gcc/cfgexpand.c | |
parent | 028843d7270459ac56d4153a2fa4dbd1b75c95b6 (diff) | |
download | gcc-9a755727a963ba66095e1e3ac618d7033c1353ed.tar.gz |
PR tree-optimization/21562
* cfgexpand.c (construct_init_block): Deal properly with the case
of entry edge not pointing to very first basic block.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100305 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r-- | gcc/cfgexpand.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index cd9829e60de..4e4a8e208c3 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1157,22 +1157,25 @@ static basic_block construct_init_block (void) { basic_block init_block, first_block; - edge e = NULL, e2; - edge_iterator ei; + edge e = NULL; + int flags; - FOR_EACH_EDGE (e2, ei, ENTRY_BLOCK_PTR->succs) - { - /* Clear EDGE_EXECUTABLE. This flag is never used in the backend. + /* Multiple entry points not supported yet. */ + gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR->succs) == 1); - For all other blocks this edge flag is cleared while expanding - a basic block in expand_gimple_basic_block, but there we never - looked at the successors of the entry block. - This caused PR17513. */ - e2->flags &= ~EDGE_EXECUTABLE; + e = EDGE_SUCC (ENTRY_BLOCK_PTR, 0); - if (e2->dest == ENTRY_BLOCK_PTR->next_bb) - e = e2; + /* When entry edge points to first basic block, we don't need jump, + otherwise we have to jump into proper target. */ + if (e && e->dest != ENTRY_BLOCK_PTR->next_bb) + { + tree label = tree_block_label (e->dest); + + emit_jump (label_rtx (label)); + flags = 0; } + else + flags = EDGE_FALLTHRU; init_block = create_basic_block (NEXT_INSN (get_insns ()), get_last_insn (), @@ -1183,7 +1186,7 @@ construct_init_block (void) { first_block = e->dest; redirect_edge_succ (e, init_block); - e = make_edge (init_block, first_block, EDGE_FALLTHRU); + e = make_edge (init_block, first_block, flags); } else e = make_edge (init_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU); |