OSDN Git Service

* combine.c (simplify_shift_const): Calculate rotate count
[pf3gnuchains/gcc-fork.git] / gcc / basic-block.h
index 8100715..507fac0 100644 (file)
@@ -1,22 +1,23 @@
 /* Define control and data flow tables, and regsets.
-   Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002
+   Free Software Foundation, Inc.
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
 
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+along with GCC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
 
 #ifndef GCC_BASIC_BLOCK_H
 #define GCC_BASIC_BLOCK_H
@@ -26,18 +27,13 @@ Boston, MA 02111-1307, USA.  */
 #include "varray.h"
 #include "partition.h"
 
-#ifndef TREE_CODE
-union tree_node;
-#define tree union tree_node *
-#endif
-
 /* Head of register set linked list.  */
 typedef bitmap_head regset_head;
 /* A pointer to a regset_head.  */
 typedef bitmap regset;
 
 /* Initialize a new regset.  */
-#define INIT_REG_SET(HEAD) bitmap_initialize (HEAD)
+#define INIT_REG_SET(HEAD) bitmap_initialize (HEAD, 1)
 
 /* Clear a register set by freeing up the linked list.  */
 #define CLEAR_REG_SET(HEAD) bitmap_clear (HEAD)
@@ -83,19 +79,19 @@ do {                                                                        \
 } while (0)
 
 /* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the
-   register number and executing CODE for all registers that are set. */
+   register number and executing CODE for all registers that are set.  */
 #define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, CODE)           \
   EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, CODE)
 
 /* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
    REGNUM to the register number and executing CODE for all registers that are
-   set in the first regset and not set in the second. */
+   set in the first regset and not set in the second.  */
 #define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
   EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
 
 /* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
    REGNUM to the register number and executing CODE for all registers that are
-   set in both regsets. */
+   set in both regsets.  */
 #define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
   EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
 
