X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gcc%2Fbasic-block.h;h=12256a23f07abc244f6556236f197cd93baebce5;hb=9600efe1a6c42b8acf7449561760c36968155f83;hp=c3cb76bd79bf286f6b32d755f2bf120f8b46cd50;hpb=3debdc1e9da1742b04771e44bf96e0104f0c3bcb;p=gcc.git diff --git a/gcc/basic-block.h b/gcc/basic-block.h index c3cb76bd79b..12256a23f07 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -1,6 +1,6 @@ /* Define control and data flow tables, and regsets. Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GCC. @@ -106,6 +106,11 @@ typedef bitmap_iterator reg_set_iterator; #define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, RSI) \ EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, RSI) \ +/* Same information as REGS_INVALIDATED_BY_CALL but in regset form to be used + in dataflow more conveniently. */ + +extern regset regs_invalidated_by_call_regset; + /* Type we use to hold basic block counters. Should be at least 64bit. Although a counter cannot be negative, we use a signed type, because erroneous negative counts can be generated when the @@ -114,8 +119,7 @@ typedef bitmap_iterator reg_set_iterator; typedef HOST_WIDEST_INT gcov_type; /* Control flow edge information. */ -struct edge_def GTY(()) -{ +struct GTY(()) edge_def { /* The two blocks at the ends of the edge. */ struct basic_block_def *src; struct basic_block_def *dest; @@ -129,7 +133,8 @@ struct edge_def GTY(()) /* Auxiliary info specific to a pass. */ PTR GTY ((skip (""))) aux; - /* Location of any goto implicit in the edge, during tree-ssa. */ + /* Location of any goto implicit in the edge and associated BLOCK. */ + tree goto_block; location_t goto_locus; /* The index number corresponding to this edge in the edge vector @@ -142,8 +147,6 @@ struct edge_def GTY(()) in profile.c */ }; -typedef struct edge_def *edge; -typedef const struct edge_def *const_edge; DEF_VEC_P(edge); DEF_VEC_ALLOC_P(edge,gc); DEF_VEC_ALLOC_P(edge,heap); @@ -211,8 +214,7 @@ struct rtl_bb_info; basic blocks. */ /* Basic block information indexed by block number. */ -struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb"))) -{ +struct GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb"))) basic_block_def { /* The edges into and out of the block. */ VEC(edge,gc) *preds; VEC(edge,gc) *succs; @@ -247,12 +249,14 @@ struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb") /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */ int frequency; + /* The discriminator for this block. */ + int discriminator; + /* Various flags. See BB_* below. */ int flags; }; -struct rtl_bb_info GTY(()) -{ +struct GTY(()) rtl_bb_info { /* The first and last insns of the block. */ rtx head_; rtx end_; @@ -266,8 +270,7 @@ struct rtl_bb_info GTY(()) int visited; }; -struct gimple_bb_info GTY(()) -{ +struct GTY(()) gimple_bb_info { /* Sequence of statements in this block. */ gimple_seq seq; @@ -275,9 +278,6 @@ struct gimple_bb_info GTY(()) gimple_seq phi_nodes; }; -typedef struct basic_block_def *basic_block; -typedef const struct basic_block_def *const_basic_block; - DEF_VEC_P(basic_block); DEF_VEC_ALLOC_P(basic_block,gc); DEF_VEC_ALLOC_P(basic_block,heap); @@ -359,12 +359,19 @@ enum dom_state DOM_OK /* Everything is ok. */ }; +/* What sort of profiling information we have. */ +enum profile_status +{ + PROFILE_ABSENT, + PROFILE_GUESSED, + PROFILE_READ +}; + /* A structure to group all the per-function control flow graph data. The x_* prefixing is necessary because otherwise references to the fields of this struct are interpreted as the defines for backward source compatibility following the definition of this struct. */ -struct control_flow_graph GTY(()) -{ +struct GTY(()) control_flow_graph { /* Block pointers for the exit and entry of a function. These are always the head and tail of the basic block list. */ basic_block x_entry_block_ptr; @@ -386,11 +393,7 @@ struct control_flow_graph GTY(()) only used for the gimple CFG. */ VEC(basic_block,gc) *x_label_to_block_map; - enum profile_status { - PROFILE_ABSENT, - PROFILE_GUESSED, - PROFILE_READ - } x_profile_status; + enum profile_status x_profile_status; /* Whether the dominators and the postdominators are available. */ enum dom_state x_dom_computed[2]; @@ -488,7 +491,8 @@ extern bitmap_obstack reg_obstack; #define BB_HEAD(B) (B)->il.rtl->head_ #define BB_END(B) (B)->il.rtl->end_ -/* Special block numbers [markers] for entry and exit. */ +/* Special block numbers [markers] for entry and exit. + Neither of them is supposed to hold actual statements. */ #define ENTRY_BLOCK (0) #define EXIT_BLOCK (1) @@ -506,6 +510,7 @@ extern void update_bb_for_insn (basic_block); extern void insert_insn_on_edge (rtx, edge); basic_block split_edge_and_insert (edge, rtx); +extern void commit_one_edge_insertion (edge e); extern void commit_edge_insertions (void); extern void remove_fake_edges (void); @@ -829,16 +834,17 @@ extern void compute_available (sbitmap *, sbitmap *, sbitmap *, sbitmap *); /* In predict.c */ extern bool maybe_hot_bb_p (const_basic_block); extern bool maybe_hot_edge_p (edge); -extern bool probably_cold_bb_p (const_basic_block); extern bool probably_never_executed_bb_p (const_basic_block); -extern bool optimize_bb_for_size_p (basic_block); -extern bool optimize_bb_for_speed_p (basic_block); +extern bool optimize_bb_for_size_p (const_basic_block); +extern bool optimize_bb_for_speed_p (const_basic_block); extern bool optimize_edge_for_size_p (edge); extern bool optimize_edge_for_speed_p (edge); -extern bool optimize_insn_for_size_p (void); -extern bool optimize_insn_for_speed_p (void); extern bool optimize_function_for_size_p (struct function *); extern bool optimize_function_for_speed_p (struct function *); +extern bool optimize_loop_for_size_p (struct loop *); +extern bool optimize_loop_for_speed_p (struct loop *); +extern bool optimize_loop_nest_for_size_p (struct loop *); +extern bool optimize_loop_nest_for_speed_p (struct loop *); extern bool gimple_predicted_by_p (const_basic_block, enum br_predictor); extern bool rtl_predicted_by_p (const_basic_block, enum br_predictor); extern void gimple_predict_edge (edge, enum br_predictor, int); @@ -848,10 +854,9 @@ extern void guess_outgoing_edge_probabilities (basic_block); extern void remove_predictions_associated_with_edge (edge); extern bool edge_probability_reliable_p (const_edge); extern bool br_prob_note_reliable_p (const_rtx); +extern bool predictable_edge_p (edge); /* In cfg.c */ -extern void dump_regset (regset, FILE *); -extern void debug_regset (regset); extern void init_flow (struct function *); extern void debug_bb (basic_block); extern basic_block debug_bb_n (int); @@ -888,7 +893,6 @@ extern bool purge_dead_edges (basic_block); /* In cfgbuild.c. */ extern void find_many_sub_basic_blocks (sbitmap); extern void rtl_make_eh_edge (sbitmap, basic_block, rtx); -extern void find_basic_blocks (rtx); /* In cfgcleanup.c. */ extern bool cleanup_cfg (int); @@ -930,6 +934,8 @@ extern VEC (basic_block, heap) *get_dominated_by (enum cdi_direction, basic_bloc extern VEC (basic_block, heap) *get_dominated_by_region (enum cdi_direction, basic_block *, unsigned); +extern VEC (basic_block, heap) *get_all_dominated_blocks (enum cdi_direction, + basic_block); extern void add_to_dominance_info (enum cdi_direction, basic_block); extern void delete_from_dominance_info (enum cdi_direction, basic_block); basic_block recompute_dominator (enum cdi_direction, basic_block);