]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/basic-block.h
* gnu/java/net/natPlainSocketImplPosix.cc
[thirdparty/gcc.git] / gcc / basic-block.h
CommitLineData
6207bd2c 1/* Define control and data flow tables, and regsets.
a8349c62 2 Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
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"
a45624d0 29#include "hard-reg-set.h"
4ee9c684 30#include "predict.h"
cd665a06 31#include "vec.h"
32#include "errors.h"
7e0b0820 33
7872b193 34/* Head of register set linked list. */
35typedef bitmap_head regset_head;
4ee9c684 36
7872b193 37/* A pointer to a regset_head. */
38typedef bitmap regset;
39
40/* Initialize a new regset. */
1f3233d1 41#define INIT_REG_SET(HEAD) bitmap_initialize (HEAD, 1)
7e0b0820 42
43/* Clear a register set by freeing up the linked list. */
44#define CLEAR_REG_SET(HEAD) bitmap_clear (HEAD)
45
46/* Copy a register set to another register set. */
47#define COPY_REG_SET(TO, FROM) bitmap_copy (TO, FROM)
48
2d9b9dfe 49/* Compare two register sets. */
50#define REG_SET_EQUAL_P(A, B) bitmap_equal_p (A, B)
51
7e0b0820 52/* `and' a register set with a second register set. */
53#define AND_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_AND)
54
55/* `and' the complement of a register set with a register set. */
56#define AND_COMPL_REG_SET(TO, FROM) \
57 bitmap_operation (TO, TO, FROM, BITMAP_AND_COMPL)
58
59/* Inclusive or a register set with a second register set. */
60#define IOR_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_IOR)
61
2d9b9dfe 62/* Exclusive or a register set with a second register set. */
63#define XOR_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_XOR)
64
7e0b0820 65/* Or into TO the register set FROM1 `and'ed with the complement of FROM2. */
66#define IOR_AND_COMPL_REG_SET(TO, FROM1, FROM2) \
67 bitmap_ior_and_compl (TO, FROM1, FROM2)
74666a14 68
69/* Clear a single register in a register set. */
7e0b0820 70#define CLEAR_REGNO_REG_SET(HEAD, REG) bitmap_clear_bit (HEAD, REG)
74666a14 71
72/* Set a single register in a register set. */
7e0b0820 73#define SET_REGNO_REG_SET(HEAD, REG) bitmap_set_bit (HEAD, REG)
74666a14 74
75/* Return true if a register is set in a register set. */
7e0b0820 76#define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG)
74666a14 77
78/* Copy the hard registers in a register set to the hard register set. */
5a2784f8 79extern void reg_set_to_hard_reg_set (HARD_REG_SET *, bitmap);
74666a14 80#define REG_SET_TO_HARD_REG_SET(TO, FROM) \
81do { \
74666a14 82 CLEAR_HARD_REG_SET (TO); \
d6cb6164 83 reg_set_to_hard_reg_set (&TO, FROM); \
74666a14 84} while (0)
85
8c97cf13 86typedef bitmap_iterator reg_set_iterator;
87
74666a14 88/* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the
a7dce381 89 register number and executing CODE for all registers that are set. */
8c97cf13 90#define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, RSI) \
91 EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, RSI)
74666a14 92
93/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
94 REGNUM to the register number and executing CODE for all registers that are
a7dce381 95 set in the first regset and not set in the second. */
8c97cf13 96#define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET, MIN, REGNUM, RSI) \
97 EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET, MIN, REGNUM, RSI)
74666a14 98
23ec99a1 99/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
100 REGNUM to the register number and executing CODE for all registers that are
a7dce381 101 set in both regsets. */
8c97cf13 102#define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, RSI) \
103 EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, RSI) \
23ec99a1 104
74666a14 105/* Allocate a register set with oballoc. */
7e0b0820 106#define OBSTACK_ALLOC_REG_SET(OBSTACK) BITMAP_OBSTACK_ALLOC (OBSTACK)
74666a14 107
3367fbd0 108/* Initialize a register set. Returns the new register set. */
1f3233d1 109#define INITIALIZE_REG_SET(HEAD) bitmap_initialize (&HEAD, 1)
7e0b0820 110
111/* Do any cleanup needed on a regset when it is no longer used. */
112#define FREE_REG_SET(REGSET) BITMAP_FREE(REGSET)
113
114/* Do any one-time initializations needed for regsets. */
115#define INIT_ONCE_REG_SET() BITMAP_INIT_ONCE ()
116
117/* Grow any tables needed when the number of registers is calculated
118 or extended. For the linked list allocation, nothing needs to
119 be done, other than zero the statistics on the first allocation. */
ddc63996 120#define MAX_REGNO_REG_SET(NUM_REGS, NEW_P, RENUMBER_P)
74666a14 121
805e22b2 122/* Type we use to hold basic block counters. Should be at least
123 64bit. Although a counter cannot be negative, we use a signed
124 type, because erroneous negative counts can be generated when the
125 flow graph is manipulated by various optimizations. A signed type
6a8fa8e2 126 makes those easy to detect. */
63f23608 127typedef HOST_WIDEST_INT gcov_type;
128
71caadc0 129/* Control flow edge information. */
cd665a06 130struct edge_def GTY(())
4ee9c684 131{
71caadc0 132 /* The two blocks at the ends of the edge. */
4ee9c684 133 struct basic_block_def *src;
134 struct basic_block_def *dest;
71caadc0 135
136 /* Instructions queued on the edge. */
4ee9c684 137 union edge_def_insns {
138 rtx GTY ((tag ("0"))) r;
139 tree GTY ((tag ("1"))) t;
140 } GTY ((desc ("ir_type ()"))) insns;
71caadc0 141
142 /* Auxiliary info specific to a pass. */
4ee9c684 143 PTR GTY ((skip (""))) aux;
6207bd2c 144
815540dd 145 /* Location of any goto implicit in the edge, during tree-ssa. */
9a6486a6 146 source_locus goto_locus;
815540dd 147
71caadc0 148 int flags; /* see EDGE_* below */
149 int probability; /* biased by REG_BR_PROB_BASE */
63f23608 150 gcov_type count; /* Expected number of executions calculated
86d4af74 151 in profile.c */
4ee9c684 152};
153
154typedef struct edge_def *edge;
cd665a06 155DEF_VEC_GC_P(edge);
6207bd2c 156
958c14b1 157#define EDGE_FALLTHRU 1 /* 'Straight line' flow */
158#define EDGE_ABNORMAL 2 /* Strange flow, like computed
159 label, or eh */
160#define EDGE_ABNORMAL_CALL 4 /* Call with abnormal exit
161 like an exception, or sibcall */
162#define EDGE_EH 8 /* Exception throw */
163#define EDGE_FAKE 16 /* Not a real edge (profile.c) */
164#define EDGE_DFS_BACK 32 /* A backwards edge */
165#define EDGE_CAN_FALLTHRU 64 /* Candidate for straight line
7299020b 166 flow. */
a5414ff5 167#define EDGE_IRREDUCIBLE_LOOP 128 /* Part of irreducible loop. */
bf4311e9 168#define EDGE_SIBCALL 256 /* Edge from sibcall to exit. */
7f42fe24 169#define EDGE_LOOP_EXIT 512 /* Exit of a loop. */
4ee9c684 170#define EDGE_TRUE_VALUE 1024 /* Edge taken when controlling
c26a6416 171 predicate is nonzero. */
4ee9c684 172#define EDGE_FALSE_VALUE 2048 /* Edge taken when controlling
173 predicate is zero. */
174#define EDGE_EXECUTABLE 4096 /* Edge is executable. Only
175 valid during SSA-CCP. */
9858d888 176#define EDGE_CROSSING 8192 /* Edge crosses between hot
177 and cold sections, when we
178 do partitioning. */
179#define EDGE_ALL_FLAGS 16383
6207bd2c 180
2102d800 181#define EDGE_COMPLEX (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
182
ab6a34f2 183/* Counter summary from the last set of coverage counts read by
6473f3f4 184 profile.c. */
ab6a34f2 185extern const struct gcov_ctr_summary *profile_info;
186
862be747 187/* Declared in cfgloop.h. */
188struct loop;
189struct loops;
6207bd2c 190
4ee9c684 191/* Declared in tree-flow.h. */
192struct bb_ann_d;
193
997af237 194/* A basic block is a sequence of instructions with only entry and
195 only one exit. If any one of the instructions are executed, they
196 will all be executed, and in sequence from first to last.
197
198 There may be COND_EXEC instructions in the basic block. The
199 COND_EXEC *instructions* will be executed -- but if the condition
200 is false the conditionally executed *expressions* will of course
201 not be executed. We don't consider the conditionally executed
202 expression (which might have side-effects) to be in a separate
203 basic block because the program counter will always be at the same
204 location after the COND_EXEC instruction, regardless of whether the
205 condition is true or not.
206
207 Basic blocks need not start with a label nor end with a jump insn.
1deb248e 208 For example, a previous basic block may just "conditionally fall"
209 into the succeeding basic block, and the last basic block need not
210 end with a jump insn. Block 0 is a descendant of the entry block.
211
212 A basic block beginning with two labels cannot have notes between
213 the labels.
214
215 Data for jump tables are stored in jump_insns that occur in no
216 basic block even though these insns can follow or precede insns in
217 basic blocks. */
218
71caadc0 219/* Basic block information indexed by block number. */
4ee9c684 220struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb")))
221{
71caadc0 222 /* The first and last insns of the block. */
4ee9c684 223 rtx head_;
224 rtx end_;
6207bd2c 225
4ee9c684 226 /* Pointers to the first and last trees of the block. */
227 tree stmt_list;
fac55a46 228
71caadc0 229 /* The edges into and out of the block. */
cd665a06 230 VEC(edge) *preds;
231 VEC(edge) *succs;
f24e9d92 232
997af237 233 /* Liveness info. */
234
235 /* The registers that are modified within this in block. */
4ee9c684 236 bitmap GTY ((skip (""))) local_set;
997af237 237 /* The registers that are conditionally modified within this block.
238 In other words, registers that are set only as part of a
239 COND_EXEC. */
4ee9c684 240 bitmap GTY ((skip (""))) cond_local_set;
997af237 241 /* The registers that are live on entry to this block.
242
243 Note that in SSA form, global_live_at_start does not reflect the
244 use of regs in phi functions, since the liveness of these regs
245 may depend on which edge was taken into the block. */
4ee9c684 246 bitmap GTY ((skip (""))) global_live_at_start;
997af237 247 /* The registers that are live on exit from this block. */
4ee9c684 248 bitmap GTY ((skip (""))) global_live_at_end;
f24e9d92 249
71caadc0 250 /* Auxiliary info specific to a pass. */
4ee9c684 251 PTR GTY ((skip (""))) aux;
6207bd2c 252
7562ed74 253 /* Innermost loop containing the block. */
254 struct loop * GTY ((skip (""))) loop_father;
255
256 /* The dominance and postdominance information node. */
257 struct et_node * GTY ((skip (""))) dom[2];
0e21c32a 258
7fa55aef 259 /* Previous and next blocks in the chain. */
4ee9c684 260 struct basic_block_def *prev_bb;
261 struct basic_block_def *next_bb;
7fa55aef 262
7562ed74 263 /* The data used by basic block copying and reordering functions. */
264 struct reorder_block_def * GTY ((skip (""))) rbi;
7fb12188 265
7562ed74 266 /* Annotations used at the tree level. */
267 struct bb_ann_d *tree_annotations;
0051c76a 268
df4b504c 269 /* Expected number of executions: calculated in profile.c. */
63f23608 270 gcov_type count;
ddc63996 271
7562ed74 272 /* The index of this block. */
273 int index;
274
275 /* The loop depth of this block. */
276 int loop_depth;
277
f81d9f78 278 /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */
279 int frequency;
a6a1b9be 280
281 /* Various flags. See BB_* below. */
282 int flags;
4ee9c684 283};
284
285typedef struct basic_block_def *basic_block;
286
287/* Structure to hold information about the blocks during reordering and
288 copying. */
289
290typedef struct reorder_block_def
291{
292 rtx header;
293 rtx footer;
294 basic_block next;
295 basic_block original;
296 /* Used by loop copying. */
297 basic_block copy;
298 int duplicated;
a9989fb4 299 int copy_number;
4ee9c684 300
301 /* These fields are used by bb-reorder pass. */
302 int visited;
4fd61bc6 303} *reorder_block_def_p;
ddc63996 304
f81d9f78 305#define BB_FREQ_MAX 10000
71caadc0 306
a6a1b9be 307/* Masks for basic_block.flags. */
308f9b79 308#define BB_DIRTY 1
309#define BB_NEW 2
310#define BB_REACHABLE 4
7fb12188 311#define BB_VISITED 8
862be747 312#define BB_IRREDUCIBLE_LOOP 16
313#define BB_SUPERBLOCK 32
7562ed74 314#define BB_DISABLE_SCHEDULE 64
315
316#define BB_HOT_PARTITION 128
317#define BB_COLD_PARTITION 256
318#define BB_UNPARTITIONED 0
a6a1b9be 319
4f18499c 320/* Partitions, to be used when partitioning hot and cold basic blocks into
321 separate sections. */
7562ed74 322#define BB_PARTITION(bb) ((bb)->flags & (BB_HOT_PARTITION|BB_COLD_PARTITION))
91ef7ecb 323#define BB_SET_PARTITION(bb, part) do { \
324 basic_block bb_ = (bb); \
325 bb_->flags = ((bb_->flags & ~(BB_HOT_PARTITION|BB_COLD_PARTITION)) \
326 | (part)); \
327} while (0)
328
7562ed74 329#define BB_COPY_PARTITION(dstbb, srcbb) \
330 BB_SET_PARTITION (dstbb, BB_PARTITION (srcbb))
4f18499c 331
71caadc0 332/* Number of basic blocks in the current function. */
333
b3d6de89 334extern int n_basic_blocks;
71caadc0 335
f20183e6 336/* First free basic block number. */
337
3c0a32c9 338extern int last_basic_block;
f20183e6 339
2d9b9dfe 340/* Number of edges in the current function. */
341
342extern int n_edges;
343
020c749b 344/* Signalize the status of profile information in the CFG. */
345extern enum profile_status
346{
347 PROFILE_ABSENT,
348 PROFILE_GUESSED,
349 PROFILE_READ
350} profile_status;
351
71caadc0 352/* Index by basic block number, get basic block struct info. */
353
4ee9c684 354extern GTY(()) varray_type basic_block_info;
71caadc0 355
356#define BASIC_BLOCK(N) (VARRAY_BB (basic_block_info, (N)))
6207bd2c 357
7fa55aef 358/* For iterating over basic blocks. */
359#define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
360 for (BB = FROM; BB != TO; BB = BB->DIR)
361
362#define FOR_EACH_BB(BB) \
363 FOR_BB_BETWEEN (BB, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb)
364
365#define FOR_EACH_BB_REVERSE(BB) \
366 FOR_BB_BETWEEN (BB, EXIT_BLOCK_PTR->prev_bb, ENTRY_BLOCK_PTR, prev_bb)
367
f9cce2dc 368/* For iterating over insns in basic block. */
369#define FOR_BB_INSNS(BB, INSN) \
370 for ((INSN) = BB_HEAD (BB); \
371 (INSN) != NEXT_INSN (BB_END (BB)); \
372 (INSN) = NEXT_INSN (INSN))
373
374#define FOR_BB_INSNS_REVERSE(BB, INSN) \
375 for ((INSN) = BB_END (BB); \
376 (INSN) != PREV_INSN (BB_HEAD (BB)); \
377 (INSN) = PREV_INSN (INSN))
378
cb5c5698 379/* Cycles through _all_ basic blocks, even the fake ones (entry and
380 exit block). */
381
382#define FOR_ALL_BB(BB) \
383 for (BB = ENTRY_BLOCK_PTR; BB; BB = BB->next_bb)
384
7e0b0820 385/* What registers are live at the setjmp call. */
386
387extern regset regs_live_at_setjmp;
388
65f34de5 389/* Special labels found during CFG build. */
390
7084e4fb 391extern GTY(()) rtx label_value_list;
65f34de5 392
393extern struct obstack flow_obstack;
394
6207bd2c 395/* Indexed by n, gives number of basic block that (REG n) is used in.
396 If the value is REG_BLOCK_GLOBAL (-2),
397 it means (REG n) is used in more than one basic block.
398 REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know.
399 This information remains valid for the rest of the compilation
400 of the current function; it is used to control register allocation. */
401
402#define REG_BLOCK_UNKNOWN -1
403#define REG_BLOCK_GLOBAL -2
394685a4 404
d6ff8d83 405#define REG_BASIC_BLOCK(N) (VARRAY_REG (reg_n_info, N)->basic_block)
61e82936 406\f
407/* Stuff for recording basic block info. */
408
5496dbfc 409#define BB_HEAD(B) (B)->head_
410#define BB_END(B) (B)->end_
fac55a46 411
61e82936 412/* Special block numbers [markers] for entry and exit. */
413#define ENTRY_BLOCK (-1)
414#define EXIT_BLOCK (-2)
415
a7dce381 416/* Special block number not valid for any block. */
1deb248e 417#define INVALID_BLOCK (-3)
418
71caadc0 419/* Similarly, block pointers for the edge list. */
4ee9c684 420extern GTY(()) basic_block ENTRY_BLOCK_PTR;
421extern GTY(()) basic_block EXIT_BLOCK_PTR;
71caadc0 422
b3d6de89 423#define BLOCK_NUM(INSN) (BLOCK_FOR_INSN (INSN)->index + 0)
ab87d1bc 424#define set_block_for_insn(INSN, BB) (BLOCK_FOR_INSN (INSN) = BB)
71caadc0 425
5a2784f8 426extern void compute_bb_for_insn (void);
427extern void free_bb_for_insn (void);
428extern void update_bb_for_insn (basic_block);
71caadc0 429
e086b176 430extern void free_basic_block_vars (void);
9ed8bc90 431
5a2784f8 432extern void insert_insn_on_edge (rtx, edge);
804e497b 433bool safe_insert_insn_on_edge (rtx, edge);
fb20d6fa 434
5a2784f8 435extern void commit_edge_insertions (void);
436extern void commit_edge_insertions_watch_calls (void);
437
438extern void remove_fake_edges (void);
41d24834 439extern void remove_fake_exit_edges (void);
5a2784f8 440extern void add_noreturn_fake_exit_edges (void);
441extern void connect_infinite_loops_to_exit (void);
5a2784f8 442extern edge unchecked_make_edge (basic_block, basic_block, int);
443extern edge cached_make_edge (sbitmap *, basic_block, basic_block, int);
444extern edge make_edge (basic_block, basic_block, int);
445extern edge make_single_succ_edge (basic_block, basic_block, int);
446extern void remove_edge (edge);
447extern void redirect_edge_succ (edge, basic_block);
448extern edge redirect_edge_succ_nodup (edge, basic_block);
449extern void redirect_edge_pred (edge, basic_block);
450extern basic_block create_basic_block_structure (rtx, rtx, rtx, basic_block);
451extern void clear_bb_flags (void);
5a2784f8 452extern void flow_reverse_top_sort_order_compute (int *);
453extern int flow_depth_first_order_compute (int *, int *);
5a2784f8 454extern int dfs_enumerate_from (basic_block, int,
455 bool (*)(basic_block, void *),
456 basic_block *, int, void *);
9858d888 457extern void compute_dominance_frontiers (bitmap *);
5a2784f8 458extern void dump_edge_info (FILE *, edge, int);
4ee9c684 459extern void brief_dump_cfg (FILE *);
5a2784f8 460extern void clear_edges (void);
461extern void mark_critical_edges (void);
462extern rtx first_insn_after_basic_block_note (basic_block);
fbb66919 463
1d855d4c 464/* Structure to group all of the information to process IF-THEN and
465 IF-THEN-ELSE blocks for the conditional execution support. This
466 needs to be in a public file in case the IFCVT macros call
467 functions passing the ce_if_block data structure. */
468
469typedef struct ce_if_block
470{
471 basic_block test_bb; /* First test block. */
472 basic_block then_bb; /* THEN block. */
473 basic_block else_bb; /* ELSE block or NULL. */
474 basic_block join_bb; /* Join THEN/ELSE blocks. */
475 basic_block last_test_bb; /* Last bb to hold && or || tests. */
476 int num_multiple_test_blocks; /* # of && and || basic blocks. */
477 int num_and_and_blocks; /* # of && blocks. */
478 int num_or_or_blocks; /* # of || blocks. */
479 int num_multiple_test_insns; /* # of insns in && and || blocks. */
480 int and_and_p; /* Complex test is &&. */
481 int num_then_insns; /* # of insns in THEN block. */
482 int num_else_insns; /* # of insns in ELSE block. */
483 int pass; /* Pass number. */
484
485#ifdef IFCVT_EXTRA_FIELDS
486 IFCVT_EXTRA_FIELDS /* Any machine dependent fields. */
487#endif
488
489} ce_if_block_t;
490
26d63a15 491/* This structure maintains an edge list vector. */
ddc63996 492struct edge_list
26d63a15 493{
494 int num_blocks;
495 int num_edges;
496 edge *index_to_edge;
497};
498
499/* This is the value which indicates no edge is present. */
500#define EDGE_INDEX_NO_EDGE -1
501
502/* EDGE_INDEX returns an integer index for an edge, or EDGE_INDEX_NO_EDGE
503 if there is no edge between the 2 basic blocks. */
504#define EDGE_INDEX(el, pred, succ) (find_edge_index ((el), (pred), (succ)))
505
506/* INDEX_EDGE_PRED_BB and INDEX_EDGE_SUCC_BB return a pointer to the basic
507 block which is either the pred or succ end of the indexed edge. */
508#define INDEX_EDGE_PRED_BB(el, index) ((el)->index_to_edge[(index)]->src)
509#define INDEX_EDGE_SUCC_BB(el, index) ((el)->index_to_edge[(index)]->dest)
510
511/* INDEX_EDGE returns a pointer to the edge. */
512#define INDEX_EDGE(el, index) ((el)->index_to_edge[(index)])
513
514/* Number of edges in the compressed edge list. */
515#define NUM_EDGES(el) ((el)->num_edges)
516
b1e17e10 517/* BB is assumed to contain conditional jump. Return the fallthru edge. */
cd665a06 518#define FALLTHRU_EDGE(bb) (EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
519 ? EDGE_SUCC ((bb), 0) : EDGE_SUCC ((bb), 1))
b1e17e10 520
521/* BB is assumed to contain conditional jump. Return the branch edge. */
cd665a06 522#define BRANCH_EDGE(bb) (EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
523 ? EDGE_SUCC ((bb), 1) : EDGE_SUCC ((bb), 0))
b1e17e10 524
eb429644 525/* Return expected execution frequency of the edge E. */
526#define EDGE_FREQUENCY(e) (((e)->src->frequency \
527 * (e)->probability \
528 + REG_BR_PROB_BASE / 2) \
529 / REG_BR_PROB_BASE)
530
e76f35e8 531/* Return nonzero if edge is critical. */
cd665a06 532#define EDGE_CRITICAL_P(e) (EDGE_COUNT ((e)->src->succs) >= 2 \
533 && EDGE_COUNT ((e)->dest->preds) >= 2)
534
535#define EDGE_COUNT(ev) VEC_length (edge, (ev))
536#define EDGE_I(ev,i) VEC_index (edge, (ev), (i))
537#define EDGE_PRED(bb,i) VEC_index (edge, (bb)->preds, (i))
538#define EDGE_SUCC(bb,i) VEC_index (edge, (bb)->succs, (i))
539
540/* Iterator object for edges. */
541
542typedef struct {
543 unsigned index;
56ff961b 544 VEC(edge) **container;
cd665a06 545} edge_iterator;
546
56ff961b 547static inline VEC(edge) *
548ei_container (edge_iterator i)
549{
550 gcc_assert (i.container);
551 return *i.container;
552}
553
554#define ei_start(iter) ei_start_1 (&(iter))
555#define ei_last(iter) ei_last_1 (&(iter))
556
cd665a06 557/* Return an iterator pointing to the start of an edge vector. */
558static inline edge_iterator
56ff961b 559ei_start_1 (VEC(edge) **ev)
cd665a06 560{
561 edge_iterator i;
562
563 i.index = 0;
564 i.container = ev;
565
566 return i;
567}
568
569/* Return an iterator pointing to the last element of an edge
570 vector. */
571static inline edge_iterator
56ff961b 572ei_last_1 (VEC(edge) **ev)
cd665a06 573{
574 edge_iterator i;
575
56ff961b 576 i.index = EDGE_COUNT (*ev) - 1;
cd665a06 577 i.container = ev;
578
579 return i;
580}
581
582/* Is the iterator `i' at the end of the sequence? */
583static inline bool
584ei_end_p (edge_iterator i)
585{
56ff961b 586 return (i.index == EDGE_COUNT (ei_container (i)));
cd665a06 587}
588
589/* Is the iterator `i' at one position before the end of the
590 sequence? */
591static inline bool
592ei_one_before_end_p (edge_iterator i)
593{
56ff961b 594 return (i.index + 1 == EDGE_COUNT (ei_container (i)));
cd665a06 595}
596
597/* Advance the iterator to the next element. */
598static inline void
599ei_next (edge_iterator *i)
600{
56ff961b 601 gcc_assert (i->index < EDGE_COUNT (ei_container (*i)));
cd665a06 602 i->index++;
603}
604
605/* Move the iterator to the previous element. */
606static inline void
607ei_prev (edge_iterator *i)
608{
609 gcc_assert (i->index > 0);
610 i->index--;
611}
612
613/* Return the edge pointed to by the iterator `i'. */
614static inline edge
615ei_edge (edge_iterator i)
616{
56ff961b 617 return EDGE_I (ei_container (i), i.index);
cd665a06 618}
619
620/* Return an edge pointed to by the iterator. Do it safely so that
621 NULL is returned when the iterator is pointing at the end of the
622 sequence. */
623static inline edge
624ei_safe_edge (edge_iterator i)
625{
626 return !ei_end_p (i) ? ei_edge (i) : NULL;
627}
628
629/* This macro serves as a convenient way to iterate each edge in a
cfd459fc 630 vector of predecessor or successor edges. It must not be used when
cd665a06 631 an element might be removed during the traversal, otherwise
632 elements will be missed. Instead, use a for-loop like that shown
633 in the following pseudo-code:
634
635 FOR (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
636 {
637 IF (e != taken_edge)
638 ssa_remove_edge (e);
639 ELSE
640 ei_next (&ei);
641 }
642*/
643
644#define FOR_EACH_EDGE(EDGE,ITER,EDGE_VEC) \
645 for ((EDGE) = NULL, (ITER) = ei_start ((EDGE_VEC)); \
646 ((EDGE) = ei_safe_edge ((ITER))); \
647 ei_next (&(ITER)))
e76f35e8 648
5a2784f8 649struct edge_list * create_edge_list (void);
650void free_edge_list (struct edge_list *);
651void print_edge_list (FILE *, struct edge_list *);
652void verify_edge_list (FILE *, struct edge_list *);
653int find_edge_index (struct edge_list *, basic_block, basic_block);
4ee9c684 654edge find_edge (basic_block, basic_block);
26d63a15 655
def93098 656
2d9b9dfe 657enum update_life_extent
658{
091291bb 659 UPDATE_LIFE_LOCAL = 0,
660 UPDATE_LIFE_GLOBAL = 1,
2341252e 661 UPDATE_LIFE_GLOBAL_RM_NOTES = 2
2d9b9dfe 662};
663
def93098 664/* Flags for life_analysis and update_life_info. */
665
666#define PROP_DEATH_NOTES 1 /* Create DEAD and UNUSED notes. */
667#define PROP_LOG_LINKS 2 /* Create LOG_LINKS. */
668#define PROP_REG_INFO 4 /* Update regs_ever_live et al. */
669#define PROP_KILL_DEAD_CODE 8 /* Remove dead code. */
670#define PROP_SCAN_DEAD_CODE 16 /* Scan for dead code. */
b3916f0e 671#define PROP_ALLOW_CFG_CHANGES 32 /* Allow the CFG to be changed
672 by dead code removal. */
673#define PROP_AUTOINC 64 /* Create autoinc mem references. */
992c7138 674#define PROP_EQUAL_NOTES 128 /* Take into account REG_EQUAL notes. */
2d30935d 675#define PROP_SCAN_DEAD_STORES 256 /* Scan for dead code. */
706382f7 676#define PROP_ASM_SCAN 512 /* Internal flag used within flow.c
677 to flag analysis of asms. */
2d30935d 678#define PROP_FINAL (PROP_DEATH_NOTES | PROP_LOG_LINKS \
679 | PROP_REG_INFO | PROP_KILL_DEAD_CODE \
680 | PROP_SCAN_DEAD_CODE | PROP_AUTOINC \
681 | PROP_ALLOW_CFG_CHANGES \
682 | PROP_SCAN_DEAD_STORES)
c59b7e96 683#define PROP_POSTRELOAD (PROP_DEATH_NOTES \
684 | PROP_KILL_DEAD_CODE \
685 | PROP_SCAN_DEAD_CODE | PROP_AUTOINC \
686 | PROP_SCAN_DEAD_STORES)
0ed5c697 687
d01481af 688#define CLEANUP_EXPENSIVE 1 /* Do relatively expensive optimizations
a0d79d69 689 except for edge forwarding */
690#define CLEANUP_CROSSJUMP 2 /* Do crossjumping. */
691#define CLEANUP_POST_REGSTACK 4 /* We run after reg-stack and need
692 to care REG_DEAD notes. */
fbac255a 693#define CLEANUP_PRE_LOOP 8 /* Take care to preserve syntactic loop
4d1f4307 694 notes. */
fbac255a 695#define CLEANUP_UPDATE_LIFE 16 /* Keep life information up to date. */
696#define CLEANUP_THREADING 32 /* Do jump threading. */
697#define CLEANUP_NO_INSN_DEL 64 /* Do not try to delete trivially dead
43a852ea 698 insns. */
fbac255a 699#define CLEANUP_CFGLAYOUT 128 /* Do cleanup in cfglayout mode. */
700#define CLEANUP_LOG_LINKS 256 /* Update log links. */
701
61317220 702extern void life_analysis (FILE *, int);
5a2784f8 703extern int update_life_info (sbitmap, enum update_life_extent, int);
704extern int update_life_info_in_dirty_blocks (enum update_life_extent, int);
705extern int count_or_remove_death_notes (sbitmap, int);
706extern int propagate_block (basic_block, regset, regset, regset, int);
def3c3e4 707
708struct propagate_block_info;
5a2784f8 709extern rtx propagate_one_insn (struct propagate_block_info *, rtx);
def3c3e4 710extern struct propagate_block_info *init_propagate_block_info
5a2784f8 711 (basic_block, regset, regset, regset, int);
712extern void free_propagate_block_info (struct propagate_block_info *);
2d9b9dfe 713
cd67b55d 714/* In lcm.c */
5a2784f8 715extern struct edge_list *pre_edge_lcm (FILE *, int, sbitmap *, sbitmap *,
716 sbitmap *, sbitmap *, sbitmap **,
717 sbitmap **);
718extern struct edge_list *pre_edge_rev_lcm (FILE *, int, sbitmap *,
719 sbitmap *, sbitmap *,
720 sbitmap *, sbitmap **,
721 sbitmap **);
722extern void compute_available (sbitmap *, sbitmap *, sbitmap *, sbitmap *);
723extern int optimize_mode_switching (FILE *);
f3d96a58 724
725/* In emit-rtl.c. */
5a2784f8 726extern rtx emit_block_insn_after (rtx, rtx, basic_block);
727extern rtx emit_block_insn_before (rtx, rtx, basic_block);
a4d05baf 728
59423b59 729/* In predict.c */
5a2784f8 730extern void estimate_probability (struct loops *);
5a2784f8 731extern void expected_value_to_br_prob (void);
732extern bool maybe_hot_bb_p (basic_block);
733extern bool probably_cold_bb_p (basic_block);
734extern bool probably_never_executed_bb_p (basic_block);
4ee9c684 735extern bool tree_predicted_by_p (basic_block, enum br_predictor);
736extern bool rtl_predicted_by_p (basic_block, enum br_predictor);
737extern void tree_predict_edge (edge, enum br_predictor, int);
738extern void rtl_predict_edge (edge, enum br_predictor, int);
739extern void predict_edge_def (edge, enum br_predictor, enum prediction);
83c8a977 740extern void guess_outgoing_edge_probabilities (basic_block);
59423b59 741
5a88ea64 742/* In flow.c */
5a2784f8 743extern void init_flow (void);
5a2784f8 744extern void debug_bb (basic_block);
745extern basic_block debug_bb_n (int);
746extern void dump_regset (regset, FILE *);
747extern void debug_regset (regset);
748extern void allocate_reg_life_data (void);
749extern void allocate_bb_life_data (void);
750extern void expunge_block (basic_block);
751extern void link_block (basic_block, basic_block);
752extern void unlink_block (basic_block);
753extern void compact_blocks (void);
754extern basic_block alloc_block (void);
755extern void find_unreachable_blocks (void);
61317220 756extern int delete_noop_moves (void);
5a2784f8 757extern basic_block force_nonfallthru (edge);
758extern rtx block_label (basic_block);
759extern bool forwarder_block_p (basic_block);
760extern bool purge_all_dead_edges (int);
761extern bool purge_dead_edges (basic_block);
762extern void find_sub_basic_blocks (basic_block);
763extern void find_many_sub_basic_blocks (sbitmap);
4ee9c684 764extern void rtl_make_eh_edge (sbitmap *, basic_block, rtx);
5a2784f8 765extern bool can_fallthru (basic_block, basic_block);
9bb8a4af 766extern bool could_fall_through (basic_block, basic_block);
5a2784f8 767extern void flow_nodes_print (const char *, const sbitmap, FILE *);
768extern void flow_edge_list_print (const char *, const edge *, int, FILE *);
769extern void alloc_aux_for_block (basic_block, int);
770extern void alloc_aux_for_blocks (int);
771extern void clear_aux_for_blocks (void);
772extern void free_aux_for_blocks (void);
773extern void alloc_aux_for_edge (edge, int);
774extern void alloc_aux_for_edges (int);
775extern void clear_aux_for_edges (void);
776extern void free_aux_for_edges (void);
4ee9c684 777extern void find_basic_blocks (rtx, int, FILE *);
778extern bool cleanup_cfg (int);
779extern bool delete_unreachable_blocks (void);
780extern bool merge_seq_blocks (void);
5a88ea64 781
8a5b87ad 782typedef struct conflict_graph_def *conflict_graph;
783
784/* Callback function when enumerating conflicts. The arguments are
785 the smaller and larger regno in the conflict. Returns zero if
d10cfa8d 786 enumeration is to continue, nonzero to halt enumeration. */
5a2784f8 787typedef int (*conflict_graph_enum_fn) (int, int, void *);
8a5b87ad 788
789
790/* Prototypes of operations on conflict graphs. */
791
ddc63996 792extern conflict_graph conflict_graph_new
5a2784f8 793 (int);
794extern void conflict_graph_delete (conflict_graph);
795extern int conflict_graph_add (conflict_graph, int, int);
796extern int conflict_graph_conflict_p (conflict_graph, int, int);
797extern void conflict_graph_enum (conflict_graph, int, conflict_graph_enum_fn,
798 void *);
799extern void conflict_graph_merge_regs (conflict_graph, int, int);
800extern void conflict_graph_print (conflict_graph, FILE*);
801extern conflict_graph conflict_graph_compute (regset, partition);
802extern bool mark_dfs_back_edges (void);
803extern void set_edge_can_fallthru_flag (void);
804extern void update_br_prob_note (basic_block);
805extern void fixup_abnormal_edges (void);
5a2784f8 806extern bool inside_basic_block_p (rtx);
807extern bool control_flow_insn_p (rtx);
5a88ea64 808
aecda0d6 809/* In bb-reorder.c */
d2ed6106 810extern void reorder_basic_blocks (unsigned int);
4f18499c 811extern void partition_hot_cold_basic_blocks (void);
aecda0d6 812
4ee9c684 813/* In cfg.c */
814extern void alloc_rbi_pool (void);
815extern void initialize_bb_rbi (basic_block bb);
816extern void free_rbi_pool (void);
817
4794f989 818/* In dominance.c */
819
820enum cdi_direction
821{
822 CDI_DOMINATORS,
823 CDI_POST_DOMINATORS
824};
825
0051c76a 826enum dom_state
827{
828 DOM_NONE, /* Not computed at all. */
0051c76a 829 DOM_NO_FAST_QUERY, /* The data is OK, but the fast query data are not usable. */
830 DOM_OK /* Everything is ok. */
831};
832
833extern enum dom_state dom_computed[2];
834
6b9d2769 835extern bool dom_info_available_p (enum cdi_direction);
0051c76a 836extern void calculate_dominance_info (enum cdi_direction);
837extern void free_dominance_info (enum cdi_direction);
838extern basic_block nearest_common_dominator (enum cdi_direction,
5a2784f8 839 basic_block, basic_block);
0051c76a 840extern void set_immediate_dominator (enum cdi_direction, basic_block,
5a2784f8 841 basic_block);
0051c76a 842extern basic_block get_immediate_dominator (enum cdi_direction, basic_block);
843extern bool dominated_by_p (enum cdi_direction, basic_block, basic_block);
844extern int get_dominated_by (enum cdi_direction, basic_block, basic_block **);
d8b5b4fe 845extern unsigned get_dominated_by_region (enum cdi_direction, basic_block *,
846 unsigned, basic_block *);
0051c76a 847extern void add_to_dominance_info (enum cdi_direction, basic_block);
848extern void delete_from_dominance_info (enum cdi_direction, basic_block);
849basic_block recount_dominator (enum cdi_direction, basic_block);
850extern void redirect_immediate_dominators (enum cdi_direction, basic_block,
5a2784f8 851 basic_block);
0051c76a 852extern void iterate_fix_dominators (enum cdi_direction, basic_block *, int);
853extern void verify_dominators (enum cdi_direction);
854extern basic_block first_dom_son (enum cdi_direction, basic_block);
855extern basic_block next_dom_son (enum cdi_direction, basic_block);
4ee9c684 856extern edge try_redirect_by_replacing_jump (edge, basic_block, bool);
54f7a985 857extern void break_superblocks (void);
020c749b 858extern void check_bb_profile (basic_block, FILE *);
615dd397 859extern void update_bb_profile_for_threading (basic_block, int, gcov_type, edge);
1026363d 860
861#include "cfghooks.h"
862
2a281353 863#endif /* GCC_BASIC_BLOCK_H */