X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fbasic-block.h;h=4bd33bde0c72b5de86e69c04992ad8740aa06363;hb=1577e1c17a0e33424963d1dee28d9f819522eab6;hp=17ec338a7a41a2adf459d78e149c0634beb88c4d;hpb=eb7df8c27b7cde8094320759f43818e65c25c99c;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/basic-block.h b/gcc/basic-block.h index 17ec338a7a4..4bd33bde0c7 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, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -23,7 +23,6 @@ along with GCC; see the file COPYING3. If not see #include "bitmap.h" #include "sbitmap.h" -#include "varray.h" #include "partition.h" #include "hard-reg-set.h" #include "predict.h" @@ -106,6 +105,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,22 +118,22 @@ 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; /* Instructions queued on the edge. */ union edge_def_insns { - tree GTY ((tag ("true"))) t; + gimple_seq GTY ((tag ("true"))) g; rtx GTY ((tag ("false"))) r; } GTY ((desc ("current_ir_type () == IR_GIMPLE"))) insns; /* 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 +146,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 +213,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; @@ -231,7 +232,7 @@ struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb") struct basic_block_def *next_bb; union basic_block_il_dependent { - struct tree_bb_info * GTY ((tag ("0"))) tree; + struct gimple_bb_info * GTY ((tag ("0"))) gimple; struct rtl_bb_info * GTY ((tag ("1"))) rtl; } GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il; @@ -247,12 +248,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,18 +269,14 @@ struct rtl_bb_info GTY(()) int visited; }; -struct tree_bb_info GTY(()) -{ - /* Pointers to the first and last trees of the block. */ - tree stmt_list; +struct GTY(()) gimple_bb_info { + /* Sequence of statements in this block. */ + gimple_seq seq; - /* Chain of PHI nodes for this block. */ - tree phi_nodes; + /* PHI nodes for this block. */ + 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 +358,19 @@ enum dom_state DOM_OK /* Everything is ok. */ }; +/* What sort of profiling information we have. */ +enum profile_status_d +{ + 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; @@ -383,14 +389,10 @@ struct control_flow_graph GTY(()) int x_last_basic_block; /* Mapping of labels to their associated blocks. At present - only used for the tree CFG. */ + 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_d x_profile_status; /* Whether the dominators and the postdominators are available. */ enum dom_state x_dom_computed[2]; @@ -460,7 +462,7 @@ struct control_flow_graph GTY(()) for ((INSN) = BB_HEAD (BB), (CURR) = (INSN) ? NEXT_INSN ((INSN)): NULL; \ (INSN) && (INSN) != NEXT_INSN (BB_END (BB)); \ (INSN) = (CURR), (CURR) = (INSN) ? NEXT_INSN ((INSN)) : NULL) - + #define FOR_BB_INSNS_REVERSE(BB, INSN) \ for ((INSN) = BB_END (BB); \ (INSN) && (INSN) != PREV_INSN (BB_HEAD (BB)); \ @@ -488,15 +490,14 @@ 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) /* The two blocks that are always in the cfg. */ #define NUM_FIXED_BLOCKS (2) - -#define BLOCK_NUM(INSN) (BLOCK_FOR_INSN (INSN)->index + 0) #define set_block_for_insn(INSN, BB) (BLOCK_FOR_INSN (INSN) = BB) extern void compute_bb_for_insn (void); @@ -506,6 +507,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); @@ -529,6 +531,7 @@ extern int dfs_enumerate_from (basic_block, int, bool (*)(const_basic_block, const void *), basic_block *, int, const void *); extern void compute_dominance_frontiers (bitmap *); +extern bitmap compute_idf (bitmap, bitmap *); extern void dump_bb_info (basic_block, bool, bool, int, const char *, FILE *); extern void dump_edge_info (FILE *, edge, int); extern void brief_dump_cfg (FILE *); @@ -828,21 +831,29 @@ 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 tree_predicted_by_p (const_basic_block, enum br_predictor); +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_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 tree_predict_edge (edge, enum br_predictor, int); +extern void gimple_predict_edge (edge, enum br_predictor, int); extern void rtl_predict_edge (edge, enum br_predictor, int); extern void predict_edge_def (edge, enum br_predictor, enum prediction); 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); @@ -879,10 +890,13 @@ 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); +extern int flow_find_cross_jump (basic_block, basic_block, rtx *, rtx *); +extern int flow_find_head_matching_sequence (basic_block, basic_block, + rtx *, rtx *, int); + extern bool delete_unreachable_blocks (void); extern bool mark_dfs_back_edges (void); @@ -921,6 +935,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); @@ -987,6 +1003,11 @@ bb_has_abnormal_pred (basic_block bb) /* In cfgloopmanip.c. */ extern edge mfb_kj_edge; -bool mfb_keep_just (edge); +extern bool mfb_keep_just (edge); + +/* In cfgexpand.c. */ +extern void rtl_profile_for_bb (basic_block); +extern void rtl_profile_for_edge (edge); +extern void default_rtl_profile (void); #endif /* GCC_BASIC_BLOCK_H */