@@ -103,7 +99,7 @@ do {                                                                 \
 #define OBSTACK_ALLOC_REG_SET(OBSTACK) BITMAP_OBSTACK_ALLOC (OBSTACK)
 
 /* Initialize a register set.  Returns the new register set.  */
-#define INITIALIZE_REG_SET(HEAD) bitmap_initialize (&HEAD)
+#define INITIALIZE_REG_SET(HEAD) bitmap_initialize (&HEAD, 1)
 
 /* Do any cleanup needed on a regset when it is no longer used.  */
 #define FREE_REG_SET(REGSET) BITMAP_FREE(REGSET)
@@ -139,13 +135,16 @@ typedef struct edge_def {
                                   in profile.c  */
 } *edge;
 
-#define EDGE_FALLTHRU          1
-#define EDGE_CRITICAL          2
-#define EDGE_ABNORMAL          4
-#define EDGE_ABNORMAL_CALL     8
-#define EDGE_EH                        16
-#define EDGE_FAKE              32
-#define EDGE_DFS_BACK          64
+#define EDGE_FALLTHRU          1       /* 'Straight line' flow */
+#define EDGE_ABNORMAL          2       /* Strange flow, like computed
+                                          label, or eh */
+#define EDGE_ABNORMAL_CALL     4       /* Call with abnormal exit
+                                          like an exception, or sibcall */
+#define EDGE_EH                        8       /* Exception throw */
+#define EDGE_FAKE              16      /* Not a real edge (profile.c) */
+#define EDGE_DFS_BACK          32      /* A backwards edge */
+#define EDGE_CAN_FALLTHRU      64      /* Candidate for straight line
+                                          flow. */
 
 #define EDGE_COMPLEX   (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
 
@@ -210,22 +209,41 @@ typedef struct basic_block_def {
   /* The index of this block.  */
   int index;
 
+  /* Previous and next blocks in the chain.  */
+  struct basic_block_def *prev_bb, *next_bb;
+
   /* The loop depth of this block.  */
   int loop_depth;
 
+  /* Outermost loop containing the block.  */
+  struct loop *loop_father;
+
   /* Expected number of executions: calculated in profile.c.  */
   gcov_type count;
 
   /* Expected frequency.  Normalized to be in range 0 to BB_FREQ_MAX.  */
   int frequency;
+
+  /* Various flags.  See BB_* below.  */
+  int flags;
 } *basic_block;
 
 #define BB_FREQ_MAX 10000
 
+/* Masks for basic_block.flags.  */
+#define BB_DIRTY               1
+#define BB_NEW                 2
+#define BB_REACHABLE           4
+#define BB_VISITED             8
+
 /* Number of basic blocks in the current function.  */
 
 extern int n_basic_blocks;
 
+/* First free basic block number.  */
+
+extern int last_basic_block;
+
 /* Number of edges in the current function.  */
 
 extern int n_edges;
@@ -236,10 +254,33 @@ extern varray_type basic_block_info;
 
 #define BASIC_BLOCK(N)  (VARRAY_BB (basic_block_info, (N)))
 
+/* For iterating over basic blocks.  */
+#define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
+  for (BB = FROM; BB != TO; BB = BB->DIR)
+
+#define FOR_EACH_BB(BB) \
+  FOR_BB_BETWEEN (BB, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb)
+
+#define FOR_EACH_BB_REVERSE(BB) \
+  FOR_BB_BETWEEN (BB, EXIT_BLOCK_PTR->prev_bb, ENTRY_BLOCK_PTR, prev_bb)
+
+/* Cycles through _all_ basic blocks, even the fake ones (entry and
+   exit block).  */
+
+#define FOR_ALL_BB(BB) \
+  for (BB = ENTRY_BLOCK_PTR; BB; BB = BB->next_bb)
+
 /* What registers are live at the setjmp call.  */
 
 extern regset regs_live_at_setjmp;
 
+/* Special labels found during CFG build.  */
+
+extern GTY(()) rtx label_value_list;
+extern GTY(()) rtx tail_recursion_label_list;
+
+extern struct obstack flow_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.
@@ -264,7 +305,7 @@ extern regset regs_live_at_setjmp;
 #define ENTRY_BLOCK (-1)
 #define EXIT_BLOCK (-2)
 
-/* Special block number not valid for any block. */
+/* Special block number not valid for any block.  */
 #define INVALID_BLOCK (-3)
 
 /* Similarly, block pointers for the edge list.  */
@@ -272,44 +313,57 @@ extern struct basic_block_def entry_exit_blocks[2];
 #define ENTRY_BLOCK_PTR        (&entry_exit_blocks[0])
 #define EXIT_BLOCK_PTR (&entry_exit_blocks[1])
 
-extern varray_type basic_block_for_insn;
-#define BLOCK_FOR_INSN(INSN)  VARRAY_BB (basic_block_for_insn, INSN_UID (INSN))
 #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                PARAMS ((int));
+extern void compute_bb_for_insn                PARAMS ((void));
+extern void free_bb_for_insn           PARAMS ((void));
 extern void update_bb_for_insn         PARAMS ((basic_block));
-extern void set_block_for_insn         PARAMS ((rtx, basic_block));
-extern void set_block_for_new_insns    PARAMS ((rtx, basic_block));
 
 extern void free_basic_block_vars      PARAMS ((int));
 
 extern edge split_block                        PARAMS ((basic_block, rtx));
 extern basic_block split_edge          PARAMS ((edge));
 extern void insert_insn_on_edge                PARAMS ((rtx, edge));
+
 extern void commit_edge_insertions     PARAMS ((void));
+extern void commit_edge_insertions_watch_calls PARAMS ((void));
+
 extern void remove_fake_edges          PARAMS ((void));
 extern void add_noreturn_fake_exit_edges       PARAMS ((void));
 extern void connect_infinite_loops_to_exit     PARAMS ((void));
 extern int flow_call_edges_add         PARAMS ((sbitmap));
-extern rtx flow_delete_insn            PARAMS ((rtx));
-extern void flow_delete_insn_chain     PARAMS ((rtx, rtx));
-extern void make_edge                  PARAMS ((sbitmap *, basic_block,
+extern edge cached_make_edge           PARAMS ((sbitmap *, basic_block,
+                                                basic_block, int));
+extern edge make_edge                  PARAMS ((basic_block,
+                                                basic_block, int));
+extern edge make_single_succ_edge      PARAMS ((basic_block,
                                                 basic_block, int));
 extern void remove_edge                        PARAMS ((edge));
 extern void redirect_edge_succ         PARAMS ((edge, basic_block));
-extern void redirect_edge_succ_nodup   PARAMS ((edge, basic_block));
+extern edge redirect_edge_succ_nodup   PARAMS ((edge, basic_block));
 extern void redirect_edge_pred         PARAMS ((edge, basic_block));
-extern void create_basic_block         PARAMS ((int, rtx, rtx, rtx));
+extern basic_block create_basic_block_structure PARAMS ((rtx, rtx, rtx, basic_block));
+extern basic_block create_basic_block  PARAMS ((rtx, rtx, basic_block));
 extern int flow_delete_block           PARAMS ((basic_block));
+extern int flow_delete_block_noexpunge PARAMS ((basic_block));
+extern void clear_bb_flags             PARAMS ((void));
 extern void merge_blocks_nomove                PARAMS ((basic_block, basic_block));
 extern void tidy_fallthru_edge         PARAMS ((edge, basic_block,
                                                 basic_block));
+extern void tidy_fallthru_edges                PARAMS ((void));
+extern void flow_reverse_top_sort_order_compute        PARAMS ((int *));
 extern int flow_depth_first_order_compute      PARAMS ((int *, int *));
+extern void flow_preorder_transversal_compute  PARAMS ((int *));
 extern void dump_edge_info             PARAMS ((FILE *, edge, int));
 extern void clear_edges                        PARAMS ((void));
 extern void mark_critical_edges                PARAMS ((void));
 extern rtx first_insn_after_basic_block_note   PARAMS ((basic_block));
 
+/* Dominator information for basic blocks.  */
+
+typedef struct dominance_info *dominance_info;
+
 /* Structure to hold information for each natural loop.  */
 struct loop
 {
@@ -365,6 +419,9 @@ struct loop
   /* The loop nesting depth.  */
   int depth;
 
+  /* Superloops of the loop.  */
+  struct loop **pred;
+
   /* The height of the loop (enclosed loop levels) within the loop
      hierarchy tree.  */
   int level;
@@ -378,9 +435,6 @@ struct loop
   /* Link to the next (sibling) loop.  */
   struct loop *next;
 
-  /* Non-zero if the loop shares a header with another loop.  */
-  int shared;
-
   /* Non-zero if the loop is invalid (e.g., contains setjmp.).  */
   int invalid;
 
@@ -446,6 +500,11 @@ struct loops
      will find the inner loops before their enclosing outer loops).  */
   struct loop *array;
 
+  /* The above array is unused in new loop infrastructure and is kept only for
+     purposes of the old loop optimizer.  Instead we store just pointers to
+     loops here.  */
+  struct loop **parray;
+
   /* Pointer to root of loop heirachy tree.  */
   struct loop *tree_root;
 
@@ -453,7 +512,7 @@ struct loops
   struct cfg
   {
     /* The bitmap vector of dominators or NULL if not computed.  */
-    sbitmap *dom;
+    dominance_info dom;
 
     /* The ordering of the basic blocks in a depth first search.  */
     int *dfs_order;
@@ -467,6 +526,33 @@ struct loops
   sbitmap shared_headers;
 };
 
+/* Structure to group all of the information to process IF-THEN and
+   IF-THEN-ELSE blocks for the conditional execution support.  This
+   needs to be in a public file in case the IFCVT macros call
+   functions passing the ce_if_block data structure.  */
+
+typedef struct ce_if_block
+{
+  basic_block test_bb;                 /* First test block.  */
+  basic_block then_bb;                 /* THEN block.  */
+  basic_block else_bb;                 /* ELSE block or NULL.  */
+  basic_block join_bb;                 /* Join THEN/ELSE blocks.  */
+  basic_block last_test_bb;            /* Last bb to hold && or || tests.  */
+  int num_multiple_test_blocks;                /* # of && and || basic blocks.  */
+  int num_and_and_blocks;              /* # of && blocks.  */
+  int num_or_or_blocks;                        /* # of || blocks.  */
+  int num_multiple_test_insns;         /* # of insns in && and || blocks.  */
+  int and_and_p;                       /* Complex test is &&.  */
+  int num_then_insns;                  /* # of insns in THEN block.  */
+  int num_else_insns;                  /* # of insns in ELSE block.  */
+  int pass;                            /* Pass number.  */
+
+#ifdef IFCVT_EXTRA_FIELDS
+  IFCVT_EXTRA_FIELDS                   /* Any machine dependent fields.  */
+#endif
+
+} ce_if_block_t;
+
 extern int flow_loops_find PARAMS ((struct loops *, int flags));
 extern int flow_loops_update PARAMS ((struct loops *, int flags));
 extern void flow_loops_free PARAMS ((struct loops *));
@@ -477,6 +563,8 @@ extern void flow_loop_dump PARAMS ((const struct loop *, FILE *,
                                    void (*)(const struct loop *,
                                             FILE *, int), int));
 extern int flow_loop_scan PARAMS ((struct loops *, struct loop *, int));
+extern void flow_loop_tree_node_add PARAMS ((struct loop *, struct loop *));
+extern void flow_loop_tree_node_remove PARAMS ((struct loop *));
 
 /* This structure maintains an edge list vector.  */
 struct edge_list
@@ -518,6 +606,10 @@ struct edge_list
                                          + REG_BR_PROB_BASE / 2) \
                                         / REG_BR_PROB_BASE)
 
+/* Return nonzero if edge is critical.  */
+#define EDGE_CRITICAL_P(e)             ((e)->src->succ->succ_next \
+                                        && (e)->dest->pred->pred_next)
+
 struct edge_list * create_edge_list    PARAMS ((void));
 void free_edge_list                    PARAMS ((struct edge_list *));
 void print_edge_list                   PARAMS ((FILE *, struct edge_list *));
