00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_BASIC_BLOCK_H
00023 #define GCC_BASIC_BLOCK_H
00024
00025 #include "bitmap.h"
00026 #include "sbitmap.h"
00027 #include "varray.h"
00028 #include "partition.h"
00029 #include "hard-reg-set.h"
00030
00031
00032 typedef bitmap_head regset_head;
00033
00034 typedef bitmap regset;
00035
00036
00037 #define INIT_REG_SET(HEAD) bitmap_initialize (HEAD, 1)
00038
00039
00040 #define CLEAR_REG_SET(HEAD) bitmap_clear (HEAD)
00041
00042
00043 #define COPY_REG_SET(TO, FROM) bitmap_copy (TO, FROM)
00044
00045
00046 #define REG_SET_EQUAL_P(A, B) bitmap_equal_p (A, B)
00047
00048
00049 #define AND_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_AND)
00050
00051
00052 #define AND_COMPL_REG_SET(TO, FROM) \
00053 bitmap_operation (TO, TO, FROM, BITMAP_AND_COMPL)
00054
00055
00056 #define IOR_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_IOR)
00057
00058
00059 #define XOR_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_XOR)
00060
00061
00062 #define IOR_AND_COMPL_REG_SET(TO, FROM1, FROM2) \
00063 bitmap_ior_and_compl (TO, FROM1, FROM2)
00064
00065
00066 #define CLEAR_REGNO_REG_SET(HEAD, REG) bitmap_clear_bit (HEAD, REG)
00067
00068
00069 #define SET_REGNO_REG_SET(HEAD, REG) bitmap_set_bit (HEAD, REG)
00070
00071
00072 #define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG)
00073
00074
00075 extern void reg_set_to_hard_reg_set PARAMS ((HARD_REG_SET *, bitmap));
00076 #define REG_SET_TO_HARD_REG_SET(TO, FROM) \
00077 do { \
00078 CLEAR_HARD_REG_SET (TO); \
00079 reg_set_to_hard_reg_set (&TO, FROM); \
00080 } while (0)
00081
00082
00083
00084 #define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, CODE) \
00085 EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, CODE)
00086
00087
00088
00089
00090 #define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
00091 EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
00092
00093
00094
00095
00096 #define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
00097 EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
00098
00099
00100 #define OBSTACK_ALLOC_REG_SET(OBSTACK) BITMAP_OBSTACK_ALLOC (OBSTACK)
00101
00102
00103 #define INITIALIZE_REG_SET(HEAD) bitmap_initialize (&HEAD, 1)
00104
00105
00106 #define FREE_REG_SET(REGSET) BITMAP_FREE(REGSET)
00107
00108
00109 #define INIT_ONCE_REG_SET() BITMAP_INIT_ONCE ()
00110
00111
00112
00113
00114 #define MAX_REGNO_REG_SET(NUM_REGS, NEW_P, RENUMBER_P)
00115
00116
00117 typedef HOST_WIDEST_INT gcov_type;
00118
00119
00120 typedef struct edge_def {
00121
00122 struct edge_def *pred_next, *succ_next;
00123
00124
00125 struct basic_block_def *src, *dest;
00126
00127
00128 rtx insns;
00129
00130
00131 void *aux;
00132
00133 int flags;
00134 int probability;
00135 gcov_type count;
00136
00137 } *edge;
00138
00139 #define EDGE_FALLTHRU 1
00140 #define EDGE_ABNORMAL 2
00141
00142 #define EDGE_ABNORMAL_CALL 4
00143
00144 #define EDGE_EH 8
00145 #define EDGE_FAKE 16
00146 #define EDGE_DFS_BACK 32
00147 #define EDGE_CAN_FALLTHRU 64
00148
00149
00150 #define EDGE_COMPLEX (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 typedef struct basic_block_def {
00180
00181 rtx head, end;
00182
00183
00184 tree head_tree;
00185 tree end_tree;
00186
00187
00188 edge pred, succ;
00189
00190
00191
00192
00193 regset local_set;
00194
00195
00196
00197 regset cond_local_set;
00198
00199
00200
00201
00202
00203 regset global_live_at_start;
00204
00205 regset global_live_at_end;
00206
00207
00208 void *aux;
00209
00210
00211 int index;
00212
00213
00214 struct basic_block_def *prev_bb, *next_bb;
00215
00216
00217 int loop_depth;
00218
00219
00220 struct loop *loop_father;
00221
00222
00223 gcov_type count;
00224
00225
00226 int frequency;
00227
00228
00229 int flags;
00230 } *basic_block;
00231
00232 #define BB_FREQ_MAX 10000
00233
00234
00235 #define BB_DIRTY 1
00236 #define BB_NEW 2
00237 #define BB_REACHABLE 4
00238 #define BB_VISITED 8
00239
00240
00241
00242 extern int n_basic_blocks;
00243
00244
00245
00246 extern int last_basic_block;
00247
00248
00249
00250 extern int n_edges;
00251
00252
00253
00254 extern varray_type basic_block_info;
00255
00256 #define BASIC_BLOCK(N) (VARRAY_BB (basic_block_info, (N)))
00257
00258
00259 #define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
00260 for (BB = FROM; BB != TO; BB = BB->DIR)
00261
00262 #define FOR_EACH_BB(BB) \
00263 FOR_BB_BETWEEN (BB, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb)
00264
00265 #define FOR_EACH_BB_REVERSE(BB) \
00266 FOR_BB_BETWEEN (BB, EXIT_BLOCK_PTR->prev_bb, ENTRY_BLOCK_PTR, prev_bb)
00267
00268
00269
00270
00271 #define FOR_ALL_BB(BB) \
00272 for (BB = ENTRY_BLOCK_PTR; BB; BB = BB->next_bb)
00273
00274
00275
00276 extern regset regs_live_at_setjmp;
00277
00278
00279
00280 extern GTY(()) rtx label_value_list;
00281 extern GTY(()) rtx tail_recursion_label_list;
00282
00283 extern struct obstack flow_obstack;
00284
00285
00286
00287
00288
00289
00290
00291
00292 #define REG_BLOCK_UNKNOWN -1
00293 #define REG_BLOCK_GLOBAL -2
00294
00295 #define REG_BASIC_BLOCK(N) (VARRAY_REG (reg_n_info, N)->basic_block)
00296
00297
00298
00299 #define BLOCK_HEAD(B) (BASIC_BLOCK (B)->head)
00300 #define BLOCK_END(B) (BASIC_BLOCK (B)->end)
00301
00302 #define BLOCK_HEAD_TREE(B) (BASIC_BLOCK (B)->head_tree)
00303 #define BLOCK_END_TREE(B) (BASIC_BLOCK (B)->end_tree)
00304
00305
00306 #define ENTRY_BLOCK (-1)
00307 #define EXIT_BLOCK (-2)
00308
00309
00310 #define INVALID_BLOCK (-3)
00311
00312
00313 extern struct basic_block_def entry_exit_blocks[2];
00314 #define ENTRY_BLOCK_PTR (&entry_exit_blocks[0])
00315 #define EXIT_BLOCK_PTR (&entry_exit_blocks[1])
00316
00317 #define BLOCK_NUM(INSN) (BLOCK_FOR_INSN (INSN)->index + 0)
00318 #define set_block_for_insn(INSN, BB) (BLOCK_FOR_INSN (INSN) = BB)
00319
00320 extern void compute_bb_for_insn PARAMS ((void));
00321 extern void free_bb_for_insn PARAMS ((void));
00322 extern void update_bb_for_insn PARAMS ((basic_block));
00323
00324 extern void free_basic_block_vars PARAMS ((int));
00325
00326 extern edge split_block PARAMS ((basic_block, rtx));
00327 extern basic_block split_edge PARAMS ((edge));
00328 extern void insert_insn_on_edge PARAMS ((rtx, edge));
00329
00330 extern void commit_edge_insertions PARAMS ((void));
00331 extern void commit_edge_insertions_watch_calls PARAMS ((void));
00332
00333 extern void remove_fake_edges PARAMS ((void));
00334 extern void add_noreturn_fake_exit_edges PARAMS ((void));
00335 extern void connect_infinite_loops_to_exit PARAMS ((void));
00336 extern int flow_call_edges_add PARAMS ((sbitmap));
00337 extern edge cached_make_edge PARAMS ((sbitmap *, basic_block,
00338 basic_block, int));
00339 extern edge unchecked_make_edge PARAMS ((basic_block,
00340 basic_block, int));
00341 extern edge make_edge PARAMS ((basic_block,
00342 basic_block, int));
00343 extern edge make_single_succ_edge PARAMS ((basic_block,
00344 basic_block, int));
00345 extern void remove_edge PARAMS ((edge));
00346 extern void redirect_edge_succ PARAMS ((edge, basic_block));
00347 extern edge redirect_edge_succ_nodup PARAMS ((edge, basic_block));
00348 extern void redirect_edge_pred PARAMS ((edge, basic_block));
00349 extern basic_block create_basic_block_structure PARAMS ((rtx, rtx, rtx, basic_block));
00350 extern basic_block create_basic_block PARAMS ((rtx, rtx, basic_block));
00351 extern int flow_delete_block PARAMS ((basic_block));
00352 extern int flow_delete_block_noexpunge PARAMS ((basic_block));
00353 extern void clear_bb_flags PARAMS ((void));
00354 extern void merge_blocks_nomove PARAMS ((basic_block, basic_block));
00355 extern void tidy_fallthru_edge PARAMS ((edge, basic_block,
00356 basic_block));
00357 extern void tidy_fallthru_edges PARAMS ((void));
00358 extern void flow_reverse_top_sort_order_compute PARAMS ((int *));
00359 extern int flow_depth_first_order_compute PARAMS ((int *, int *));
00360 extern void flow_preorder_transversal_compute PARAMS ((int *));
00361 extern void dump_edge_info PARAMS ((FILE *, edge, int));
00362 extern void clear_edges PARAMS ((void));
00363 extern void mark_critical_edges PARAMS ((void));
00364 extern rtx first_insn_after_basic_block_note PARAMS ((basic_block));
00365
00366
00367
00368 typedef struct dominance_info *dominance_info;
00369
00370
00371 struct loop
00372 {
00373
00374 int num;
00375
00376
00377 basic_block header;
00378
00379
00380 basic_block latch;
00381
00382
00383 basic_block pre_header;
00384
00385
00386
00387
00388 edge *pre_header_edges;
00389
00390
00391 int num_pre_header_edges;
00392
00393
00394
00395 basic_block first;
00396
00397
00398
00399 basic_block last;
00400
00401
00402 sbitmap nodes;
00403
00404
00405 int num_nodes;
00406
00407
00408 edge *entry_edges;
00409
00410
00411 int num_entries;
00412
00413
00414 edge *exit_edges;
00415
00416
00417 int num_exits;
00418
00419
00420 sbitmap exits_doms;
00421
00422
00423 int depth;
00424
00425
00426 struct loop **pred;
00427
00428
00429
00430 int level;
00431
00432
00433 struct loop *outer;
00434
00435
00436 struct loop *inner;
00437
00438
00439 struct loop *next;
00440
00441
00442 int invalid;
00443
00444
00445 void *aux;
00446
00447
00448
00449
00450
00451 rtx vtop;
00452
00453
00454
00455 rtx cont;
00456
00457
00458 rtx start;
00459
00460
00461 rtx end;
00462
00463
00464
00465 rtx top;
00466
00467
00468 rtx scan_start;
00469
00470
00471 rtx sink;
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482 rtx exit_labels;
00483
00484
00485
00486 int exit_count;
00487 };
00488
00489
00490
00491 struct loops
00492 {
00493
00494 int num;
00495
00496
00497 int levels;
00498
00499
00500
00501 struct loop *array;
00502
00503
00504
00505
00506 struct loop **parray;
00507
00508
00509 struct loop *tree_root;
00510
00511
00512 struct cfg
00513 {
00514
00515 dominance_info dom;
00516
00517
00518 int *dfs_order;
00519
00520
00521
00522 int *rc_order;
00523 } cfg;
00524
00525
00526 sbitmap shared_headers;
00527 };
00528
00529
00530
00531
00532
00533
00534 typedef struct ce_if_block
00535 {
00536 basic_block test_bb;
00537 basic_block then_bb;
00538 basic_block else_bb;
00539 basic_block join_bb;
00540 basic_block last_test_bb;
00541 int num_multiple_test_blocks;
00542 int num_and_and_blocks;
00543 int num_or_or_blocks;
00544 int num_multiple_test_insns;
00545 int and_and_p;
00546 int num_then_insns;
00547 int num_else_insns;
00548 int pass;
00549
00550 #ifdef IFCVT_EXTRA_FIELDS
00551 IFCVT_EXTRA_FIELDS
00552 #endif
00553
00554 } ce_if_block_t;
00555
00556 extern int flow_loops_find PARAMS ((struct loops *, int flags));
00557 extern int flow_loops_update PARAMS ((struct loops *, int flags));
00558 extern void flow_loops_free PARAMS ((struct loops *));
00559 extern void flow_loops_dump PARAMS ((const struct loops *, FILE *,
00560 void (*)(const struct loop *,
00561 FILE *, int), int));
00562 extern void flow_loop_dump PARAMS ((const struct loop *, FILE *,
00563 void (*)(const struct loop *,
00564 FILE *, int), int));
00565 extern int flow_loop_scan PARAMS ((struct loops *, struct loop *, int));
00566 extern void flow_loop_tree_node_add PARAMS ((struct loop *, struct loop *));
00567 extern void flow_loop_tree_node_remove PARAMS ((struct loop *));
00568
00569
00570 struct edge_list
00571 {
00572 int num_blocks;
00573 int num_edges;
00574 edge *index_to_edge;
00575 };
00576
00577
00578 #define EDGE_INDEX_NO_EDGE -1
00579
00580
00581
00582 #define EDGE_INDEX(el, pred, succ) (find_edge_index ((el), (pred), (succ)))
00583
00584
00585
00586 #define INDEX_EDGE_PRED_BB(el, index) ((el)->index_to_edge[(index)]->src)
00587 #define INDEX_EDGE_SUCC_BB(el, index) ((el)->index_to_edge[(index)]->dest)
00588
00589
00590 #define INDEX_EDGE(el, index) ((el)->index_to_edge[(index)])
00591
00592
00593 #define NUM_EDGES(el) ((el)->num_edges)
00594
00595
00596 #define FALLTHRU_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
00597 ? (bb)->succ : (bb)->succ->succ_next)
00598
00599
00600 #define BRANCH_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
00601 ? (bb)->succ->succ_next : (bb)->succ)
00602
00603
00604 #define EDGE_FREQUENCY(e) (((e)->src->frequency \
00605 * (e)->probability \
00606 + REG_BR_PROB_BASE / 2) \
00607 / REG_BR_PROB_BASE)
00608
00609
00610 #define EDGE_CRITICAL_P(e) ((e)->src->succ->succ_next \
00611 && (e)->dest->pred->pred_next)
00612
00613 struct edge_list * create_edge_list PARAMS ((void));
00614 void free_edge_list PARAMS ((struct edge_list *));
00615 void print_edge_list PARAMS ((FILE *, struct edge_list *));
00616 void verify_edge_list PARAMS ((FILE *, struct edge_list *));
00617 int find_edge_index PARAMS ((struct edge_list *,
00618 basic_block, basic_block));
00619
00620
00621 enum update_life_extent
00622 {
00623 UPDATE_LIFE_LOCAL = 0,
00624 UPDATE_LIFE_GLOBAL = 1,
00625 UPDATE_LIFE_GLOBAL_RM_NOTES = 2
00626 };
00627
00628
00629
00630 #define PROP_DEATH_NOTES 1
00631 #define PROP_LOG_LINKS 2
00632 #define PROP_REG_INFO 4
00633 #define PROP_KILL_DEAD_CODE 8
00634 #define PROP_SCAN_DEAD_CODE 16
00635 #define PROP_ALLOW_CFG_CHANGES 32
00636
00637 #define PROP_AUTOINC 64
00638 #define PROP_EQUAL_NOTES 128
00639 #define PROP_SCAN_DEAD_STORES 256
00640 #define PROP_FINAL (PROP_DEATH_NOTES | PROP_LOG_LINKS \
00641 | PROP_REG_INFO | PROP_KILL_DEAD_CODE \
00642 | PROP_SCAN_DEAD_CODE | PROP_AUTOINC \
00643 | PROP_ALLOW_CFG_CHANGES \
00644 | PROP_SCAN_DEAD_STORES)
00645
00646 #define CLEANUP_EXPENSIVE 1
00647
00648 #define CLEANUP_CROSSJUMP 2
00649 #define CLEANUP_POST_REGSTACK 4
00650
00651 #define CLEANUP_PRE_SIBCALL 8
00652
00653 #define CLEANUP_PRE_LOOP 16
00654
00655 #define CLEANUP_UPDATE_LIFE 32
00656 #define CLEANUP_THREADING 64
00657 #define CLEANUP_NO_INSN_DEL 128
00658
00659
00660
00661 #define LOOP_TREE 1
00662 #define LOOP_PRE_HEADER 2
00663 #define LOOP_ENTRY_EDGES 4
00664 #define LOOP_EXIT_EDGES 8
00665 #define LOOP_EDGES (LOOP_ENTRY_EDGES | LOOP_EXIT_EDGES)
00666 #define LOOP_ALL 15
00667
00668 extern void life_analysis PARAMS ((rtx, FILE *, int));
00669 extern int update_life_info PARAMS ((sbitmap, enum update_life_extent,
00670 int));
00671 extern int update_life_info_in_dirty_blocks PARAMS ((enum update_life_extent,
00672 int));
00673 extern int count_or_remove_death_notes PARAMS ((sbitmap, int));
00674 extern int propagate_block PARAMS ((basic_block, regset, regset, regset,
00675 int));
00676
00677 struct propagate_block_info;
00678 extern rtx propagate_one_insn PARAMS ((struct propagate_block_info *, rtx));
00679 extern struct propagate_block_info *init_propagate_block_info
00680 PARAMS ((basic_block, regset, regset, regset, int));
00681 extern void free_propagate_block_info PARAMS ((struct propagate_block_info *));
00682
00683
00684 extern struct edge_list *pre_edge_lcm PARAMS ((FILE *, int, sbitmap *,
00685 sbitmap *, sbitmap *,
00686 sbitmap *, sbitmap **,
00687 sbitmap **));
00688 extern struct edge_list *pre_edge_rev_lcm PARAMS ((FILE *, int, sbitmap *,
00689 sbitmap *, sbitmap *,
00690 sbitmap *, sbitmap **,
00691 sbitmap **));
00692 extern void compute_available PARAMS ((sbitmap *, sbitmap *,
00693 sbitmap *, sbitmap *));
00694 extern int optimize_mode_switching PARAMS ((FILE *));
00695
00696
00697 extern rtx emit_block_insn_after PARAMS ((rtx, rtx, basic_block));
00698 extern rtx emit_block_insn_before PARAMS ((rtx, rtx, basic_block));
00699
00700
00701 extern void estimate_probability PARAMS ((struct loops *));
00702 extern void note_prediction_to_br_prob PARAMS ((void));
00703 extern void expected_value_to_br_prob PARAMS ((void));
00704 extern void note_prediction_to_br_prob PARAMS ((void));
00705 extern bool maybe_hot_bb_p PARAMS ((basic_block));
00706 extern bool probably_cold_bb_p PARAMS ((basic_block));
00707 extern bool probably_never_executed_bb_p PARAMS ((basic_block));
00708
00709
00710 extern void init_flow PARAMS ((void));
00711 extern void reorder_basic_blocks PARAMS ((void));
00712 extern void dump_bb PARAMS ((basic_block, FILE *));
00713 extern void debug_bb PARAMS ((basic_block));
00714 extern void debug_bb_n PARAMS ((int));
00715 extern void dump_regset PARAMS ((regset, FILE *));
00716 extern void debug_regset PARAMS ((regset));
00717 extern void allocate_reg_life_data PARAMS ((void));
00718 extern void allocate_bb_life_data PARAMS ((void));
00719 extern void expunge_block PARAMS ((basic_block));
00720 extern void link_block PARAMS ((basic_block, basic_block));
00721 extern void unlink_block PARAMS ((basic_block));
00722 extern void compact_blocks PARAMS ((void));
00723 extern basic_block alloc_block PARAMS ((void));
00724 extern void find_unreachable_blocks PARAMS ((void));
00725 extern int delete_noop_moves PARAMS ((rtx));
00726 extern basic_block redirect_edge_and_branch_force PARAMS ((edge, basic_block));
00727 extern basic_block force_nonfallthru PARAMS ((edge));
00728 extern bool redirect_edge_and_branch PARAMS ((edge, basic_block));
00729 extern rtx block_label PARAMS ((basic_block));
00730 extern bool forwarder_block_p PARAMS ((basic_block));
00731 extern bool purge_all_dead_edges PARAMS ((int));
00732 extern bool purge_dead_edges PARAMS ((basic_block));
00733 extern void find_sub_basic_blocks PARAMS ((basic_block));
00734 extern void find_many_sub_basic_blocks PARAMS ((sbitmap));
00735 extern bool can_fallthru PARAMS ((basic_block, basic_block));
00736 extern void flow_nodes_print PARAMS ((const char *, const sbitmap,
00737 FILE *));
00738 extern void flow_edge_list_print PARAMS ((const char *, const edge *,
00739 int, FILE *));
00740 extern void alloc_aux_for_block PARAMS ((basic_block, int));
00741 extern void alloc_aux_for_blocks PARAMS ((int));
00742 extern void clear_aux_for_blocks PARAMS ((void));
00743 extern void free_aux_for_blocks PARAMS ((void));
00744 extern void alloc_aux_for_edge PARAMS ((edge, int));
00745 extern void alloc_aux_for_edges PARAMS ((int));
00746 extern void clear_aux_for_edges PARAMS ((void));
00747 extern void free_aux_for_edges PARAMS ((void));
00748
00749
00750
00751
00752 extern void verify_flow_info PARAMS ((void));
00753 extern bool flow_loop_outside_edge_p PARAMS ((const struct loop *, edge));
00754 extern bool flow_loop_nested_p PARAMS ((const struct loop *,
00755 const struct loop *));
00756 extern bool flow_bb_inside_loop_p PARAMS ((const struct loop *,
00757 const basic_block));
00758 extern basic_block *get_loop_body PARAMS ((const struct loop *));
00759 extern int dfs_enumerate_from PARAMS ((basic_block, int,
00760 bool (*)(basic_block, void *),
00761 basic_block *, int, void *));
00762
00763 extern edge loop_preheader_edge PARAMS ((struct loop *));
00764 extern edge loop_latch_edge PARAMS ((struct loop *));
00765
00766 extern void add_bb_to_loop PARAMS ((basic_block, struct loop *));
00767 extern void remove_bb_from_loops PARAMS ((basic_block));
00768 extern struct loop * find_common_loop PARAMS ((struct loop *, struct loop *));
00769
00770 extern void verify_loop_structure PARAMS ((struct loops *, int));
00771 #define VLS_EXPECT_PREHEADERS 1
00772 #define VLS_EXPECT_SIMPLE_LATCHES 2
00773
00774 typedef struct conflict_graph_def *conflict_graph;
00775
00776
00777
00778
00779 typedef int (*conflict_graph_enum_fn) PARAMS ((int, int, void *));
00780
00781
00782
00783
00784 extern conflict_graph conflict_graph_new
00785 PARAMS ((int));
00786 extern void conflict_graph_delete PARAMS ((conflict_graph));
00787 extern int conflict_graph_add PARAMS ((conflict_graph,
00788 int, int));
00789 extern int conflict_graph_conflict_p PARAMS ((conflict_graph,
00790 int, int));
00791 extern void conflict_graph_enum PARAMS ((conflict_graph, int,
00792 conflict_graph_enum_fn,
00793 void *));
00794 extern void conflict_graph_merge_regs PARAMS ((conflict_graph, int,
00795 int));
00796 extern void conflict_graph_print PARAMS ((conflict_graph, FILE*));
00797 extern conflict_graph conflict_graph_compute
00798 PARAMS ((regset,
00799 partition));
00800 extern bool mark_dfs_back_edges PARAMS ((void));
00801 extern void set_edge_can_fallthru_flag PARAMS ((void));
00802 extern void update_br_prob_note PARAMS ((basic_block));
00803 extern void fixup_abnormal_edges PARAMS ((void));
00804 extern bool can_hoist_insn_p PARAMS ((rtx, rtx, regset));
00805 extern rtx hoist_insn_after PARAMS ((rtx, rtx, rtx, rtx));
00806 extern rtx hoist_insn_to_edge PARAMS ((rtx, edge, rtx, rtx));
00807 extern bool control_flow_insn_p PARAMS ((rtx));
00808
00809
00810
00811 enum cdi_direction
00812 {
00813 CDI_DOMINATORS,
00814 CDI_POST_DOMINATORS
00815 };
00816
00817 extern dominance_info calculate_dominance_info PARAMS ((enum cdi_direction));
00818 extern void free_dominance_info PARAMS ((dominance_info));
00819 extern basic_block nearest_common_dominator PARAMS ((dominance_info,
00820 basic_block, basic_block));
00821 extern void set_immediate_dominator PARAMS ((dominance_info,
00822 basic_block, basic_block));
00823 extern basic_block get_immediate_dominator PARAMS ((dominance_info,
00824 basic_block));
00825 extern bool dominated_by_p PARAMS ((dominance_info, basic_block, basic_block));
00826 extern int get_dominated_by PARAMS ((dominance_info, basic_block, basic_block **));
00827 extern void add_to_dominance_info PARAMS ((dominance_info, basic_block));
00828 extern void delete_from_dominance_info PARAMS ((dominance_info, basic_block));
00829 basic_block recount_dominator PARAMS ((dominance_info, basic_block));
00830 extern void redirect_immediate_dominators PARAMS ((dominance_info, basic_block,
00831 basic_block));
00832 void iterate_fix_dominators PARAMS ((dominance_info, basic_block *, int));
00833 extern void verify_dominators PARAMS ((dominance_info));
00834 #endif