/* Define control and data flow tables, and regsets.
- Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
- Free Software Foundation, Inc.
+ Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of GCC.
/* Instructions queued on the edge. */
union edge_def_insns {
- rtx GTY ((tag ("0"))) r;
- tree GTY ((tag ("1"))) t;
- } GTY ((desc ("ir_type ()"))) insns;
+ tree GTY ((tag ("true"))) t;
+ rtx GTY ((tag ("false"))) r;
+ } GTY ((desc ("current_ir_type () == IR_GIMPLE"))) insns;
/* Auxiliary info specific to a pass. */
PTR GTY ((skip (""))) aux;
typedef struct edge_def *edge;
DEF_VEC_P(edge);
DEF_VEC_ALLOC_P(edge,gc);
+DEF_VEC_ALLOC_P(edge,heap);
#define EDGE_FALLTHRU 1 /* 'Straight line' flow */
#define EDGE_ABNORMAL 2 /* Strange flow, like computed
/* Declared in cfgloop.h. */
struct loop;
-struct loops;
/* Declared in tree-flow.h. */
struct edge_prediction;
/* Basic block information indexed by block number. */
struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb")))
{
- /* Pointers to the first and last trees of the block. */
- tree stmt_list;
-
/* The edges into and out of the block. */
VEC(edge,gc) *preds;
VEC(edge,gc) *succs;
PTR GTY ((skip (""))) aux;
/* Innermost loop containing the block. */
- struct loop * GTY ((skip (""))) loop_father;
+ struct loop *loop_father;
/* The dominance and postdominance information node. */
struct et_node * GTY ((skip (""))) dom[2];
struct basic_block_def *next_bb;
union basic_block_il_dependent {
+ struct tree_bb_info * GTY ((tag ("0"))) tree;
struct rtl_bb_info * GTY ((tag ("1"))) rtl;
} GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il;
- /* Chain of PHI nodes for this block. */
- tree phi_nodes;
-
- /* A list of predictions. */
- struct edge_prediction *predictions;
-
/* Expected number of executions: calculated in profile.c. */
gcov_type count;
rtx head_;
rtx end_;
- /* The registers that are live on entry to this block. */
- bitmap GTY ((skip (""))) global_live_at_start;
-
- /* The registers that are live on exit from this block. */
- bitmap GTY ((skip (""))) global_live_at_end;
-
/* In CFGlayout mode points to insn notes/jumptables to be placed just before
and after the block. */
rtx header;
int visited;
};
+struct tree_bb_info GTY(())
+{
+ /* Pointers to the first and last trees of the block. */
+ tree stmt_list;
+
+ /* Chain of PHI nodes for this block. */
+ tree phi_nodes;
+};
+
typedef struct basic_block_def *basic_block;
+DEF_VEC_P(basic_block);
+DEF_VEC_ALLOC_P(basic_block,gc);
+DEF_VEC_ALLOC_P(basic_block,heap);
+
#define BB_FREQ_MAX 10000
/* Masks for basic_block.flags.
enum bb_flags
{
-
- /* Set if insns in BB have are modified. Used for updating liveness info. */
- BB_DIRTY = 1,
-
/* Only set on blocks that have just been created by create_bb. */
- BB_NEW = 2,
+ BB_NEW = 1 << 0,
/* Set by find_unreachable_blocks. Do not rely on this being set in any
pass. */
- BB_REACHABLE = 4,
+ BB_REACHABLE = 1 << 1,
/* Set for blocks in an irreducible loop by loop analysis. */
- BB_IRREDUCIBLE_LOOP = 8,
+ BB_IRREDUCIBLE_LOOP = 1 << 2,
/* Set on blocks that may actually not be single-entry single-exit block. */
- BB_SUPERBLOCK = 16,
+ BB_SUPERBLOCK = 1 << 3,
/* Set on basic blocks that the scheduler should not touch. This is used
by SMS to prevent other schedulers from messing with the loop schedule. */
- BB_DISABLE_SCHEDULE = 32,
+ BB_DISABLE_SCHEDULE = 1 << 4,
/* Set on blocks that should be put in a hot section. */
- BB_HOT_PARTITION = 64,
+ BB_HOT_PARTITION = 1 << 5,
/* Set on blocks that should be put in a cold section. */
- BB_COLD_PARTITION = 128,
+ BB_COLD_PARTITION = 1 << 6,
/* Set on block that was duplicated. */
- BB_DUPLICATED = 256,
+ BB_DUPLICATED = 1 << 7,
+
+ /* Set if the label at the top of this block is the target of a non-local goto. */
+ BB_NON_LOCAL_GOTO_TARGET = 1 << 8,
/* Set on blocks that are in RTL format. */
- BB_RTL = 1024,
+ BB_RTL = 1 << 9 ,
/* Set on blocks that are forwarder blocks.
Only used in cfgcleanup.c. */
- BB_FORWARDER_BLOCK = 2048,
+ BB_FORWARDER_BLOCK = 1 << 10,
/* Set on blocks that cannot be threaded through.
Only used in cfgcleanup.c. */
- BB_NONTHREADABLE_BLOCK = 4096
+ BB_NONTHREADABLE_BLOCK = 1 << 11
};
/* Dummy flag for convenience in the hot/cold partitioning code. */
basic_block x_exit_block_ptr;
/* Index by basic block number, get basic block struct info. */
- varray_type x_basic_block_info;
+ VEC(basic_block,gc) *x_basic_block_info;
/* Number of basic blocks in this flow graph. */
int x_n_basic_blocks;
/* Mapping of labels to their associated blocks. At present
only used for the tree CFG. */
- varray_type x_label_to_block_map;
+ VEC(basic_block,gc) *x_label_to_block_map;
enum profile_status {
PROFILE_ABSENT,
#define label_to_block_map_for_function(FN) ((FN)->cfg->x_label_to_block_map)
#define BASIC_BLOCK_FOR_FUNCTION(FN,N) \
- (VARRAY_BB (basic_block_info_for_function(FN), (N)))
+ (VEC_index (basic_block, basic_block_info_for_function(FN), (N)))
/* Defines for textual backward source compatibility. */
#define ENTRY_BLOCK_PTR (cfun->cfg->x_entry_block_ptr)
#define label_to_block_map (cfun->cfg->x_label_to_block_map)
#define profile_status (cfun->cfg->x_profile_status)
-#define BASIC_BLOCK(N) (VARRAY_BB (basic_block_info, (N)))
-
-/* TRUE if we should re-run loop discovery after threading jumps, FALSE
- otherwise. */
-extern bool rediscover_loops_after_threading;
+#define BASIC_BLOCK(N) (VEC_index (basic_block, basic_block_info, (N)))
+#define SET_BASIC_BLOCK(N,BB) (VEC_replace (basic_block, basic_block_info, (N), (BB)))
/* For iterating over basic blocks. */
#define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
(INSN) && (INSN) != NEXT_INSN (BB_END (BB)); \
(INSN) = NEXT_INSN (INSN))
+/* For iterating over insns in basic block when we might remove the
+ current insn. */
+#define FOR_BB_INSNS_SAFE(BB, INSN, CURR) \
+ 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)); \
(INSN) = PREV_INSN (INSN))
+#define FOR_BB_INSNS_REVERSE_SAFE(BB, INSN, CURR) \
+ for ((INSN) = BB_END (BB),(CURR) = (INSN) ? PREV_INSN ((INSN)) : NULL; \
+ (INSN) && (INSN) != PREV_INSN (BB_HEAD (BB)); \
+ (INSN) = (CURR), (CURR) = (INSN) ? PREV_INSN ((INSN)) : NULL)
+
/* Cycles through _all_ basic blocks, even the fake ones (entry and
exit block). */
extern bitmap_obstack reg_obstack;
-/* Indexed by n, gives number of basic block that (REG n) is used in.
- If the value is REG_BLOCK_GLOBAL (-2),
- it means (REG n) is used in more than one basic block.
- REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know.
- This information remains valid for the rest of the compilation
- of the current function; it is used to control register allocation. */
-
-#define REG_BLOCK_UNKNOWN -1
-#define REG_BLOCK_GLOBAL -2
-
-#define REG_BASIC_BLOCK(N) (VARRAY_REG (reg_n_info, N)->basic_block)
\f
/* Stuff for recording basic block info. */
#define set_block_for_insn(INSN, BB) (BLOCK_FOR_INSN (INSN) = BB)
extern void compute_bb_for_insn (void);
-extern void free_bb_for_insn (void);
+extern unsigned int free_bb_for_insn (void);
extern void update_bb_for_insn (basic_block);
-extern void free_basic_block_vars (void);
-
extern void insert_insn_on_edge (rtx, edge);
-bool safe_insert_insn_on_edge (rtx, edge);
+basic_block split_edge_and_insert (edge, rtx);
extern void commit_edge_insertions (void);
-extern void commit_edge_insertions_watch_calls (void);
extern void remove_fake_edges (void);
extern void remove_fake_exit_edges (void);
extern void redirect_edge_pred (edge, basic_block);
extern basic_block create_basic_block_structure (rtx, rtx, rtx, basic_block);
extern void clear_bb_flags (void);
-extern void flow_reverse_top_sort_order_compute (int *);
-extern int flow_depth_first_order_compute (int *, int *);
+extern int post_order_compute (int *, bool, bool);
+extern int inverted_post_order_compute (int *);
+extern int pre_and_rev_post_order_compute (int *, int *, bool);
extern int dfs_enumerate_from (basic_block, int,
bool (*)(basic_block, void *),
basic_block *, int, void *);
extern void compute_dominance_frontiers (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 *);
extern void clear_edges (void);
-extern rtx first_insn_after_basic_block_note (basic_block);
extern void scale_bbs_frequencies_int (basic_block *, int, int, int);
-extern void scale_bbs_frequencies_gcov_type (basic_block *, int, gcov_type,
+extern void scale_bbs_frequencies_gcov_type (basic_block *, int, gcov_type,
gcov_type);
/* Structure to group all of the information to process IF-THEN and
an element might be removed during the traversal, otherwise
elements will be missed. Instead, use a for-loop like that shown
in the following pseudo-code:
-
+
FOR (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{
IF (e != taken_edge)
int find_edge_index (struct edge_list *, basic_block, basic_block);
edge find_edge (basic_block, basic_block);
-
-enum update_life_extent
-{
- UPDATE_LIFE_LOCAL = 0,
- UPDATE_LIFE_GLOBAL = 1,
- UPDATE_LIFE_GLOBAL_RM_NOTES = 2
-};
-
-/* Flags for life_analysis and update_life_info. */
-
-#define PROP_DEATH_NOTES 1 /* Create DEAD and UNUSED notes. */
-#define PROP_LOG_LINKS 2 /* Create LOG_LINKS. */
-#define PROP_REG_INFO 4 /* Update regs_ever_live et al. */
-#define PROP_KILL_DEAD_CODE 8 /* Remove dead code. */
-#define PROP_SCAN_DEAD_CODE 16 /* Scan for dead code. */
-#define PROP_ALLOW_CFG_CHANGES 32 /* Allow the CFG to be changed
- by dead code removal. */
-#define PROP_AUTOINC 64 /* Create autoinc mem references. */
-#define PROP_SCAN_DEAD_STORES 128 /* Scan for dead code. */
-#define PROP_ASM_SCAN 256 /* Internal flag used within flow.c
- to flag analysis of asms. */
-#define PROP_DEAD_INSN 1024 /* Internal flag used within flow.c
- to flag analysis of dead insn. */
-#define PROP_POST_REGSTACK 2048 /* We run after reg-stack and need
- to preserve REG_DEAD notes for
- stack regs. */
-#define PROP_FINAL (PROP_DEATH_NOTES | PROP_LOG_LINKS \
- | PROP_REG_INFO | PROP_KILL_DEAD_CODE \
- | PROP_SCAN_DEAD_CODE | PROP_AUTOINC \
- | PROP_ALLOW_CFG_CHANGES \
- | PROP_SCAN_DEAD_STORES)
-#define PROP_POSTRELOAD (PROP_DEATH_NOTES \
- | PROP_KILL_DEAD_CODE \
- | PROP_SCAN_DEAD_CODE \
- | PROP_SCAN_DEAD_STORES)
-
#define CLEANUP_EXPENSIVE 1 /* Do relatively expensive optimizations
except for edge forwarding */
#define CLEANUP_CROSSJUMP 2 /* Do crossjumping. */
#define CLEANUP_POST_REGSTACK 4 /* We run after reg-stack and need
to care REG_DEAD notes. */
-#define CLEANUP_PRE_LOOP 8 /* Take care to preserve syntactic loop
- notes. */
-#define CLEANUP_UPDATE_LIFE 16 /* Keep life information up to date. */
-#define CLEANUP_THREADING 32 /* Do jump threading. */
-#define CLEANUP_NO_INSN_DEL 64 /* Do not try to delete trivially dead
+#define CLEANUP_THREADING 8 /* Do jump threading. */
+#define CLEANUP_NO_INSN_DEL 16 /* Do not try to delete trivially dead
insns. */
-#define CLEANUP_CFGLAYOUT 128 /* Do cleanup in cfglayout mode. */
-#define CLEANUP_LOG_LINKS 256 /* Update log links. */
+#define CLEANUP_CFGLAYOUT 32 /* Do cleanup in cfglayout mode. */
/* The following are ORed in on top of the CLEANUP* flags in calls to
struct_equiv_block_eq. */
-#define STRUCT_EQUIV_START 512 /* Initializes the search range. */
-#define STRUCT_EQUIV_RERUN 1024 /* Rerun to find register use in
+#define STRUCT_EQUIV_START 64 /* Initializes the search range. */
+#define STRUCT_EQUIV_RERUN 128 /* Rerun to find register use in
found equivalence. */
-#define STRUCT_EQUIV_FINAL 2048 /* Make any changes necessary to get
+#define STRUCT_EQUIV_FINAL 256 /* Make any changes necessary to get
actual equivalence. */
-#define STRUCT_EQUIV_NEED_FULL_BLOCK 4096 /* struct_equiv_block_eq is required
+#define STRUCT_EQUIV_NEED_FULL_BLOCK 512 /* struct_equiv_block_eq is required
to match only full blocks */
-#define STRUCT_EQUIV_MATCH_JUMPS 8192 /* Also include the jumps at the end of the block in the comparison. */
-
-extern void life_analysis (FILE *, int);
-extern int update_life_info (sbitmap, enum update_life_extent, int);
-extern int update_life_info_in_dirty_blocks (enum update_life_extent, int);
-extern int count_or_remove_death_notes (sbitmap, int);
-extern int propagate_block (basic_block, regset, regset, regset, int);
-
-struct propagate_block_info;
-extern rtx propagate_one_insn (struct propagate_block_info *, rtx);
-extern struct propagate_block_info *init_propagate_block_info
- (basic_block, regset, regset, regset, int);
-extern void free_propagate_block_info (struct propagate_block_info *);
+#define STRUCT_EQUIV_MATCH_JUMPS 1024 /* Also include the jumps at the end of the block in the comparison. */
/* In lcm.c */
-extern struct edge_list *pre_edge_lcm (FILE *, int, sbitmap *, sbitmap *,
+extern struct edge_list *pre_edge_lcm (int, sbitmap *, sbitmap *,
sbitmap *, sbitmap *, sbitmap **,
sbitmap **);
-extern struct edge_list *pre_edge_rev_lcm (FILE *, int, sbitmap *,
+extern struct edge_list *pre_edge_rev_lcm (int, sbitmap *,
sbitmap *, sbitmap *,
sbitmap *, sbitmap **,
sbitmap **);
extern void compute_available (sbitmap *, sbitmap *, sbitmap *, sbitmap *);
-extern int optimize_mode_switching (FILE *);
/* In predict.c */
-extern void estimate_probability (struct loops *);
-extern void expected_value_to_br_prob (void);
extern bool maybe_hot_bb_p (basic_block);
extern bool probably_cold_bb_p (basic_block);
extern bool probably_never_executed_bb_p (basic_block);
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 (edge);
+extern bool br_prob_note_reliable_p (rtx);
-/* In flow.c */
+/* In cfg.c */
+extern void dump_regset (regset, FILE *);
+extern void debug_regset (regset);
extern void init_flow (void);
extern void debug_bb (basic_block);
extern basic_block debug_bb_n (int);
extern void dump_regset (regset, FILE *);
extern void debug_regset (regset);
-extern void allocate_reg_life_data (void);
extern void expunge_block (basic_block);
extern void link_block (basic_block, basic_block);
extern void unlink_block (basic_block);
extern void compact_blocks (void);
extern basic_block alloc_block (void);
-extern void find_unreachable_blocks (void);
-extern int delete_noop_moves (void);
-extern basic_block force_nonfallthru (edge);
-extern rtx block_label (basic_block);
-extern bool forwarder_block_p (basic_block);
-extern bool purge_all_dead_edges (void);
-extern bool purge_dead_edges (basic_block);
-extern void find_many_sub_basic_blocks (sbitmap);
-extern void rtl_make_eh_edge (sbitmap, basic_block, rtx);
-extern bool can_fallthru (basic_block, basic_block);
-extern bool could_fall_through (basic_block, basic_block);
-extern void flow_nodes_print (const char *, const sbitmap, FILE *);
-extern void flow_edge_list_print (const char *, const edge *, int, FILE *);
extern void alloc_aux_for_block (basic_block, int);
extern void alloc_aux_for_blocks (int);
extern void clear_aux_for_blocks (void);
extern void alloc_aux_for_edges (int);
extern void clear_aux_for_edges (void);
extern void free_aux_for_edges (void);
-extern void find_basic_blocks (rtx);
-extern bool cleanup_cfg (int);
-extern bool delete_unreachable_blocks (void);
-extern bool merge_seq_blocks (void);
-typedef struct conflict_graph_def *conflict_graph;
+/* In cfganal.c */
+extern void find_unreachable_blocks (void);
+extern bool forwarder_block_p (basic_block);
+extern bool can_fallthru (basic_block, basic_block);
+extern bool could_fall_through (basic_block, basic_block);
+extern void flow_nodes_print (const char *, const sbitmap, FILE *);
+extern void flow_edge_list_print (const char *, const edge *, int, FILE *);
-/* Callback function when enumerating conflicts. The arguments are
- the smaller and larger regno in the conflict. Returns zero if
- enumeration is to continue, nonzero to halt enumeration. */
-typedef int (*conflict_graph_enum_fn) (int, int, void *);
+/* In cfgrtl.c */
+extern basic_block force_nonfallthru (edge);
+extern rtx block_label (basic_block);
+extern bool purge_all_dead_edges (void);
+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);
-/* Prototypes of operations on conflict graphs. */
+/* In cfgcleanup.c. */
+extern bool cleanup_cfg (int);
+extern bool delete_unreachable_blocks (void);
-extern conflict_graph conflict_graph_new
- (int);
-extern void conflict_graph_delete (conflict_graph);
-extern int conflict_graph_add (conflict_graph, int, int);
-extern int conflict_graph_conflict_p (conflict_graph, int, int);
-extern void conflict_graph_enum (conflict_graph, int, conflict_graph_enum_fn,
- void *);
-extern void conflict_graph_merge_regs (conflict_graph, int, int);
-extern void conflict_graph_print (conflict_graph, FILE*);
extern bool mark_dfs_back_edges (void);
extern void set_edge_can_fallthru_flag (void);
extern void update_br_prob_note (basic_block);
extern void fixup_abnormal_edges (void);
extern bool inside_basic_block_p (rtx);
extern bool control_flow_insn_p (rtx);
+extern rtx get_last_bb_insn (basic_block);
/* In bb-reorder.c */
-extern void reorder_basic_blocks (unsigned int);
-extern void partition_hot_cold_basic_blocks (void);
+extern void reorder_basic_blocks (void);
/* In dominance.c */
enum cdi_direction
{
- CDI_DOMINATORS,
- CDI_POST_DOMINATORS
+ CDI_DOMINATORS = 1,
+ CDI_POST_DOMINATORS = 2
};
enum dom_state
DOM_OK /* Everything is ok. */
};
-extern enum dom_state dom_computed[2];
-
+extern enum dom_state dom_info_state (enum cdi_direction);
+extern void set_dom_info_availability (enum cdi_direction, enum dom_state);
extern bool dom_info_available_p (enum cdi_direction);
extern void calculate_dominance_info (enum cdi_direction);
extern void free_dominance_info (enum cdi_direction);
extern basic_block nearest_common_dominator (enum cdi_direction,
basic_block, basic_block);
-extern basic_block nearest_common_dominator_for_set (enum cdi_direction,
+extern basic_block nearest_common_dominator_for_set (enum cdi_direction,
bitmap);
extern void set_immediate_dominator (enum cdi_direction, basic_block,
basic_block);
extern basic_block get_immediate_dominator (enum cdi_direction, basic_block);
extern bool dominated_by_p (enum cdi_direction, basic_block, basic_block);
-extern int get_dominated_by (enum cdi_direction, basic_block, basic_block **);
-extern unsigned get_dominated_by_region (enum cdi_direction, basic_block *,
- unsigned, basic_block *);
+extern VEC (basic_block, heap) *get_dominated_by (enum cdi_direction, basic_block);
+extern VEC (basic_block, heap) *get_dominated_by_region (enum cdi_direction,
+ basic_block *,
+ unsigned);
extern void add_to_dominance_info (enum cdi_direction, basic_block);
extern void delete_from_dominance_info (enum cdi_direction, basic_block);
-basic_block recount_dominator (enum cdi_direction, basic_block);
+basic_block recompute_dominator (enum cdi_direction, basic_block);
extern void redirect_immediate_dominators (enum cdi_direction, basic_block,
basic_block);
-extern void iterate_fix_dominators (enum cdi_direction, basic_block *, int);
+extern void iterate_fix_dominators (enum cdi_direction,
+ VEC (basic_block, heap) *, bool);
extern void verify_dominators (enum cdi_direction);
extern basic_block first_dom_son (enum cdi_direction, basic_block);
extern basic_block next_dom_son (enum cdi_direction, basic_block);
+unsigned bb_dom_dfs_in (enum cdi_direction, basic_block);
+unsigned bb_dom_dfs_out (enum cdi_direction, basic_block);
+
extern edge try_redirect_by_replacing_jump (edge, basic_block, bool);
extern void break_superblocks (void);
+extern void relink_block_chain (bool);
extern void check_bb_profile (basic_block, FILE *);
extern void update_bb_profile_for_threading (basic_block, int, gcov_type, edge);
extern void init_rtl_bb_info (basic_block);
extern basic_block get_bb_original (basic_block);
extern void set_bb_copy (basic_block, basic_block);
extern basic_block get_bb_copy (basic_block);
+void set_loop_copy (struct loop *, struct loop *);
+struct loop *get_loop_copy (struct loop *);
+
+
+extern rtx insert_insn_end_bb_new (rtx, basic_block);
#include "cfghooks.h"
/* In cfgrtl.c */
extern bool condjump_equiv_p (struct equiv_info *, bool);
+/* Return true when one of the predecessor edges of BB is marked with EDGE_EH. */
+static inline bool
+bb_has_eh_pred (basic_block bb)
+{
+ edge e;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ {
+ if (e->flags & EDGE_EH)
+ return true;
+ }
+ return false;
+}
+
+/* In cfgloopmanip.c. */
+extern edge mfb_kj_edge;
+bool mfb_keep_just (edge);
+
#endif /* GCC_BASIC_BLOCK_H */