@@ -543,7 +635,13 @@ enum update_life_extent
 #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_FINAL             127     /* All of the above.  */
+#define PROP_EQUAL_NOTES       128     /* Take into account REG_EQUAL notes.  */
+#define PROP_SCAN_DEAD_STORES  256     /* Scan for dead code.  */
+#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 CLEANUP_EXPENSIVE      1       /* Do relativly expensive optimizations
                                           except for edge forwarding */
@@ -554,6 +652,10 @@ enum update_life_extent
                                           inside call_placeholders..  */
 #define CLEANUP_PRE_LOOP       16      /* Take care to preserve syntactic loop
                                           notes.  */
+#define CLEANUP_UPDATE_LIFE    32      /* Keep life information up to date.  */
+#define CLEANUP_THREADING      64      /* Do jump threading.  */
+#define CLEANUP_NO_INSN_DEL    128     /* Do not try to delete trivially dead
+                                          insns.  */
 /* Flags for loop discovery.  */
 
 #define LOOP_TREE              1       /* Build loop hierarchy tree.  */
@@ -561,12 +663,13 @@ enum update_life_extent
 #define LOOP_ENTRY_EDGES       4       /* Find entry edges.  */
 #define LOOP_EXIT_EDGES                8       /* Find exit edges.  */
 #define LOOP_EDGES             (LOOP_ENTRY_EDGES | LOOP_EXIT_EDGES)
