diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-10-26 07:33:33 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-10-26 07:33:33 -0400 |
commit | af14ce9ca964083f84d97b1865def9824a482cc1 (patch) | |
tree | 017abaee7426ed88e1015fba299dfa58a87b299b /gcc/flow.c | |
parent | fd12bc82dac2d1074f07cd7ce9e94b4cb7017d1b (diff) | |
download | gcc-af14ce9ca964083f84d97b1865def9824a482cc1.zip gcc-af14ce9ca964083f84d97b1865def9824a482cc1.tar.gz gcc-af14ce9ca964083f84d97b1865def9824a482cc1.tar.bz2 |
(find_basic_blocks): Ensure each live basic block is actually reachable.
(life_analysis): Clean up handling of basic_block_drops_in.
From-SVN: r8340
Diffstat (limited to 'gcc/flow.c')
-rw-r--r-- | gcc/flow.c | 20 |
1 files changed, 17 insertions, 3 deletions
@@ -608,6 +608,20 @@ find_basic_blocks (f, nonlocal_label_list) } } + /* ??? See if we have a "live" basic block that is not reachable. + This can happen if it is headed by a label that is preserved or + in one of the label lists, but no call or computed jump is in + the loop. It's not clear if we can delete the block or not, + but don't for now. However, we will mess up register status if + it remains unreachable, so add a fake reachability from the + previous block. */ + + for (i = 1; i < n_basic_blocks; i++) + if (block_live[i] && ! basic_block_drops_in[i] + && GET_CODE (basic_block_head[i]) == CODE_LABEL + && LABEL_REFS (basic_block_head[i]) == basic_block_head[i]) + basic_block_drops_in[i] = 1; + /* Now delete the code for any basic blocks that can't be reached. They can occur because jump_optimize does not recognize unreachable loops as unreachable. */ @@ -1061,18 +1075,18 @@ life_analysis (f, nregs) { register rtx jump, head; + /* Update the basic_block_new_live_at_end's of the block that falls through into this one (if any). */ head = basic_block_head[i]; - jump = PREV_INSN (head); if (basic_block_drops_in[i]) { - register int from_block = BLOCK_NUM (jump); register int j; for (j = 0; j < regset_size; j++) - basic_block_new_live_at_end[from_block][j] + basic_block_new_live_at_end[i-1][j] |= basic_block_live_at_start[i][j]; } + /* Update the basic_block_new_live_at_end's of all the blocks that jump to this one. */ if (GET_CODE (head) == CODE_LABEL) |