]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/basic-block.h
Merge basic-improvements-branch to trunk
[thirdparty/gcc.git] / gcc / basic-block.h
CommitLineData
6207bd2c 1/* Define control and data flow tables, and regsets.
8f8dcce4 2 Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002
9fb758e1 3 Free Software Foundation, Inc.
6207bd2c 4
f12b58b3 5This file is part of GCC.
6207bd2c 6
f12b58b3 7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
6207bd2c 11
f12b58b3 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
6207bd2c 16
17You should have received a copy of the GNU General Public License
f12b58b3 18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
6207bd2c 21
2a281353 22#ifndef GCC_BASIC_BLOCK_H
ddc63996 23#define GCC_BASIC_BLOCK_H
6207bd2c 24
7e0b0820 25#include "bitmap.h"
152bf224 26#include "sbitmap.h"
71caadc0 27#include "varray.h"
8a5b87ad 28#include "partition.h"
7e0b0820 29
7872b193 30/* Head of register set linked list. */
31typedef bitmap_head regset_head;
32/* A pointer to a regset_head. */
33typedef bitmap regset;
34
35/* Initialize a new regset. */
1f3233d1 36#define INIT_REG_SET(HEAD) bitmap_initialize (HEAD, 1)
7e0b0820 37
38/* Clear a register set by freeing up the linked list. */
39#define CLEAR_REG_SET(HEAD) bitmap_clear (HEAD)
40
41/* Copy a register set to another register set. */
42#define COPY_REG_SET(TO, FROM) bitmap_copy (TO, FROM)
43
2d9b9dfe 44/* Compare two register sets. */
45#define REG_SET_EQUAL_P(A, B) bitmap_equal_p (A, B)
46
7e0b0820 47/* `and' a register set with a second register set. */
48#define AND_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_AND)
49
50/* `and' the complement of a register set with a register set. */
51#define AND_COMPL_REG_SET(TO, FROM) \
52 bitmap_operation (TO, TO, FROM, BITMAP_AND_COMPL)
53
54/* Inclusive or a register set with a second register set. */
55#define IOR_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_IOR)
56
2d9b9dfe 57/* Exclusive or a register set with a second register set. */
58#define XOR_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_XOR)
59
7e0b0820 60/* Or into TO the register set FROM1 `and'ed with the complement of FROM2. */
61#define IOR_AND_COMPL_REG_SET(TO, FROM1, FROM2) \
62 bitmap_ior_and_compl (TO, FROM1, FROM2)
74666a14 63
64/* Clear a single register in a register set. */
7e0b0820 65#define CLEAR_REGNO_REG_SET(HEAD, REG) bitmap_clear_bit (HEAD, REG)
74666a14 66
67/* Set a single register in a register set. */
7e0b0820 68#define SET_REGNO_REG_SET(HEAD, REG) bitmap_set_bit (HEAD, REG)
74666a14 69
70/* Return true if a register is set in a register set. */
7e0b0820 71#define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG)
74666a14 72
73/* Copy the hard registers in a register set to the hard register set. */
d6cb6164 74extern void reg_set_to_hard_reg_set PARAMS ((HARD_REG_SET *, bitmap));
74666a14 75#define REG_SET_TO_HARD_REG_SET(TO, FROM) \
76do { \
74666a14 77 CLEAR_HARD_REG_SET (TO); \
d6cb6164 78 reg_set_to_hard_reg_set (&TO, FROM); \
74666a14 79} while (0)
80
81/* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the
a7dce381 82 register number and executing CODE for all registers that are set. */
74666a14 83#define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, CODE) \
7e0b0820 84 EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, CODE)
74666a14 85
86/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
87 REGNUM to the register number and executing CODE for all registers that are
a7dce381 88 set in the first regset and not set in the second. */
74666a14 89#define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
7e0b0820 90 EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
74666a14 91
23ec99a1 92/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
93 REGNUM to the register number and executing CODE for all registers that are
a7dce381 94 set in both regsets. */
23ec99a1 95#define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
96 EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
97
74666a14 98/* Allocate a register set with oballoc. */
7e0b0820 99#define OBSTACK_ALLOC_REG_SET(OBSTACK) BITMAP_OBSTACK_ALLOC (OBSTACK)
74666a14 100
3367fbd0 101/* Initialize a register set. Returns the new register set. */
1f3233d1 102#define INITIALIZE_REG_SET(HEAD) bitmap_initialize (&HEAD, 1)
7e0b0820 103
104/* Do any cleanup needed on a regset when it is no longer used. */
105#define FREE_REG_SET(REGSET) BITMAP_FREE(REGSET)
106
107/* Do any one-time initializations needed for regsets. */
108#define INIT_ONCE_REG_SET() BITMAP_INIT_ONCE ()
109
110/* Grow any tables needed when the number of registers is calculated
111 or extended. For the linked list allocation, nothing needs to
112 be done, other than zero the statistics on the first allocation. */
ddc63996 113#define MAX_REGNO_REG_SET(NUM_REGS, NEW_P, RENUMBER_P)
74666a14 114
805e22b2 115/* Type we use to hold basic block counters. Should be at least
116 64bit. Although a counter cannot be negative, we use a signed
117 type, because erroneous negative counts can be generated when the
118 flow graph is manipulated by various optimizations. A signed type
119 makes those easy to detect. */
63f23608 120typedef HOST_WIDEST_INT gcov_type;
121
71caadc0 122/* Control flow edge information. */
123typedef struct edge_def {
124 /* Links through the predecessor and successor lists. */
125 struct edge_def *pred_next, *succ_next;
6207bd2c 126
71caadc0 127 /* The two blocks at the ends of the edge. */
128 struct basic_block_def *src, *dest;
129
130 /* Instructions queued on the edge. */
131 rtx insns;
132
133 /* Auxiliary info specific to a pass. */
134 void *aux;
6207bd2c 135
71caadc0 136 int flags; /* see EDGE_* below */
137 int probability; /* biased by REG_BR_PROB_BASE */
63f23608 138 gcov_type count; /* Expected number of executions calculated
86d4af74 139 in profile.c */
71caadc0 140} *edge;
6207bd2c 141
958c14b1 142#define EDGE_FALLTHRU 1 /* 'Straight line' flow */
143#define EDGE_ABNORMAL 2 /* Strange flow, like computed
144 label, or eh */
145#define EDGE_ABNORMAL_CALL 4 /* Call with abnormal exit
146 like an exception, or sibcall */
147#define EDGE_EH 8 /* Exception throw */
148#define EDGE_FAKE 16 /* Not a real edge (profile.c) */
149#define EDGE_DFS_BACK 32 /* A backwards edge */
150#define EDGE_CAN_FALLTHRU 64 /* Candidate for straight line
7299020b 151 flow. */
6207bd2c 152
2102d800 153#define EDGE_COMPLEX (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
154
6207bd2c 155
997af237 156/* A basic block is a sequence of instructions with only entry and
157 only one exit. If any one of the instructions are executed, they
158 will all be executed, and in sequence from first to last.
159
160 There may be COND_EXEC instructions in the basic block. The
161 COND_EXEC *instructions* will be executed -- but if the condition
162 is false the conditionally executed *expressions* will of course
163 not be executed. We don't consider the conditionally executed
164 expression (which might have side-effects) to be in a separate
165 basic block because the program counter will always be at the same
166 location after the COND_EXEC instruction, regardless of whether the
167 condition is true or not.
168
169 Basic blocks need not start with a label nor end with a jump insn.
1deb248e 170 For example, a previous basic block may just "conditionally fall"
171 into the succeeding basic block, and the last basic block need not
172 end with a jump insn. Block 0 is a descendant of the entry block.
173
174 A basic block beginning with two labels cannot have notes between
175 the labels.
176
177 Data for jump tables are stored in jump_insns that occur in no
178 basic block even though these insns can follow or precede insns in
179 basic blocks. */
180
71caadc0 181/* Basic block information indexed by block number. */
182typedef struct basic_block_def {
183 /* The first and last insns of the block. */
184 rtx head, end;
6207bd2c 185
fac55a46 186 /* The first and last trees of the block. */
187 tree head_tree;
188 tree end_tree;
189
71caadc0 190 /* The edges into and out of the block. */
191 edge pred, succ;
f24e9d92 192
997af237 193 /* Liveness info. */
194
195 /* The registers that are modified within this in block. */
71caadc0 196 regset local_set;
997af237 197 /* The registers that are conditionally modified within this block.
198 In other words, registers that are set only as part of a
199 COND_EXEC. */
b2bbb655 200 regset cond_local_set;
997af237 201 /* The registers that are live on entry to this block.
202
203 Note that in SSA form, global_live_at_start does not reflect the
204 use of regs in phi functions, since the liveness of these regs
205 may depend on which edge was taken into the block. */
71caadc0 206 regset global_live_at_start;
997af237 207 /* The registers that are live on exit from this block. */
71caadc0 208 regset global_live_at_end;
f24e9d92 209
71caadc0 210 /* Auxiliary info specific to a pass. */
211 void *aux;
6207bd2c 212
b3d6de89 213 /* The index of this block. */
214 int index;
0e21c32a 215
7fa55aef 216 /* Previous and next blocks in the chain. */
217 struct basic_block_def *prev_bb, *next_bb;
218
df4b504c 219 /* The loop depth of this block. */
220 int loop_depth;
86d4af74 221
7fb12188 222 /* Outermost loop containing the block. */
223 struct loop *loop_father;
224
df4b504c 225 /* Expected number of executions: calculated in profile.c. */
63f23608 226 gcov_type count;
ddc63996 227
f81d9f78 228 /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */
229 int frequency;
a6a1b9be 230
231 /* Various flags. See BB_* below. */
232 int flags;
71caadc0 233} *basic_block;
ddc63996 234
f81d9f78 235#define BB_FREQ_MAX 10000
71caadc0 236
a6a1b9be 237/* Masks for basic_block.flags. */
308f9b79 238#define BB_DIRTY 1
239#define BB_NEW 2
240#define BB_REACHABLE 4
7fb12188 241#define BB_VISITED 8
a6a1b9be 242
71caadc0 243/* Number of basic blocks in the current function. */
244
b3d6de89 245extern int n_basic_blocks;
71caadc0 246
f20183e6 247/* First free basic block number. */
248
3c0a32c9 249extern int last_basic_block;
f20183e6 250
2d9b9dfe 251/* Number of edges in the current function. */
252
253extern int n_edges;
254
71caadc0 255/* Index by basic block number, get basic block struct info. */
256
257extern varray_type basic_block_info;
258
259#define BASIC_BLOCK(N) (VARRAY_BB (basic_block_info, (N)))
6207bd2c 260
7fa55aef 261/* For iterating over basic blocks. */
262#define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
263 for (BB = FROM; BB != TO; BB = BB->DIR)
264
265#define FOR_EACH_BB(BB) \
266 FOR_BB_BETWEEN (BB, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb)
267
268#define FOR_EACH_BB_REVERSE(BB) \
269 FOR_BB_BETWEEN (BB, EXIT_BLOCK_PTR->prev_bb, ENTRY_BLOCK_PTR, prev_bb)
270
cb5c5698 271/* Cycles through _all_ basic blocks, even the fake ones (entry and
272 exit block). */
273
274#define FOR_ALL_BB(BB) \
275 for (BB = ENTRY_BLOCK_PTR; BB; BB = BB->next_bb)
276
7e0b0820 277/* What registers are live at the setjmp call. */
278
279extern regset regs_live_at_setjmp;
280
65f34de5 281/* Special labels found during CFG build. */
282
7084e4fb 283extern GTY(()) rtx label_value_list;
284extern GTY(()) rtx tail_recursion_label_list;
65f34de5 285
286extern struct obstack flow_obstack;
287
6207bd2c 288/* Indexed by n, gives number of basic block that (REG n) is used in.
289 If the value is REG_BLOCK_GLOBAL (-2),
290 it means (REG n) is used in more than one basic block.
291 REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know.
292 This information remains valid for the rest of the compilation
293 of the current function; it is used to control register allocation. */
294
295#define REG_BLOCK_UNKNOWN -1
296#define REG_BLOCK_GLOBAL -2
394685a4 297
d6ff8d83 298#define REG_BASIC_BLOCK(N) (VARRAY_REG (reg_n_info, N)->basic_block)
61e82936 299\f
300/* Stuff for recording basic block info. */
301
71caadc0 302#define BLOCK_HEAD(B) (BASIC_BLOCK (B)->head)
303#define BLOCK_END(B) (BASIC_BLOCK (B)->end)
61e82936 304
fac55a46 305#define BLOCK_HEAD_TREE(B) (BASIC_BLOCK (B)->head_tree)
306#define BLOCK_END_TREE(B) (BASIC_BLOCK (B)->end_tree)
307
61e82936 308/* Special block numbers [markers] for entry and exit. */
309#define ENTRY_BLOCK (-1)
310#define EXIT_BLOCK (-2)
311
a7dce381 312/* Special block number not valid for any block. */
1deb248e 313#define INVALID_BLOCK (-3)
314
71caadc0 315/* Similarly, block pointers for the edge list. */
316extern struct basic_block_def entry_exit_blocks[2];
317#define ENTRY_BLOCK_PTR (&entry_exit_blocks[0])
318#define EXIT_BLOCK_PTR (&entry_exit_blocks[1])
319
b3d6de89 320#define BLOCK_NUM(INSN) (BLOCK_FOR_INSN (INSN)->index + 0)
ab87d1bc 321#define set_block_for_insn(INSN, BB) (BLOCK_FOR_INSN (INSN) = BB)
71caadc0 322
f23d9a22 323extern void compute_bb_for_insn PARAMS ((void));
9dda7915 324extern void free_bb_for_insn PARAMS ((void));
b7bef132 325extern void update_bb_for_insn PARAMS ((basic_block));
71caadc0 326
6bcfea9e 327extern void free_basic_block_vars PARAMS ((int));
9ed8bc90 328
b7bef132 329extern edge split_block PARAMS ((basic_block, rtx));
6bcfea9e 330extern basic_block split_edge PARAMS ((edge));
331extern void insert_insn_on_edge PARAMS ((rtx, edge));
fb20d6fa 332
6bcfea9e 333extern void commit_edge_insertions PARAMS ((void));
fb20d6fa 334extern void commit_edge_insertions_watch_calls PARAMS ((void));
335
6bcfea9e 336extern void remove_fake_edges PARAMS ((void));
337extern void add_noreturn_fake_exit_edges PARAMS ((void));
1deb248e 338extern void connect_infinite_loops_to_exit PARAMS ((void));
ddc63996 339extern int flow_call_edges_add PARAMS ((sbitmap));
7392df29 340extern edge cached_make_edge PARAMS ((sbitmap *, basic_block,
341 basic_block, int));
342extern edge make_edge PARAMS ((basic_block,
343 basic_block, int));
344extern edge make_single_succ_edge PARAMS ((basic_block,
2215ca0d 345 basic_block, int));
346extern void remove_edge PARAMS ((edge));
075d20cf 347extern void redirect_edge_succ PARAMS ((edge, basic_block));
3fc84d1a 348extern edge redirect_edge_succ_nodup PARAMS ((edge, basic_block));
075d20cf 349extern void redirect_edge_pred PARAMS ((edge, basic_block));
f23d9a22 350extern basic_block create_basic_block_structure PARAMS ((rtx, rtx, rtx, basic_block));
7fa55aef 351extern basic_block create_basic_block PARAMS ((rtx, rtx, basic_block));
44c85df1 352extern int flow_delete_block PARAMS ((basic_block));
8f8dcce4 353extern int flow_delete_block_noexpunge PARAMS ((basic_block));
308f9b79 354extern void clear_bb_flags PARAMS ((void));
a4c9602b 355extern void merge_blocks_nomove PARAMS ((basic_block, basic_block));
356extern void tidy_fallthru_edge PARAMS ((edge, basic_block,
357 basic_block));
65f34de5 358extern void tidy_fallthru_edges PARAMS ((void));
2f95707a 359extern void flow_reverse_top_sort_order_compute PARAMS ((int *));
fbb66919 360extern int flow_depth_first_order_compute PARAMS ((int *, int *));
9a6eb849 361extern void flow_preorder_transversal_compute PARAMS ((int *));
bdd4d9fc 362extern void dump_edge_info PARAMS ((FILE *, edge, int));
363extern void clear_edges PARAMS ((void));
364extern void mark_critical_edges PARAMS ((void));
8faa719f 365extern rtx first_insn_after_basic_block_note PARAMS ((basic_block));
fbb66919 366
89d75d78 367/* Dominator information for basic blocks. */
368
369typedef struct dominance_info *dominance_info;
370
a4d05baf 371/* Structure to hold information for each natural loop. */
372struct loop
373{
2d48cabb 374 /* Index into loops array. */
a4d05baf 375 int num;
376
377 /* Basic block of loop header. */
378 basic_block header;
379
380 /* Basic block of loop latch. */
381 basic_block latch;
382
383 /* Basic block of loop pre-header or NULL if it does not exist. */
384 basic_block pre_header;
385
ddc63996 386 /* Array of edges along the pre-header extended basic block trace.
1f080ed5 387 The source of the first edge is the root node of pre-header
388 extended basic block, if it exists. */
389 edge *pre_header_edges;
0ed5c697 390
1f080ed5 391 /* Number of edges along the pre_header extended basic block trace. */
392 int num_pre_header_edges;
0ed5c697 393
7fcadf62 394 /* The first block in the loop. This is not necessarily the same as
395 the loop header. */
396 basic_block first;
397
398 /* The last block in the loop. This is not necessarily the same as
399 the loop latch. */
400 basic_block last;
401
a4d05baf 402 /* Bitmap of blocks contained within the loop. */
403 sbitmap nodes;
404
405 /* Number of blocks contained within the loop. */
406 int num_nodes;
407
4076d5a5 408 /* Array of edges that enter the loop. */
409 edge *entry_edges;
410
411 /* Number of edges that enter the loop. */
412 int num_entries;
413
a4d05baf 414 /* Array of edges that exit the loop. */
4076d5a5 415 edge *exit_edges;
a4d05baf 416
417 /* Number of edges that exit the loop. */
418 int num_exits;
419
0ed5c697 420 /* Bitmap of blocks that dominate all exits of the loop. */
421 sbitmap exits_doms;
422
a4d05baf 423 /* The loop nesting depth. */
424 int depth;
425
7fb12188 426 /* Superloops of the loop. */
427 struct loop **pred;
428
a4d05baf 429 /* The height of the loop (enclosed loop levels) within the loop
430 hierarchy tree. */
431 int level;
432
433 /* The outer (parent) loop or NULL if outermost loop. */
434 struct loop *outer;
435
436 /* The first inner (child) loop or NULL if innermost loop. */
437 struct loop *inner;
438
439 /* Link to the next (sibling) loop. */
440 struct loop *next;
441
d10cfa8d 442 /* Nonzero if the loop is invalid (e.g., contains setjmp.). */
a4d05baf 443 int invalid;
444
445 /* Auxiliary info specific to a pass. */
7bc9de79 446 void *aux;
ec7d7ef9 447
448 /* The following are currently used by loop.c but they are likely to
449 disappear as loop.c is converted to use the CFG. */
450
d10cfa8d 451 /* Nonzero if the loop has a NOTE_INSN_LOOP_VTOP. */
ec7d7ef9 452 rtx vtop;
453
d10cfa8d 454 /* Nonzero if the loop has a NOTE_INSN_LOOP_CONT.
ec7d7ef9 455 A continue statement will generate a branch to NEXT_INSN (cont). */
456 rtx cont;
457
ec7d7ef9 458 /* The NOTE_INSN_LOOP_BEG. */
459 rtx start;
460
461 /* The NOTE_INSN_LOOP_END. */
462 rtx end;
463
464 /* For a rotated loop that is entered near the bottom,
465 this is the label at the top. Otherwise it is zero. */
466 rtx top;
467
468 /* Place in the loop where control enters. */
469 rtx scan_start;
470
89e8d34f 471 /* The position where to sink insns out of the loop. */
472 rtx sink;
473
ec7d7ef9 474 /* List of all LABEL_REFs which refer to code labels outside the
475 loop. Used by routines that need to know all loop exits, such as
476 final_biv_value and final_giv_value.
ddc63996 477
ec7d7ef9 478 This does not include loop exits due to return instructions.
479 This is because all bivs and givs are pseudos, and hence must be
480 dead after a return, so the presense of a return does not affect
481 any of the optimizations that use this info. It is simpler to
482 just not include return instructions on this list. */
483 rtx exit_labels;
484
485 /* The number of LABEL_REFs on exit_labels for this loop and all
486 loops nested inside it. */
487 int exit_count;
a4d05baf 488};
489
490
491/* Structure to hold CFG information about natural loops within a function. */
492struct loops
493{
494 /* Number of natural loops in the function. */
495 int num;
496
8c567f7b 497 /* Maxium nested loop level in the function. */
498 int levels;
499
a4d05baf 500 /* Array of natural loop descriptors (scanning this array in reverse order
501 will find the inner loops before their enclosing outer loops). */
502 struct loop *array;
503
7fb12188 504 /* The above array is unused in new loop infrastructure and is kept only for
505 purposes of the old loop optimizer. Instead we store just pointers to
506 loops here. */
507 struct loop **parray;
508
a4d05baf 509 /* Pointer to root of loop heirachy tree. */
fac55a46 510 struct loop *tree_root;
a4d05baf 511
512 /* Information derived from the CFG. */
513 struct cfg
514 {
515 /* The bitmap vector of dominators or NULL if not computed. */
89d75d78 516 dominance_info dom;
a4d05baf 517
518 /* The ordering of the basic blocks in a depth first search. */
519 int *dfs_order;
2d48cabb 520
521 /* The reverse completion ordering of the basic blocks found in a
522 depth first search. */
523 int *rc_order;
a4d05baf 524 } cfg;
525
526 /* Headers shared by multiple loops that should be merged. */
527 sbitmap shared_headers;
528};
529
1d855d4c 530/* Structure to group all of the information to process IF-THEN and
531 IF-THEN-ELSE blocks for the conditional execution support. This
532 needs to be in a public file in case the IFCVT macros call
533 functions passing the ce_if_block data structure. */
534
535typedef struct ce_if_block
536{
537 basic_block test_bb; /* First test block. */
538 basic_block then_bb; /* THEN block. */
539 basic_block else_bb; /* ELSE block or NULL. */
540 basic_block join_bb; /* Join THEN/ELSE blocks. */
541 basic_block last_test_bb; /* Last bb to hold && or || tests. */
542 int num_multiple_test_blocks; /* # of && and || basic blocks. */
543 int num_and_and_blocks; /* # of && blocks. */
544 int num_or_or_blocks; /* # of || blocks. */
545 int num_multiple_test_insns; /* # of insns in && and || blocks. */
546 int and_and_p; /* Complex test is &&. */
547 int num_then_insns; /* # of insns in THEN block. */
548 int num_else_insns; /* # of insns in ELSE block. */
549 int pass; /* Pass number. */
550
551#ifdef IFCVT_EXTRA_FIELDS
552 IFCVT_EXTRA_FIELDS /* Any machine dependent fields. */
553#endif
554
555} ce_if_block_t;
556
0ed5c697 557extern int flow_loops_find PARAMS ((struct loops *, int flags));
558extern int flow_loops_update PARAMS ((struct loops *, int flags));
6bcfea9e 559extern void flow_loops_free PARAMS ((struct loops *));
0437fa92 560extern void flow_loops_dump PARAMS ((const struct loops *, FILE *,
561 void (*)(const struct loop *,
562 FILE *, int), int));
563extern void flow_loop_dump PARAMS ((const struct loop *, FILE *,
564 void (*)(const struct loop *,
565 FILE *, int), int));
7cf5d853 566extern int flow_loop_scan PARAMS ((struct loops *, struct loop *, int));
7fb12188 567extern void flow_loop_tree_node_add PARAMS ((struct loop *, struct loop *));
568extern void flow_loop_tree_node_remove PARAMS ((struct loop *));
a4d05baf 569
26d63a15 570/* This structure maintains an edge list vector. */
ddc63996 571struct edge_list
26d63a15 572{
573 int num_blocks;
574 int num_edges;
575 edge *index_to_edge;
576};
577
578/* This is the value which indicates no edge is present. */
579#define EDGE_INDEX_NO_EDGE -1
580
581/* EDGE_INDEX returns an integer index for an edge, or EDGE_INDEX_NO_EDGE
582 if there is no edge between the 2 basic blocks. */
583#define EDGE_INDEX(el, pred, succ) (find_edge_index ((el), (pred), (succ)))
584
585/* INDEX_EDGE_PRED_BB and INDEX_EDGE_SUCC_BB return a pointer to the basic
586 block which is either the pred or succ end of the indexed edge. */
587#define INDEX_EDGE_PRED_BB(el, index) ((el)->index_to_edge[(index)]->src)
588#define INDEX_EDGE_SUCC_BB(el, index) ((el)->index_to_edge[(index)]->dest)
589
590/* INDEX_EDGE returns a pointer to the edge. */
591#define INDEX_EDGE(el, index) ((el)->index_to_edge[(index)])
592
593/* Number of edges in the compressed edge list. */
594#define NUM_EDGES(el) ((el)->num_edges)
595
b1e17e10 596/* BB is assumed to contain conditional jump. Return the fallthru edge. */
597#define FALLTHRU_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
598 ? (bb)->succ : (bb)->succ->succ_next)
599
600/* BB is assumed to contain conditional jump. Return the branch edge. */
601#define BRANCH_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
602 ? (bb)->succ->succ_next : (bb)->succ)
603
eb429644 604/* Return expected execution frequency of the edge E. */
605#define EDGE_FREQUENCY(e) (((e)->src->frequency \
606 * (e)->probability \
607 + REG_BR_PROB_BASE / 2) \
608 / REG_BR_PROB_BASE)
609
e76f35e8 610/* Return nonzero if edge is critical. */
611#define EDGE_CRITICAL_P(e) ((e)->src->succ->succ_next \
612 && (e)->dest->pred->pred_next)
613
6bcfea9e 614struct edge_list * create_edge_list PARAMS ((void));
615void free_edge_list PARAMS ((struct edge_list *));
616void print_edge_list PARAMS ((FILE *, struct edge_list *));
617void verify_edge_list PARAMS ((FILE *, struct edge_list *));
ddc63996 618int find_edge_index PARAMS ((struct edge_list *,
6bcfea9e 619 basic_block, basic_block));
26d63a15 620
def93098 621
2d9b9dfe 622enum update_life_extent
623{
091291bb 624 UPDATE_LIFE_LOCAL = 0,
625 UPDATE_LIFE_GLOBAL = 1,
2341252e 626 UPDATE_LIFE_GLOBAL_RM_NOTES = 2
2d9b9dfe 627};
628
def93098 629/* Flags for life_analysis and update_life_info. */
630
631#define PROP_DEATH_NOTES 1 /* Create DEAD and UNUSED notes. */
632#define PROP_LOG_LINKS 2 /* Create LOG_LINKS. */
633#define PROP_REG_INFO 4 /* Update regs_ever_live et al. */
634#define PROP_KILL_DEAD_CODE 8 /* Remove dead code. */
635#define PROP_SCAN_DEAD_CODE 16 /* Scan for dead code. */
b3916f0e 636#define PROP_ALLOW_CFG_CHANGES 32 /* Allow the CFG to be changed
637 by dead code removal. */
638#define PROP_AUTOINC 64 /* Create autoinc mem references. */
992c7138 639#define PROP_EQUAL_NOTES 128 /* Take into account REG_EQUAL notes. */
2d30935d 640#define PROP_SCAN_DEAD_STORES 256 /* Scan for dead code. */
641#define PROP_FINAL (PROP_DEATH_NOTES | PROP_LOG_LINKS \
642 | PROP_REG_INFO | PROP_KILL_DEAD_CODE \
643 | PROP_SCAN_DEAD_CODE | PROP_AUTOINC \
644 | PROP_ALLOW_CFG_CHANGES \
645 | PROP_SCAN_DEAD_STORES)
0ed5c697 646
a0d79d69 647#define CLEANUP_EXPENSIVE 1 /* Do relativly expensive optimizations
648 except for edge forwarding */
649#define CLEANUP_CROSSJUMP 2 /* Do crossjumping. */
650#define CLEANUP_POST_REGSTACK 4 /* We run after reg-stack and need
651 to care REG_DEAD notes. */
6d866f03 652#define CLEANUP_PRE_SIBCALL 8 /* Do not get confused by code hidden
653 inside call_placeholders.. */
4d1f4307 654#define CLEANUP_PRE_LOOP 16 /* Take care to preserve syntactic loop
655 notes. */
33dbe4d1 656#define CLEANUP_UPDATE_LIFE 32 /* Keep life information up to date. */
8cd78fca 657#define CLEANUP_THREADING 64 /* Do jump threading. */
43a852ea 658#define CLEANUP_NO_INSN_DEL 128 /* Do not try to delete trivially dead
659 insns. */
0ed5c697 660/* Flags for loop discovery. */
661
ddc63996 662#define LOOP_TREE 1 /* Build loop hierarchy tree. */
0ed5c697 663#define LOOP_PRE_HEADER 2 /* Analyse loop pre-header. */
ddc63996 664#define LOOP_ENTRY_EDGES 4 /* Find entry edges. */
665#define LOOP_EXIT_EDGES 8 /* Find exit edges. */
7cf5d853 666#define LOOP_EDGES (LOOP_ENTRY_EDGES | LOOP_EXIT_EDGES)
7fb12188 667#define LOOP_ALL 15 /* All of the above */
0ed5c697 668
dafa7856 669extern void life_analysis PARAMS ((rtx, FILE *, int));
fb20d6fa 670extern int update_life_info PARAMS ((sbitmap, enum update_life_extent,
6bcfea9e 671 int));
fb20d6fa 672extern int update_life_info_in_dirty_blocks PARAMS ((enum update_life_extent,
308f9b79 673 int));
6bcfea9e 674extern int count_or_remove_death_notes PARAMS ((sbitmap, int));
b3916f0e 675extern int propagate_block PARAMS ((basic_block, regset, regset, regset,
b2bbb655 676 int));
def3c3e4 677
678struct propagate_block_info;
679extern rtx propagate_one_insn PARAMS ((struct propagate_block_info *, rtx));
680extern struct propagate_block_info *init_propagate_block_info
b2bbb655 681 PARAMS ((basic_block, regset, regset, regset, int));
def3c3e4 682extern void free_propagate_block_info PARAMS ((struct propagate_block_info *));
2d9b9dfe 683
cd67b55d 684/* In lcm.c */
ddc63996 685extern struct edge_list *pre_edge_lcm PARAMS ((FILE *, int, sbitmap *,
686 sbitmap *, sbitmap *,
6bcfea9e 687 sbitmap *, sbitmap **,
688 sbitmap **));
689extern struct edge_list *pre_edge_rev_lcm PARAMS ((FILE *, int, sbitmap *,
ddc63996 690 sbitmap *, sbitmap *,
691 sbitmap *, sbitmap **,
6bcfea9e 692 sbitmap **));
693extern void compute_available PARAMS ((sbitmap *, sbitmap *,
694 sbitmap *, sbitmap *));
b78e14a8 695extern int optimize_mode_switching PARAMS ((FILE *));
f3d96a58 696
697/* In emit-rtl.c. */
6bcfea9e 698extern rtx emit_block_insn_after PARAMS ((rtx, rtx, basic_block));
699extern rtx emit_block_insn_before PARAMS ((rtx, rtx, basic_block));
a4d05baf 700
59423b59 701/* In predict.c */
702extern void estimate_probability PARAMS ((struct loops *));
cd0fe062 703extern void note_prediction_to_br_prob PARAMS ((void));
89cfe6e5 704extern void expected_value_to_br_prob PARAMS ((void));
429fa7fa 705extern void note_prediction_to_br_prob PARAMS ((void));
706extern bool maybe_hot_bb_p PARAMS ((basic_block));
707extern bool probably_cold_bb_p PARAMS ((basic_block));
708extern bool probably_never_executed_bb_p PARAMS ((basic_block));
59423b59 709
5a88ea64 710/* In flow.c */
d7c47c0e 711extern void init_flow PARAMS ((void));
5a88ea64 712extern void reorder_basic_blocks PARAMS ((void));
04ca77c8 713extern void dump_bb PARAMS ((basic_block, FILE *));
714extern void debug_bb PARAMS ((basic_block));
715extern void debug_bb_n PARAMS ((int));
716extern void dump_regset PARAMS ((regset, FILE *));
717extern void debug_regset PARAMS ((regset));
d7c47c0e 718extern void allocate_reg_life_data PARAMS ((void));
39aa2b16 719extern void allocate_bb_life_data PARAMS ((void));
2e70428c 720extern void expunge_block PARAMS ((basic_block));
7fa55aef 721extern void link_block PARAMS ((basic_block, basic_block));
722extern void unlink_block PARAMS ((basic_block));
3c0a32c9 723extern void compact_blocks PARAMS ((void));
b36d64df 724extern basic_block alloc_block PARAMS ((void));
c6c8ab23 725extern void find_unreachable_blocks PARAMS ((void));
fb20d6fa 726extern int delete_noop_moves PARAMS ((rtx));
3cd757b1 727extern basic_block redirect_edge_and_branch_force PARAMS ((edge, basic_block));
e76f35e8 728extern basic_block force_nonfallthru PARAMS ((edge));
3cd757b1 729extern bool redirect_edge_and_branch PARAMS ((edge, basic_block));
730extern rtx block_label PARAMS ((basic_block));
731extern bool forwarder_block_p PARAMS ((basic_block));
4be4a8ea 732extern bool purge_all_dead_edges PARAMS ((int));
7a577715 733extern bool purge_dead_edges PARAMS ((basic_block));
b08cd584 734extern void find_sub_basic_blocks PARAMS ((basic_block));
9645fa4f 735extern void find_many_sub_basic_blocks PARAMS ((sbitmap));
65f34de5 736extern bool can_fallthru PARAMS ((basic_block, basic_block));
737extern void flow_nodes_print PARAMS ((const char *, const sbitmap,
738 FILE *));
739extern void flow_edge_list_print PARAMS ((const char *, const edge *,
740 int, FILE *));
b36d64df 741extern void alloc_aux_for_block PARAMS ((basic_block, int));
742extern void alloc_aux_for_blocks PARAMS ((int));
82f7392b 743extern void clear_aux_for_blocks PARAMS ((void));
b36d64df 744extern void free_aux_for_blocks PARAMS ((void));
745extern void alloc_aux_for_edge PARAMS ((edge, int));
746extern void alloc_aux_for_edges PARAMS ((int));
82f7392b 747extern void clear_aux_for_edges PARAMS ((void));
b36d64df 748extern void free_aux_for_edges PARAMS ((void));
5a88ea64 749
4c63f34f 750/* This function is always defined so it can be called from the
751 debugger, and it is declared extern so we don't get warnings about
a7dce381 752 it being unused. */
4c63f34f 753extern void verify_flow_info PARAMS ((void));
7fb12188 754extern bool flow_loop_outside_edge_p PARAMS ((const struct loop *, edge));
755extern bool flow_loop_nested_p PARAMS ((const struct loop *, const struct loop *));
756extern bool flow_bb_inside_loop_p PARAMS ((const struct loop *, basic_block));
757extern basic_block *get_loop_body PARAMS ((const struct loop *));
758extern int dfs_enumerate_from PARAMS ((basic_block, int,
759 bool (*)(basic_block, void *),
760 basic_block *, int, void *));
761
762extern edge loop_preheader_edge PARAMS ((struct loop *));
763extern edge loop_latch_edge PARAMS ((struct loop *));
764
765extern void add_bb_to_loop PARAMS ((basic_block, struct loop *));
766extern void remove_bb_from_loops PARAMS ((basic_block));
767extern struct loop * find_common_loop PARAMS ((struct loop *, struct loop *));
768
769extern void verify_loop_structure PARAMS ((struct loops *, int));
770#define VLS_EXPECT_PREHEADERS 1
771#define VLS_EXPECT_SIMPLE_LATCHES 2
4c63f34f 772
8a5b87ad 773typedef struct conflict_graph_def *conflict_graph;
774
775/* Callback function when enumerating conflicts. The arguments are
776 the smaller and larger regno in the conflict. Returns zero if
d10cfa8d 777 enumeration is to continue, nonzero to halt enumeration. */
cd13e750 778typedef int (*conflict_graph_enum_fn) PARAMS ((int, int, void *));
8a5b87ad 779
780
781/* Prototypes of operations on conflict graphs. */
782
ddc63996 783extern conflict_graph conflict_graph_new
8a5b87ad 784 PARAMS ((int));
785extern void conflict_graph_delete PARAMS ((conflict_graph));
ddc63996 786extern int conflict_graph_add PARAMS ((conflict_graph,
8a5b87ad 787 int, int));
ddc63996 788extern int conflict_graph_conflict_p PARAMS ((conflict_graph,
8a5b87ad 789 int, int));
ddc63996 790extern void conflict_graph_enum PARAMS ((conflict_graph, int,
791 conflict_graph_enum_fn,
8a5b87ad 792 void *));
793extern void conflict_graph_merge_regs PARAMS ((conflict_graph, int,
794 int));
795extern void conflict_graph_print PARAMS ((conflict_graph, FILE*));
ddc63996 796extern conflict_graph conflict_graph_compute
8a5b87ad 797 PARAMS ((regset,
798 partition));
ecb7b891 799extern bool mark_dfs_back_edges PARAMS ((void));
4c69d9cb 800extern void set_edge_can_fallthru_flag PARAMS ((void));
f884e43f 801extern void update_br_prob_note PARAMS ((basic_block));
17a54dac 802extern void fixup_abnormal_edges PARAMS ((void));
fa3cb24d 803extern bool can_hoist_insn_p PARAMS ((rtx, rtx, regset));
804extern rtx hoist_insn_after PARAMS ((rtx, rtx, rtx, rtx));
805extern rtx hoist_insn_to_edge PARAMS ((rtx, edge, rtx, rtx));
5a88ea64 806
4794f989 807/* In dominance.c */
808
809enum cdi_direction
810{
811 CDI_DOMINATORS,
812 CDI_POST_DOMINATORS
813};
814
89d75d78 815extern dominance_info calculate_dominance_info PARAMS ((enum cdi_direction));
816extern void free_dominance_info PARAMS ((dominance_info));
817extern basic_block nearest_common_dominator PARAMS ((dominance_info,
818 basic_block, basic_block));
819extern void set_immediate_dominator PARAMS ((dominance_info,
820 basic_block, basic_block));
821extern basic_block get_immediate_dominator PARAMS ((dominance_info,
822 basic_block));
823extern bool dominated_by_p PARAMS ((dominance_info, basic_block, basic_block));
824extern int get_dominated_by PARAMS ((dominance_info, basic_block, basic_block **));
825extern void add_to_dominance_info PARAMS ((dominance_info, basic_block));
826extern void delete_from_dominance_info PARAMS ((dominance_info, basic_block));
827basic_block recount_dominator PARAMS ((dominance_info, basic_block));
828extern void redirect_immediate_dominators PARAMS ((dominance_info, basic_block,
829 basic_block));
830void iterate_fix_dominators PARAMS ((dominance_info, basic_block *, int));
831extern void verify_dominators PARAMS ((dominance_info));
2a281353 832#endif /* GCC_BASIC_BLOCK_H */