OSDN Git Service

* config/xtensa/xtensa.md: Remove unused type attributes.
[pf3gnuchains/gcc-fork.git] / gcc / basic-block.h
index 295748b..c9fc4b8 100644 (file)
@@ -1,5 +1,6 @@
 /* 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
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -26,11 +27,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #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.  */
@@ -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)
 
@@ -140,12 +136,11 @@ typedef struct edge_def {
 } *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_ABNORMAL          2
+#define EDGE_ABNORMAL_CALL     4
+#define EDGE_EH                        8
+#define EDGE_FAKE              16
+#define EDGE_DFS_BACK          32
 
 #define EDGE_COMPLEX   (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
 
@@ -226,7 +221,9 @@ typedef struct basic_block_def {
 #define BB_FREQ_MAX 10000
 
 /* Masks for basic_block.flags.  */
-#define BB_REACHABLE           1
+#define BB_DIRTY               1
+#define BB_NEW                 2
+#define BB_REACHABLE           4
 
 /* Number of basic blocks in the current function.  */
 
@@ -246,6 +243,12 @@ extern varray_type basic_block_info;
 
 extern regset regs_live_at_setjmp;
 
+/* Special labels found during CFG build.  */
+
+extern rtx label_value_list, 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.
@@ -270,7 +273,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.  */
@@ -283,34 +286,44 @@ extern varray_type basic_block_for_insn;
 #define BLOCK_NUM(INSN)              (BLOCK_FOR_INSN (INSN)->index + 0)
 
 extern void compute_bb_for_insn                PARAMS ((int));
+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 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 ((int, rtx, rtx, rtx));
+extern basic_block create_basic_block  PARAMS ((int, rtx, rtx));
 extern int flow_delete_block           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));
@@ -524,6 +537,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 *));
@@ -549,6 +566,7 @@ 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_EQUAL_NOTES       128     /* Take into account REG_EQUAL notes.  */
 #define PROP_FINAL             127     /* All of the above.  */
 
 #define CLEANUP_EXPENSIVE      1       /* Do relativly expensive optimizations
@@ -560,6 +578,8 @@ 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.  */
 /* Flags for loop discovery.  */
 
 #define LOOP_TREE              1       /* Build loop hierarchy tree.  */
@@ -571,8 +591,10 @@ enum update_life_extent
 #define LOOP_ALL              31       /* 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));
@@ -614,22 +636,36 @@ 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 find_unreachable_blocks    PARAMS ((void));
 extern void expunge_block              PARAMS ((basic_block));
-extern void delete_noop_moves          PARAMS ((rtx));
-extern rtx last_loop_beg_note          PARAMS ((rtx));
+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 ((void));
+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));
 
@@ -660,6 +696,8 @@ extern conflict_graph conflict_graph_compute
                                         PARAMS ((regset,
                                                 partition));
 extern bool mark_dfs_back_edges                PARAMS ((void));
+extern void update_br_prob_note                PARAMS ((basic_block));
+extern void fixup_abnormal_edges       PARAMS ((void));
 
 /* In dominance.c */