diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2005-03-09 16:39:43 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2005-03-09 16:39:43 +0000 |
commit | 5e91f7a384b7a767308f73b7a9d467986cc3472c (patch) | |
tree | f2100186cbe0e3bf89dcfd0fd35db20afce5a387 /gcc/cfgbuild.c | |
parent | 974b30f0ae978dc9c3c5f7d0cef914f99d8c48d5 (diff) | |
download | gcc-5e91f7a384b7a767308f73b7a9d467986cc3472c.zip gcc-5e91f7a384b7a767308f73b7a9d467986cc3472c.tar.gz gcc-5e91f7a384b7a767308f73b7a9d467986cc3472c.tar.bz2 |
cfgbuild.c (state, [...]): Move just before make_edges.
* cfgbuild.c (state, STATE, SET_STATE,
BLOCK_USED_BY_TABLEJUMP, FULL_STATE): Move just before
make_edges.
(make_edges): Speed up by skipping blocks with BLOCK_ORIGINAL.
(find_basic_blocks): Set the state of each basic block to
BLOCK_NEW.
From-SVN: r96193
Diffstat (limited to 'gcc/cfgbuild.c')
-rw-r--r-- | gcc/cfgbuild.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c index 0c0e9eb..3890bd1 100644 --- a/gcc/cfgbuild.c +++ b/gcc/cfgbuild.c @@ -211,6 +211,16 @@ rtl_make_eh_edge (sbitmap *edge_cache, basic_block src, rtx insn) free_INSN_LIST_list (&handlers); } +/* State of basic block as seen by find_many_sub_basic_blocks. */ +enum state {BLOCK_NEW = 0, BLOCK_ORIGINAL, BLOCK_TO_SPLIT}; + +#define STATE(BB) (enum state) ((size_t) (BB)->aux) +#define SET_STATE(BB, STATE) ((BB)->aux = (void *) (size_t) (STATE)) + +/* Used internally by purge_dead_tablejump_edges, ORed into state. */ +#define BLOCK_USED_BY_TABLEJUMP 32 +#define FULL_STATE(BB) ((size_t) (BB)->aux) + /* Identify the edges between basic blocks MIN to MAX. NONLOCAL_LABEL_LIST is a list of non-local labels in the function. Blocks @@ -234,15 +244,18 @@ make_edges (basic_block min, basic_block max, int update_p) sbitmap_vector_zero (edge_cache, last_basic_block); if (update_p) - FOR_BB_BETWEEN (bb, min, max->next_bb, next_bb) - { - edge e; - edge_iterator ei; - - FOR_EACH_EDGE (e, ei, bb->succs) - if (e->dest != EXIT_BLOCK_PTR) - SET_BIT (edge_cache[bb->index], e->dest->index); - } + { + FOR_BB_BETWEEN (bb, min, max->next_bb, next_bb) + if (STATE (bb) != BLOCK_ORIGINAL) + { + edge e; + edge_iterator ei; + + FOR_EACH_EDGE (e, ei, bb->succs) + if (e->dest != EXIT_BLOCK_PTR) + SET_BIT (edge_cache[bb->index], e->dest->index); + } + } } /* By nature of the way these get numbered, ENTRY_BLOCK_PTR->next_bb block @@ -257,6 +270,9 @@ make_edges (basic_block min, basic_block max, int update_p) enum rtx_code code; edge e; + if (STATE (bb) == BLOCK_ORIGINAL) + continue; + if (LABEL_P (BB_HEAD (bb)) && LABEL_ALT_ENTRY_P (BB_HEAD (bb))) cached_make_edge (NULL, ENTRY_BLOCK_PTR, bb, 0); @@ -522,6 +538,9 @@ find_basic_blocks (rtx f) profile_status = PROFILE_ABSENT; + FOR_EACH_BB (bb) + SET_STATE (bb, BLOCK_NEW); + /* Discover the edges of our cfg. */ make_edges (ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR->prev_bb, 0); @@ -535,16 +554,6 @@ find_basic_blocks (rtx f) timevar_pop (TV_CFG); } -/* State of basic block as seen by find_many_sub_basic_blocks. */ -enum state {BLOCK_NEW = 0, BLOCK_ORIGINAL, BLOCK_TO_SPLIT}; - -#define STATE(BB) (enum state) ((size_t) (BB)->aux) -#define SET_STATE(BB, STATE) ((BB)->aux = (void *) (size_t) (STATE)) - -/* Used internally by purge_dead_tablejump_edges, ORed into state. */ -#define BLOCK_USED_BY_TABLEJUMP 32 -#define FULL_STATE(BB) ((size_t) (BB)->aux) - static void mark_tablejump_edge (rtx label) { |