-#define LOOP_EXITS_DOMS               16       /* Find nodes that dom. all exits.  */
-#define LOOP_ALL              31       /* All of the above  */
+#define LOOP_ALL              15       /* All of the above  */
 
 extern void life_analysis      PARAMS ((rtx, FILE *, int));
-extern void update_life_info   PARAMS ((sbitmap, enum update_life_extent,
+extern int update_life_info    PARAMS ((sbitmap, enum update_life_extent,
                                         int));
+extern int update_life_info_in_dirty_blocks PARAMS ((enum update_life_extent,
+                                                     int));
 extern int count_or_remove_death_notes PARAMS ((sbitmap, int));
 extern int propagate_block     PARAMS ((basic_block, regset, regset, regset,
                                         int));
@@ -596,7 +699,12 @@ extern rtx emit_block_insn_before  PARAMS ((rtx, rtx, basic_block));
 
 /* In predict.c */
 extern void estimate_probability        PARAMS ((struct loops *));
+extern void note_prediction_to_br_prob PARAMS ((void));
 extern void expected_value_to_br_prob  PARAMS ((void));
+extern void note_prediction_to_br_prob PARAMS ((void));
+extern bool maybe_hot_bb_p             PARAMS ((basic_block));
+extern bool probably_cold_bb_p         PARAMS ((basic_block));
+extern bool probably_never_executed_bb_p PARAMS ((basic_block));
 
 /* In flow.c */
 extern void init_flow                   PARAMS ((void));
@@ -608,23 +716,58 @@ extern void dump_regset                   PARAMS ((regset, FILE *));
 extern void debug_regset               PARAMS ((regset));
 extern void allocate_reg_life_data      PARAMS ((void));
 extern void allocate_bb_life_data      PARAMS ((void));
+extern void expunge_block              PARAMS ((basic_block));
+extern void link_block                 PARAMS ((basic_block, basic_block));
+extern void unlink_block               PARAMS ((basic_block));
+extern void compact_blocks             PARAMS ((void));
+extern basic_block alloc_block         PARAMS ((void));
 extern void find_unreachable_blocks    PARAMS ((void));
-extern void delete_noop_moves          PARAMS ((rtx));
-extern rtx last_loop_beg_note          PARAMS ((rtx));
+extern int delete_noop_moves           PARAMS ((rtx));
 extern basic_block redirect_edge_and_branch_force PARAMS ((edge, basic_block));
+extern basic_block force_nonfallthru   PARAMS ((edge));
 extern bool redirect_edge_and_branch   PARAMS ((edge, basic_block));
 extern rtx block_label                 PARAMS ((basic_block));
 extern bool forwarder_block_p          PARAMS ((basic_block));
-extern void purge_all_dead_edges       PARAMS ((void));
-extern void purge_dead_edges           PARAMS ((basic_block));
+extern bool purge_all_dead_edges       PARAMS ((int));
+extern bool purge_dead_edges           PARAMS ((basic_block));
 extern void find_sub_basic_blocks      PARAMS ((basic_block));
-
+extern void find_many_sub_basic_blocks PARAMS ((sbitmap));
+extern bool can_fallthru               PARAMS ((basic_block, basic_block));
+extern void flow_nodes_print           PARAMS ((const char *, const sbitmap,
+                                                FILE *));
+extern void flow_edge_list_print       PARAMS ((const char *, const edge *,
+                                                int, FILE *));
+extern void alloc_aux_for_block                PARAMS ((basic_block, int));
+extern void alloc_aux_for_blocks       PARAMS ((int));
+extern void clear_aux_for_blocks       PARAMS ((void));
+extern void free_aux_for_blocks                PARAMS ((void));
+extern void alloc_aux_for_edge         PARAMS ((edge, int));
+extern void alloc_aux_for_edges                PARAMS ((int));
+extern void clear_aux_for_edges                PARAMS ((void));
+extern void free_aux_for_edges         PARAMS ((void));
 
 /* This function is always defined so it can be called from the
    debugger, and it is declared extern so we don't get warnings about
-   it being unused. */
+   it being unused.  */
 extern void verify_flow_info           PARAMS ((void));
-extern int flow_loop_outside_edge_p    PARAMS ((const struct loop *, edge));
+extern bool flow_loop_outside_edge_p   PARAMS ((const struct loop *, edge));
+extern bool flow_loop_nested_p PARAMS ((const struct loop *, const struct loop *));
+extern bool flow_bb_inside_loop_p       PARAMS ((const struct loop *, basic_block));
+extern basic_block *get_loop_body       PARAMS ((const struct loop *));
+extern int dfs_enumerate_from           PARAMS ((basic_block, int,
+                                        bool (*)(basic_block, void *),
+                                        basic_block *, int, void *));
+
+extern edge loop_preheader_edge PARAMS ((struct loop *));
+extern edge loop_latch_edge PARAMS ((struct loop *));
+
+extern void add_bb_to_loop PARAMS ((basic_block, struct loop *));
+extern void remove_bb_from_loops PARAMS ((basic_block));
+extern struct loop * find_common_loop PARAMS ((struct loop *, struct loop *));
+
+extern void verify_loop_structure PARAMS ((struct loops *, int));
+#define VLS_EXPECT_PREHEADERS 1
+#define VLS_EXPECT_SIMPLE_LATCHES 2
 
 typedef struct conflict_graph_def *conflict_graph;
 
@@ -653,6 +796,12 @@ extern conflict_graph conflict_graph_compute
                                         PARAMS ((regset,
                                                 partition));
 extern bool mark_dfs_back_edges                PARAMS ((void));
+extern void set_edge_can_fallthru_flag PARAMS ((void));
+extern void update_br_prob_note                PARAMS ((basic_block));
+extern void fixup_abnormal_edges       PARAMS ((void));
+extern bool can_hoist_insn_p           PARAMS ((rtx, rtx, regset));
+extern rtx hoist_insn_after            PARAMS ((rtx, rtx, rtx, rtx));
+extern rtx hoist_insn_to_edge          PARAMS ((rtx, edge, rtx, rtx));
 
 /* In dominance.c */
 
@@ -662,7 +811,21 @@ enum cdi_direction
   CDI_POST_DOMINATORS
 };
 
-extern void calculate_dominance_info   PARAMS ((int *, sbitmap *,
-                                                enum cdi_direction));
-
+extern dominance_info calculate_dominance_info PARAMS ((enum cdi_direction));
+extern void free_dominance_info                        PARAMS ((dominance_info));
+extern basic_block nearest_common_dominator    PARAMS ((dominance_info,
+                                                basic_block, basic_block));
+extern void set_immediate_dominator    PARAMS ((dominance_info,
+                                                basic_block, basic_block));
+extern basic_block get_immediate_dominator     PARAMS ((dominance_info,
+                                                basic_block));
+extern bool dominated_by_p     PARAMS ((dominance_info, basic_block, basic_block));
+extern int get_dominated_by PARAMS ((dominance_info, basic_block, basic_block **));
+extern void add_to_dominance_info PARAMS ((dominance_info, basic_block));
+extern void delete_from_dominance_info PARAMS ((dominance_info, basic_block));
+basic_block recount_dominator PARAMS ((dominance_info, basic_block));
+extern void redirect_immediate_dominators PARAMS ((dominance_info, basic_block,
+                                                basic_block));
+void iterate_fix_dominators PARAMS ((dominance_info, basic_block *, int));
+extern void verify_dominators PARAMS ((dominance_info));
 #endif /* GCC_BASIC_BLOCK_H */