OSDN Git Service

2003-06-10 Andrew Haley <aph@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / basic-block.h
index fbc231e..4aa47dd 100644 (file)
@@ -150,9 +150,19 @@ typedef struct edge_def {
 #define EDGE_DFS_BACK          32      /* A backwards edge */
 #define EDGE_CAN_FALLTHRU      64      /* Candidate for straight line
                                           flow.  */
+#define EDGE_IRREDUCIBLE_LOOP  128     /* Part of irreducible loop.  */
+#define EDGE_SIBCALL           256     /* Edge from sibcall to exit.  */
+#define EDGE_ALL_FLAGS         511
 
 #define EDGE_COMPLEX   (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
 
+/* Counter summary from the last set of coverage counts read by
+   profile.c. */
+extern const struct gcov_ctr_summary *profile_info;
+
+/* Declared in cfgloop.h.  */
+struct loop;
+struct loops;
 
 /* A basic block is a sequence of instructions with only entry and
    only one exit.  If any one of the instructions are executed, they
@@ -240,6 +250,8 @@ typedef struct basic_block_def {
 #define BB_NEW                 2
 #define BB_REACHABLE           4
 #define BB_VISITED             8
+#define BB_IRREDUCIBLE_LOOP    16
+#define BB_SUPERBLOCK          32
 
 /* Number of basic blocks in the current function.  */
 
@@ -327,8 +339,6 @@ extern void update_bb_for_insn              PARAMS ((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));
@@ -338,6 +348,8 @@ 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 edge unchecked_make_edge                PARAMS ((basic_block,
+                                                basic_block, int));
 extern edge cached_make_edge           PARAMS ((sbitmap *, basic_block,
                                                 basic_block, int));
 extern edge make_edge                  PARAMS ((basic_block,
@@ -350,8 +362,7 @@ extern edge redirect_edge_succ_nodup        PARAMS ((edge, basic_block));
 extern void redirect_edge_pred         PARAMS ((edge, basic_block));
 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 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,
@@ -360,6 +371,9 @@ 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 int dfs_enumerate_from          PARAMS ((basic_block, int,
+                                               bool (*)(basic_block, void *),
+                                               basic_block *, int, void *));
 extern void dump_edge_info             PARAMS ((FILE *, edge, int));
 extern void clear_edges                        PARAMS ((void));
 extern void mark_critical_edges                PARAMS ((void));
@@ -369,165 +383,6 @@ extern rtx first_insn_after_basic_block_note      PARAMS ((basic_block));
 
 typedef struct dominance_info *dominance_info;
 
-/* Structure to hold information for each natural loop.  */
-struct loop
-{
-  /* Index into loops array.  */
-  int num;
-
-  /* Basic block of loop header.  */
-  basic_block header;
-
-  /* Basic block of loop latch.  */
-  basic_block latch;
-
-  /* Basic block of loop pre-header or NULL if it does not exist.  */
-  basic_block pre_header;
-
-  /* Array of edges along the pre-header extended basic block trace.
-     The source of the first edge is the root node of pre-header
-     extended basic block, if it exists.  */
-  edge *pre_header_edges;
-
-  /* Number of edges along the pre_header extended basic block trace.  */
-  int num_pre_header_edges;
-
-  /* The first block in the loop.  This is not necessarily the same as
-     the loop header.  */
-  basic_block first;
-
-  /* The last block in the loop.  This is not necessarily the same as
-     the loop latch.  */
-  basic_block last;
-
-  /* Bitmap of blocks contained within the loop.  */
-  sbitmap nodes;
-
-  /* Number of blocks contained within the loop.  */
-  int num_nodes;
-
-  /* Array of edges that enter the loop.  */
-  edge *entry_edges;
-
-  /* Number of edges that enter the loop.  */
-  int num_entries;
-
-  /* Array of edges that exit the loop.  */
-  edge *exit_edges;
-
-  /* Number of edges that exit the loop.  */
-  int num_exits;
-
-  /* Bitmap of blocks that dominate all exits of the loop.  */
-  sbitmap exits_doms;
-
-  /* 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;
-
-  /* The outer (parent) loop or NULL if outermost loop.  */
-  struct loop *outer;
-
-  /* The first inner (child) loop or NULL if innermost loop.  */
-  struct loop *inner;
-
-  /* Link to the next (sibling) loop.  */
-  struct loop *next;
-
-  /* Nonzero if the loop is invalid (e.g., contains setjmp.).  */
-  int invalid;
-
-  /* Auxiliary info specific to a pass.  */
-  void *aux;
-
-  /* The following are currently used by loop.c but they are likely to
-     disappear as loop.c is converted to use the CFG.  */
-
-  /* Nonzero if the loop has a NOTE_INSN_LOOP_VTOP.  */
-  rtx vtop;
-
-  /* Nonzero if the loop has a NOTE_INSN_LOOP_CONT.
-     A continue statement will generate a branch to NEXT_INSN (cont).  */
-  rtx cont;
-
-  /* The NOTE_INSN_LOOP_BEG.  */
-  rtx start;
-
-  /* The NOTE_INSN_LOOP_END.  */
-  rtx end;
-
-  /* For a rotated loop that is entered near the bottom,
-     this is the label at the top.  Otherwise it is zero.  */
-  rtx top;
-
-  /* Place in the loop where control enters.  */
-  rtx scan_start;
-
-  /* The position where to sink insns out of the loop.  */
-  rtx sink;
-
-  /* List of all LABEL_REFs which refer to code labels outside the
-     loop.  Used by routines that need to know all loop exits, such as
-     final_biv_value and final_giv_value.
-
-     This does not include loop exits due to return instructions.
-     This is because all bivs and givs are pseudos, and hence must be
-     dead after a return, so the presence of a return does not affect
-     any of the optimizations that use this info.  It is simpler to
-     just not include return instructions on this list.  */
-  rtx exit_labels;
-
-  /* The number of LABEL_REFs on exit_labels for this loop and all
-     loops nested inside it.  */
-  int exit_count;
-};
-
-
-/* Structure to hold CFG information about natural loops within a function.  */
-struct loops
-{
-  /* Number of natural loops in the function.  */
-  int num;
-
-  /* Maxium nested loop level in the function.  */
-  int levels;
-
-  /* Array of natural loop descriptors (scanning this array in reverse order
-     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;
-
-  /* Information derived from the CFG.  */
-  struct cfg
-  {
-    /* The bitmap vector of dominators or NULL if not computed.  */
-    dominance_info dom;
-
-    /* The ordering of the basic blocks in a depth first search.  */
-    int *dfs_order;
-
-    /* The reverse completion ordering of the basic blocks found in a
-       depth first search.  */
-    int *rc_order;
-  } cfg;
-
-  /* Headers shared by multiple loops that should be merged.  */
-  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
@@ -555,19 +410,6 @@ typedef struct ce_if_block
 
 } 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 *));
-extern void flow_loops_dump PARAMS ((const struct loops *, FILE *,
-                                    void (*)(const struct loop *,
-                                             FILE *, int), int));
-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
 {
@@ -658,15 +500,6 @@ enum update_life_extent
 #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.  */
-#define LOOP_PRE_HEADER                2       /* Analyse loop pre-header.  */
-#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_ALL              15       /* All of the above  */
-
 extern void life_analysis      PARAMS ((rtx, FILE *, int));
 extern int update_life_info    PARAMS ((sbitmap, enum update_life_extent,
                                         int));
@@ -713,7 +546,7 @@ extern void init_flow                   PARAMS ((void));
 extern void reorder_basic_blocks       PARAMS ((void));
 extern void dump_bb                    PARAMS ((basic_block, FILE *));
 extern void debug_bb                   PARAMS ((basic_block));
-extern void debug_bb_n                 PARAMS ((int));
+extern basic_block debug_bb_n          PARAMS ((int));
 extern void dump_regset                        PARAMS ((regset, FILE *));
 extern void debug_regset               PARAMS ((regset));
 extern void allocate_reg_life_data      PARAMS ((void));
@@ -725,9 +558,7 @@ extern void compact_blocks          PARAMS ((void));
 extern basic_block alloc_block         PARAMS ((void));
 extern void find_unreachable_blocks    PARAMS ((void));
 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 bool purge_all_dead_edges       PARAMS ((int));
@@ -752,26 +583,6 @@ extern void free_aux_for_edges             PARAMS ((void));
    debugger, and it is declared extern so we don't get warnings about
    it being unused.  */
 extern void verify_flow_info           PARAMS ((void));
-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 *,
-                                                const 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;
 
@@ -806,6 +617,7 @@ 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));
+extern bool inside_basic_block_p       PARAMS ((rtx));
 extern bool control_flow_insn_p                PARAMS ((rtx));
 
 /* In dominance.c */
@@ -833,4 +645,7 @@ 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));
+
+#include "cfghooks.h"
+
 #endif /* GCC_BASIC_BLOCK_H */