]> gcc.gnu.org Git - gcc.git/blame - gcc/basic-block.h
utils.c (init_gigi_decls): Use ARRAY_SIZE in lieu of explicit array size calculation.
[gcc.git] / gcc / basic-block.h
CommitLineData
3245eea0 1/* Define control and data flow tables, and regsets.
6a58eee9 2 Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002
8aab0f2b 3 Free Software Foundation, Inc.
3245eea0 4
1322177d 5This file is part of GCC.
3245eea0 6
1322177d
LB
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.
3245eea0 11
1322177d
LB
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.
3245eea0
CH
16
17You should have received a copy of the GNU General Public License
1322177d
LB
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. */
3245eea0 21
88657302 22#ifndef GCC_BASIC_BLOCK_H
7f8a2125 23#define GCC_BASIC_BLOCK_H
3245eea0 24
19d18142 25#include "bitmap.h"
5f6c11d6 26#include "sbitmap.h"
e881bb1b 27#include "varray.h"
4e872036 28#include "partition.h"
19d18142 29
b1dbfa1d
BS
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. */
e2500fed 36#define INIT_REG_SET(HEAD) bitmap_initialize (HEAD, 1)
19d18142
RK
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
d3a923ee
RH
44/* Compare two register sets. */
45#define REG_SET_EQUAL_P(A, B) bitmap_equal_p (A, B)
46
19d18142
RK
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
d3a923ee
RH
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
19d18142
RK
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)
916b1701
MM
63
64/* Clear a single register in a register set. */
19d18142 65#define CLEAR_REGNO_REG_SET(HEAD, REG) bitmap_clear_bit (HEAD, REG)
916b1701
MM
66
67/* Set a single register in a register set. */
19d18142 68#define SET_REGNO_REG_SET(HEAD, REG) bitmap_set_bit (HEAD, REG)
916b1701
MM
69
70/* Return true if a register is set in a register set. */
19d18142 71#define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG)
916b1701
MM
72
73/* Copy the hard registers in a register set to the hard register set. */
efc9bd41 74extern void reg_set_to_hard_reg_set PARAMS ((HARD_REG_SET *, bitmap));
916b1701
MM
75#define REG_SET_TO_HARD_REG_SET(TO, FROM) \
76do { \
916b1701 77 CLEAR_HARD_REG_SET (TO); \
efc9bd41 78 reg_set_to_hard_reg_set (&TO, FROM); \
916b1701
MM
79} while (0)
80
81/* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the
eebedaa5 82 register number and executing CODE for all registers that are set. */
916b1701 83#define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, CODE) \
19d18142 84 EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, CODE)
916b1701
MM
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
eebedaa5 88 set in the first regset and not set in the second. */
916b1701 89#define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
19d18142 90 EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
916b1701 91
22fa5b8a
MM
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
eebedaa5 94 set in both regsets. */
22fa5b8a
MM
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
916b1701 98/* Allocate a register set with oballoc. */
19d18142 99#define OBSTACK_ALLOC_REG_SET(OBSTACK) BITMAP_OBSTACK_ALLOC (OBSTACK)
916b1701 100
ee25a7a5 101/* Initialize a register set. Returns the new register set. */
e2500fed 102#define INITIALIZE_REG_SET(HEAD) bitmap_initialize (&HEAD, 1)
19d18142
RK
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. */
7f8a2125 113#define MAX_REGNO_REG_SET(NUM_REGS, NEW_P, RENUMBER_P)
916b1701 114
b2aec5c0
JH
115/* Type we use to hold basic block counters. Should be at least 64bit. */
116typedef HOST_WIDEST_INT gcov_type;
117
e881bb1b
RH
118/* Control flow edge information. */
119typedef struct edge_def {
120 /* Links through the predecessor and successor lists. */
121 struct edge_def *pred_next, *succ_next;
3245eea0 122
e881bb1b
RH
123 /* The two blocks at the ends of the edge. */
124 struct basic_block_def *src, *dest;
125
126 /* Instructions queued on the edge. */
127 rtx insns;
128
129 /* Auxiliary info specific to a pass. */
130 void *aux;
3245eea0 131
e881bb1b
RH
132 int flags; /* see EDGE_* below */
133 int probability; /* biased by REG_BR_PROB_BASE */
b2aec5c0 134 gcov_type count; /* Expected number of executions calculated
51891abe 135 in profile.c */
e881bb1b 136} *edge;
3245eea0 137
e881bb1b 138#define EDGE_FALLTHRU 1
4262e623
JH
139#define EDGE_ABNORMAL 2
140#define EDGE_ABNORMAL_CALL 4
141#define EDGE_EH 8
142#define EDGE_FAKE 16
143#define EDGE_DFS_BACK 32
6c81a490 144#define EDGE_CAN_FALLTHRU 64
3245eea0 145
65b98a02
JW
146#define EDGE_COMPLEX (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
147
3245eea0 148
e68e3108
MM
149/* A basic block is a sequence of instructions with only entry and
150 only one exit. If any one of the instructions are executed, they
151 will all be executed, and in sequence from first to last.
152
153 There may be COND_EXEC instructions in the basic block. The
154 COND_EXEC *instructions* will be executed -- but if the condition
155 is false the conditionally executed *expressions* will of course
156 not be executed. We don't consider the conditionally executed
157 expression (which might have side-effects) to be in a separate
158 basic block because the program counter will always be at the same
159 location after the COND_EXEC instruction, regardless of whether the
160 condition is true or not.
161
162 Basic blocks need not start with a label nor end with a jump insn.
b53978a3
JO
163 For example, a previous basic block may just "conditionally fall"
164 into the succeeding basic block, and the last basic block need not
165 end with a jump insn. Block 0 is a descendant of the entry block.
166
167 A basic block beginning with two labels cannot have notes between
168 the labels.
169
170 Data for jump tables are stored in jump_insns that occur in no
171 basic block even though these insns can follow or precede insns in
172 basic blocks. */
173
e881bb1b
RH
174/* Basic block information indexed by block number. */
175typedef struct basic_block_def {
176 /* The first and last insns of the block. */
177 rtx head, end;
3245eea0 178
2b1d9dc0
DN
179 /* The first and last trees of the block. */
180 tree head_tree;
181 tree end_tree;
182
e881bb1b
RH
183 /* The edges into and out of the block. */
184 edge pred, succ;
4d1d8045 185
e68e3108
MM
186 /* Liveness info. */
187
188 /* The registers that are modified within this in block. */
e881bb1b 189 regset local_set;
e68e3108
MM
190 /* The registers that are conditionally modified within this block.
191 In other words, registers that are set only as part of a
192 COND_EXEC. */
7dfc0fbe 193 regset cond_local_set;
e68e3108
MM
194 /* The registers that are live on entry to this block.
195
196 Note that in SSA form, global_live_at_start does not reflect the
197 use of regs in phi functions, since the liveness of these regs
198 may depend on which edge was taken into the block. */
e881bb1b 199 regset global_live_at_start;
e68e3108 200 /* The registers that are live on exit from this block. */
e881bb1b 201 regset global_live_at_end;
4d1d8045 202
e881bb1b
RH
203 /* Auxiliary info specific to a pass. */
204 void *aux;
3245eea0 205
0b17ab2f
RH
206 /* The index of this block. */
207 int index;
336a6399 208
918ed612
ZD
209 /* Previous and next blocks in the chain. */
210 struct basic_block_def *prev_bb, *next_bb;
211
52a11cbf
RH
212 /* The loop depth of this block. */
213 int loop_depth;
51891abe 214
2ecfd709
ZD
215 /* Outermost loop containing the block. */
216 struct loop *loop_father;
217
52a11cbf 218 /* Expected number of executions: calculated in profile.c. */
b2aec5c0 219 gcov_type count;
7f8a2125 220
861f9cd0
JH
221 /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */
222 int frequency;
006844a3
DN
223
224 /* Various flags. See BB_* below. */
225 int flags;
e881bb1b 226} *basic_block;
7f8a2125 227
861f9cd0 228#define BB_FREQ_MAX 10000
e881bb1b 229
006844a3 230/* Masks for basic_block.flags. */
38c1593d
JH
231#define BB_DIRTY 1
232#define BB_NEW 2
233#define BB_REACHABLE 4
2ecfd709 234#define BB_VISITED 8
006844a3 235
e881bb1b
RH
236/* Number of basic blocks in the current function. */
237
0b17ab2f 238extern int n_basic_blocks;
e881bb1b 239
d55bc081
ZD
240/* First free basic block number. */
241
bf77398c 242extern int last_basic_block;
d55bc081 243
d3a923ee
RH
244/* Number of edges in the current function. */
245
246extern int n_edges;
247
e881bb1b
RH
248/* Index by basic block number, get basic block struct info. */
249
250extern varray_type basic_block_info;
251
252#define BASIC_BLOCK(N) (VARRAY_BB (basic_block_info, (N)))
3245eea0 253
918ed612
ZD
254/* For iterating over basic blocks. */
255#define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
256 for (BB = FROM; BB != TO; BB = BB->DIR)
257
258#define FOR_EACH_BB(BB) \
259 FOR_BB_BETWEEN (BB, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb)
260
261#define FOR_EACH_BB_REVERSE(BB) \
262 FOR_BB_BETWEEN (BB, EXIT_BLOCK_PTR->prev_bb, ENTRY_BLOCK_PTR, prev_bb)
263
19d18142
RK
264/* What registers are live at the setjmp call. */
265
266extern regset regs_live_at_setjmp;
267
402209ff
JH
268/* Special labels found during CFG build. */
269
270extern rtx label_value_list, tail_recursion_label_list;
271
272extern struct obstack flow_obstack;
273
3245eea0
CH
274/* Indexed by n, gives number of basic block that (REG n) is used in.
275 If the value is REG_BLOCK_GLOBAL (-2),
276 it means (REG n) is used in more than one basic block.
277 REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know.
278 This information remains valid for the rest of the compilation
279 of the current function; it is used to control register allocation. */
280
281#define REG_BLOCK_UNKNOWN -1
282#define REG_BLOCK_GLOBAL -2
b1f21e0a 283
6feacd09 284#define REG_BASIC_BLOCK(N) (VARRAY_REG (reg_n_info, N)->basic_block)
5ece9746
JL
285\f
286/* Stuff for recording basic block info. */
287
e881bb1b
RH
288#define BLOCK_HEAD(B) (BASIC_BLOCK (B)->head)
289#define BLOCK_END(B) (BASIC_BLOCK (B)->end)
5ece9746 290
2b1d9dc0
DN
291#define BLOCK_HEAD_TREE(B) (BASIC_BLOCK (B)->head_tree)
292#define BLOCK_END_TREE(B) (BASIC_BLOCK (B)->end_tree)
293
5ece9746
JL
294/* Special block numbers [markers] for entry and exit. */
295#define ENTRY_BLOCK (-1)
296#define EXIT_BLOCK (-2)
297
eebedaa5 298/* Special block number not valid for any block. */
b53978a3
JO
299#define INVALID_BLOCK (-3)
300
e881bb1b
RH
301/* Similarly, block pointers for the edge list. */
302extern struct basic_block_def entry_exit_blocks[2];
303#define ENTRY_BLOCK_PTR (&entry_exit_blocks[0])
304#define EXIT_BLOCK_PTR (&entry_exit_blocks[1])
305
0b17ab2f 306#define BLOCK_NUM(INSN) (BLOCK_FOR_INSN (INSN)->index + 0)
ba4f7968 307#define set_block_for_insn(INSN, BB) (BLOCK_FOR_INSN (INSN) = BB)
e881bb1b 308
852c6ec7 309extern void compute_bb_for_insn PARAMS ((void));
3c030e88 310extern void free_bb_for_insn PARAMS ((void));
c586192c 311extern void update_bb_for_insn PARAMS ((basic_block));
e881bb1b 312
3d994c6b 313extern void free_basic_block_vars PARAMS ((int));
52becdc0 314
c586192c 315extern edge split_block PARAMS ((basic_block, rtx));
3d994c6b
KG
316extern basic_block split_edge PARAMS ((edge));
317extern void insert_insn_on_edge PARAMS ((rtx, edge));
3dec4024 318
3d994c6b 319extern void commit_edge_insertions PARAMS ((void));
3dec4024
JH
320extern void commit_edge_insertions_watch_calls PARAMS ((void));
321
3d994c6b
KG
322extern void remove_fake_edges PARAMS ((void));
323extern void add_noreturn_fake_exit_edges PARAMS ((void));
b53978a3 324extern void connect_infinite_loops_to_exit PARAMS ((void));
7f8a2125 325extern int flow_call_edges_add PARAMS ((sbitmap));
7ded4467
JH
326extern edge cached_make_edge PARAMS ((sbitmap *, basic_block,
327 basic_block, int));
328extern edge make_edge PARAMS ((basic_block,
329 basic_block, int));
330extern edge make_single_succ_edge PARAMS ((basic_block,
69732dcb
RH
331 basic_block, int));
332extern void remove_edge PARAMS ((edge));
f008a564 333extern void redirect_edge_succ PARAMS ((edge, basic_block));
c23bb84b 334extern edge redirect_edge_succ_nodup PARAMS ((edge, basic_block));
f008a564 335extern void redirect_edge_pred PARAMS ((edge, basic_block));
852c6ec7 336extern basic_block create_basic_block_structure PARAMS ((rtx, rtx, rtx, basic_block));
918ed612 337extern basic_block create_basic_block PARAMS ((rtx, rtx, basic_block));
52294521 338extern int flow_delete_block PARAMS ((basic_block));
6a58eee9 339extern int flow_delete_block_noexpunge PARAMS ((basic_block));
38c1593d 340extern void clear_bb_flags PARAMS ((void));
dc108b7a
RH
341extern void merge_blocks_nomove PARAMS ((basic_block, basic_block));
342extern void tidy_fallthru_edge PARAMS ((edge, basic_block,
343 basic_block));
402209ff 344extern void tidy_fallthru_edges PARAMS ((void));
d59c5346 345extern void flow_reverse_top_sort_order_compute PARAMS ((int *));
10c4b247 346extern int flow_depth_first_order_compute PARAMS ((int *, int *));
3dba4251 347extern void flow_preorder_transversal_compute PARAMS ((int *));
316dcdf6
DN
348extern void dump_edge_info PARAMS ((FILE *, edge, int));
349extern void clear_edges PARAMS ((void));
350extern void mark_critical_edges PARAMS ((void));
b62c8881 351extern rtx first_insn_after_basic_block_note PARAMS ((basic_block));
10c4b247 352
4dc9341c
MH
353/* Structure to hold information for each natural loop. */
354struct loop
355{
c34d5374 356 /* Index into loops array. */
4dc9341c
MH
357 int num;
358
359 /* Basic block of loop header. */
360 basic_block header;
361
362 /* Basic block of loop latch. */
363 basic_block latch;
364
365 /* Basic block of loop pre-header or NULL if it does not exist. */
366 basic_block pre_header;
367
7f8a2125 368 /* Array of edges along the pre-header extended basic block trace.
4a7da9b5
MH
369 The source of the first edge is the root node of pre-header
370 extended basic block, if it exists. */
371 edge *pre_header_edges;
5d6a16e2 372
4a7da9b5
MH
373 /* Number of edges along the pre_header extended basic block trace. */
374 int num_pre_header_edges;
5d6a16e2 375
65169dcf
JE
376 /* The first block in the loop. This is not necessarily the same as
377 the loop header. */
378 basic_block first;
379
380 /* The last block in the loop. This is not necessarily the same as
381 the loop latch. */
382 basic_block last;
383
4dc9341c
MH
384 /* Bitmap of blocks contained within the loop. */
385 sbitmap nodes;
386
387 /* Number of blocks contained within the loop. */
388 int num_nodes;
389
135ebc36
MH
390 /* Array of edges that enter the loop. */
391 edge *entry_edges;
392
393 /* Number of edges that enter the loop. */
394 int num_entries;
395
4dc9341c 396 /* Array of edges that exit the loop. */
135ebc36 397 edge *exit_edges;
4dc9341c
MH
398
399 /* Number of edges that exit the loop. */
400 int num_exits;
401
5d6a16e2
MH
402 /* Bitmap of blocks that dominate all exits of the loop. */
403 sbitmap exits_doms;
404
4dc9341c
MH
405 /* The loop nesting depth. */
406 int depth;
407
2ecfd709
ZD
408 /* Superloops of the loop. */
409 struct loop **pred;
410
4dc9341c
MH
411 /* The height of the loop (enclosed loop levels) within the loop
412 hierarchy tree. */
413 int level;
414
415 /* The outer (parent) loop or NULL if outermost loop. */
416 struct loop *outer;
417
418 /* The first inner (child) loop or NULL if innermost loop. */
419 struct loop *inner;
420
421 /* Link to the next (sibling) loop. */
422 struct loop *next;
423
4dc9341c
MH
424 /* Non-zero if the loop is invalid (e.g., contains setjmp.). */
425 int invalid;
426
427 /* Auxiliary info specific to a pass. */
52b38064 428 void *aux;
a2be868f
MH
429
430 /* The following are currently used by loop.c but they are likely to
431 disappear as loop.c is converted to use the CFG. */
432
433 /* Non-zero if the loop has a NOTE_INSN_LOOP_VTOP. */
434 rtx vtop;
435
436 /* Non-zero if the loop has a NOTE_INSN_LOOP_CONT.
437 A continue statement will generate a branch to NEXT_INSN (cont). */
438 rtx cont;
439
440 /* The dominator of cont. */
441 rtx cont_dominator;
442
443 /* The NOTE_INSN_LOOP_BEG. */
444 rtx start;
445
446 /* The NOTE_INSN_LOOP_END. */
447 rtx end;
448
449 /* For a rotated loop that is entered near the bottom,
450 this is the label at the top. Otherwise it is zero. */
451 rtx top;
452
453 /* Place in the loop where control enters. */
454 rtx scan_start;
455
96a45535
MH
456 /* The position where to sink insns out of the loop. */
457 rtx sink;
458
a2be868f
MH
459 /* List of all LABEL_REFs which refer to code labels outside the
460 loop. Used by routines that need to know all loop exits, such as
461 final_biv_value and final_giv_value.
7f8a2125 462
a2be868f
MH
463 This does not include loop exits due to return instructions.
464 This is because all bivs and givs are pseudos, and hence must be
465 dead after a return, so the presense of a return does not affect
466 any of the optimizations that use this info. It is simpler to
467 just not include return instructions on this list. */
468 rtx exit_labels;
469
470 /* The number of LABEL_REFs on exit_labels for this loop and all
471 loops nested inside it. */
472 int exit_count;
4dc9341c
MH
473};
474
475
476/* Structure to hold CFG information about natural loops within a function. */
477struct loops
478{
479 /* Number of natural loops in the function. */
480 int num;
481
d6181b1b
MH
482 /* Maxium nested loop level in the function. */
483 int levels;
484
4dc9341c
MH
485 /* Array of natural loop descriptors (scanning this array in reverse order
486 will find the inner loops before their enclosing outer loops). */
487 struct loop *array;
488
2ecfd709
ZD
489 /* The above array is unused in new loop infrastructure and is kept only for
490 purposes of the old loop optimizer. Instead we store just pointers to
491 loops here. */
492 struct loop **parray;
493
4dc9341c 494 /* Pointer to root of loop heirachy tree. */
2b1d9dc0 495 struct loop *tree_root;
4dc9341c
MH
496
497 /* Information derived from the CFG. */
498 struct cfg
499 {
500 /* The bitmap vector of dominators or NULL if not computed. */
501 sbitmap *dom;
502
503 /* The ordering of the basic blocks in a depth first search. */
504 int *dfs_order;
c34d5374
MH
505
506 /* The reverse completion ordering of the basic blocks found in a
507 depth first search. */
508 int *rc_order;
4dc9341c
MH
509 } cfg;
510
511 /* Headers shared by multiple loops that should be merged. */
512 sbitmap shared_headers;
513};
514
5d6a16e2
MH
515extern int flow_loops_find PARAMS ((struct loops *, int flags));
516extern int flow_loops_update PARAMS ((struct loops *, int flags));
3d994c6b 517extern void flow_loops_free PARAMS ((struct loops *));
6057c0e6
MH
518extern void flow_loops_dump PARAMS ((const struct loops *, FILE *,
519 void (*)(const struct loop *,
520 FILE *, int), int));
521extern void flow_loop_dump PARAMS ((const struct loop *, FILE *,
522 void (*)(const struct loop *,
523 FILE *, int), int));
eab02feb 524extern int flow_loop_scan PARAMS ((struct loops *, struct loop *, int));
2ecfd709
ZD
525extern void flow_loop_tree_node_add PARAMS ((struct loop *, struct loop *));
526extern void flow_loop_tree_node_remove PARAMS ((struct loop *));
4dc9341c 527
410538ea 528/* This structure maintains an edge list vector. */
7f8a2125 529struct edge_list
410538ea
AM
530{
531 int num_blocks;
532 int num_edges;
533 edge *index_to_edge;
534};
535
536/* This is the value which indicates no edge is present. */
537#define EDGE_INDEX_NO_EDGE -1
538
539/* EDGE_INDEX returns an integer index for an edge, or EDGE_INDEX_NO_EDGE
540 if there is no edge between the 2 basic blocks. */
541#define EDGE_INDEX(el, pred, succ) (find_edge_index ((el), (pred), (succ)))
542
543/* INDEX_EDGE_PRED_BB and INDEX_EDGE_SUCC_BB return a pointer to the basic
544 block which is either the pred or succ end of the indexed edge. */
545#define INDEX_EDGE_PRED_BB(el, index) ((el)->index_to_edge[(index)]->src)
546#define INDEX_EDGE_SUCC_BB(el, index) ((el)->index_to_edge[(index)]->dest)
547
548/* INDEX_EDGE returns a pointer to the edge. */
549#define INDEX_EDGE(el, index) ((el)->index_to_edge[(index)])
550
551/* Number of edges in the compressed edge list. */
552#define NUM_EDGES(el) ((el)->num_edges)
553
7a442791
JH
554/* BB is assumed to contain conditional jump. Return the fallthru edge. */
555#define FALLTHRU_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
556 ? (bb)->succ : (bb)->succ->succ_next)
557
558/* BB is assumed to contain conditional jump. Return the branch edge. */
559#define BRANCH_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
560 ? (bb)->succ->succ_next : (bb)->succ)
561
134d3a2e
JH
562/* Return expected execution frequency of the edge E. */
563#define EDGE_FREQUENCY(e) (((e)->src->frequency \
564 * (e)->probability \
565 + REG_BR_PROB_BASE / 2) \
566 / REG_BR_PROB_BASE)
567
4262e623
JH
568/* Return nonzero if edge is critical. */
569#define EDGE_CRITICAL_P(e) ((e)->src->succ->succ_next \
570 && (e)->dest->pred->pred_next)
571
3d994c6b
KG
572struct edge_list * create_edge_list PARAMS ((void));
573void free_edge_list PARAMS ((struct edge_list *));
574void print_edge_list PARAMS ((FILE *, struct edge_list *));
575void verify_edge_list PARAMS ((FILE *, struct edge_list *));
7f8a2125 576int find_edge_index PARAMS ((struct edge_list *,
3d994c6b 577 basic_block, basic_block));
410538ea 578
49c3bb12 579
d3a923ee
RH
580enum update_life_extent
581{
715e7fbc
RH
582 UPDATE_LIFE_LOCAL = 0,
583 UPDATE_LIFE_GLOBAL = 1,
5a425893 584 UPDATE_LIFE_GLOBAL_RM_NOTES = 2
d3a923ee
RH
585};
586
49c3bb12
RH
587/* Flags for life_analysis and update_life_info. */
588
589#define PROP_DEATH_NOTES 1 /* Create DEAD and UNUSED notes. */
590#define PROP_LOG_LINKS 2 /* Create LOG_LINKS. */
591#define PROP_REG_INFO 4 /* Update regs_ever_live et al. */
592#define PROP_KILL_DEAD_CODE 8 /* Remove dead code. */
593#define PROP_SCAN_DEAD_CODE 16 /* Scan for dead code. */
11f68165
JW
594#define PROP_ALLOW_CFG_CHANGES 32 /* Allow the CFG to be changed
595 by dead code removal. */
596#define PROP_AUTOINC 64 /* Create autoinc mem references. */
5a133afd 597#define PROP_EQUAL_NOTES 128 /* Take into account REG_EQUAL notes. */
5149f070
JH
598#define PROP_SCAN_DEAD_STORES 256 /* Scan for dead code. */
599#define PROP_FINAL (PROP_DEATH_NOTES | PROP_LOG_LINKS \
600 | PROP_REG_INFO | PROP_KILL_DEAD_CODE \
601 | PROP_SCAN_DEAD_CODE | PROP_AUTOINC \
602 | PROP_ALLOW_CFG_CHANGES \
603 | PROP_SCAN_DEAD_STORES)
5d6a16e2 604
46fac664
JH
605#define CLEANUP_EXPENSIVE 1 /* Do relativly expensive optimizations
606 except for edge forwarding */
607#define CLEANUP_CROSSJUMP 2 /* Do crossjumping. */
608#define CLEANUP_POST_REGSTACK 4 /* We run after reg-stack and need
609 to care REG_DEAD notes. */
4793dca1
JH
610#define CLEANUP_PRE_SIBCALL 8 /* Do not get confused by code hidden
611 inside call_placeholders.. */
0068fd96
JH
612#define CLEANUP_PRE_LOOP 16 /* Take care to preserve syntactic loop
613 notes. */
635559ab 614#define CLEANUP_UPDATE_LIFE 32 /* Keep life information up to date. */
8ecba28a 615#define CLEANUP_THREADING 64 /* Do jump threading. */
95479831
DM
616#define CLEANUP_NO_INSN_DEL 128 /* Do not try to delete trivially dead
617 insns. */
5d6a16e2
MH
618/* Flags for loop discovery. */
619
7f8a2125 620#define LOOP_TREE 1 /* Build loop hierarchy tree. */
5d6a16e2 621#define LOOP_PRE_HEADER 2 /* Analyse loop pre-header. */
7f8a2125
AJ
622#define LOOP_ENTRY_EDGES 4 /* Find entry edges. */
623#define LOOP_EXIT_EDGES 8 /* Find exit edges. */
eab02feb 624#define LOOP_EDGES (LOOP_ENTRY_EDGES | LOOP_EXIT_EDGES)
2ecfd709 625#define LOOP_ALL 15 /* All of the above */
5d6a16e2 626
7f8a79ba 627extern void life_analysis PARAMS ((rtx, FILE *, int));
3dec4024 628extern int update_life_info PARAMS ((sbitmap, enum update_life_extent,
3d994c6b 629 int));
3dec4024 630extern int update_life_info_in_dirty_blocks PARAMS ((enum update_life_extent,
38c1593d 631 int));
3d994c6b 632extern int count_or_remove_death_notes PARAMS ((sbitmap, int));
11f68165 633extern int propagate_block PARAMS ((basic_block, regset, regset, regset,
7dfc0fbe 634 int));
292f3869
RH
635
636struct propagate_block_info;
637extern rtx propagate_one_insn PARAMS ((struct propagate_block_info *, rtx));
638extern struct propagate_block_info *init_propagate_block_info
7dfc0fbe 639 PARAMS ((basic_block, regset, regset, regset, int));
292f3869 640extern void free_propagate_block_info PARAMS ((struct propagate_block_info *));
d3a923ee 641
077692c6 642/* In lcm.c */
7f8a2125
AJ
643extern struct edge_list *pre_edge_lcm PARAMS ((FILE *, int, sbitmap *,
644 sbitmap *, sbitmap *,
3d994c6b
KG
645 sbitmap *, sbitmap **,
646 sbitmap **));
647extern struct edge_list *pre_edge_rev_lcm PARAMS ((FILE *, int, sbitmap *,
7f8a2125
AJ
648 sbitmap *, sbitmap *,
649 sbitmap *, sbitmap **,
3d994c6b
KG
650 sbitmap **));
651extern void compute_available PARAMS ((sbitmap *, sbitmap *,
652 sbitmap *, sbitmap *));
97d36f45 653extern int optimize_mode_switching PARAMS ((FILE *));
a05924f9
JH
654
655/* In emit-rtl.c. */
3d994c6b
KG
656extern rtx emit_block_insn_after PARAMS ((rtx, rtx, basic_block));
657extern rtx emit_block_insn_before PARAMS ((rtx, rtx, basic_block));
4dc9341c 658
f1ebdfc5
JE
659/* In predict.c */
660extern void estimate_probability PARAMS ((struct loops *));
969d70ca 661extern void note_prediction_to_br_prob PARAMS ((void));
994a57cd 662extern void expected_value_to_br_prob PARAMS ((void));
194734e9
JH
663extern void note_prediction_to_br_prob PARAMS ((void));
664extern bool maybe_hot_bb_p PARAMS ((basic_block));
665extern bool probably_cold_bb_p PARAMS ((basic_block));
666extern bool probably_never_executed_bb_p PARAMS ((basic_block));
f1ebdfc5 667
11bdd2ae 668/* In flow.c */
1f8f4a0b 669extern void init_flow PARAMS ((void));
11bdd2ae 670extern void reorder_basic_blocks PARAMS ((void));
b7ba4d8d
ZW
671extern void dump_bb PARAMS ((basic_block, FILE *));
672extern void debug_bb PARAMS ((basic_block));
673extern void debug_bb_n PARAMS ((int));
674extern void dump_regset PARAMS ((regset, FILE *));
675extern void debug_regset PARAMS ((regset));
1f8f4a0b 676extern void allocate_reg_life_data PARAMS ((void));
c319629b 677extern void allocate_bb_life_data PARAMS ((void));
d5c768b8 678extern void expunge_block PARAMS ((basic_block));
918ed612
ZD
679extern void link_block PARAMS ((basic_block, basic_block));
680extern void unlink_block PARAMS ((basic_block));
bf77398c 681extern void compact_blocks PARAMS ((void));
ca6c03ca 682extern basic_block alloc_block PARAMS ((void));
1e29ee12 683extern void find_unreachable_blocks PARAMS ((void));
3dec4024 684extern int delete_noop_moves PARAMS ((rtx));
6b24c259 685extern basic_block redirect_edge_and_branch_force PARAMS ((edge, basic_block));
4262e623 686extern basic_block force_nonfallthru PARAMS ((edge));
6b24c259
JH
687extern bool redirect_edge_and_branch PARAMS ((edge, basic_block));
688extern rtx block_label PARAMS ((basic_block));
689extern bool forwarder_block_p PARAMS ((basic_block));
00baba68 690extern bool purge_all_dead_edges PARAMS ((int));
39f95a2c 691extern bool purge_dead_edges PARAMS ((basic_block));
0005550b 692extern void find_sub_basic_blocks PARAMS ((basic_block));
b932f770 693extern void find_many_sub_basic_blocks PARAMS ((sbitmap));
402209ff
JH
694extern bool can_fallthru PARAMS ((basic_block, basic_block));
695extern void flow_nodes_print PARAMS ((const char *, const sbitmap,
696 FILE *));
697extern void flow_edge_list_print PARAMS ((const char *, const edge *,
698 int, FILE *));
ca6c03ca
JH
699extern void alloc_aux_for_block PARAMS ((basic_block, int));
700extern void alloc_aux_for_blocks PARAMS ((int));
108c1afc 701extern void clear_aux_for_blocks PARAMS ((void));
ca6c03ca
JH
702extern void free_aux_for_blocks PARAMS ((void));
703extern void alloc_aux_for_edge PARAMS ((edge, int));
704extern void alloc_aux_for_edges PARAMS ((int));
108c1afc 705extern void clear_aux_for_edges PARAMS ((void));
ca6c03ca 706extern void free_aux_for_edges PARAMS ((void));
11bdd2ae 707
5b99e449
JL
708/* This function is always defined so it can be called from the
709 debugger, and it is declared extern so we don't get warnings about
eebedaa5 710 it being unused. */
5b99e449 711extern void verify_flow_info PARAMS ((void));
2ecfd709
ZD
712extern bool flow_loop_outside_edge_p PARAMS ((const struct loop *, edge));
713extern bool flow_loop_nested_p PARAMS ((const struct loop *, const struct loop *));
714extern bool flow_bb_inside_loop_p PARAMS ((const struct loop *, basic_block));
715extern basic_block *get_loop_body PARAMS ((const struct loop *));
716extern int dfs_enumerate_from PARAMS ((basic_block, int,
717 bool (*)(basic_block, void *),
718 basic_block *, int, void *));
719
720extern edge loop_preheader_edge PARAMS ((struct loop *));
721extern edge loop_latch_edge PARAMS ((struct loop *));
722
723extern void add_bb_to_loop PARAMS ((basic_block, struct loop *));
724extern void remove_bb_from_loops PARAMS ((basic_block));
725extern struct loop * find_common_loop PARAMS ((struct loop *, struct loop *));
726
727extern void verify_loop_structure PARAMS ((struct loops *, int));
728#define VLS_EXPECT_PREHEADERS 1
729#define VLS_EXPECT_SIMPLE_LATCHES 2
5b99e449 730
4e872036
AS
731typedef struct conflict_graph_def *conflict_graph;
732
733/* Callback function when enumerating conflicts. The arguments are
734 the smaller and larger regno in the conflict. Returns zero if
735 enumeration is to continue, non-zero to halt enumeration. */
b0340202 736typedef int (*conflict_graph_enum_fn) PARAMS ((int, int, void *));
4e872036
AS
737
738
739/* Prototypes of operations on conflict graphs. */
740
7f8a2125 741extern conflict_graph conflict_graph_new
4e872036
AS
742 PARAMS ((int));
743extern void conflict_graph_delete PARAMS ((conflict_graph));
7f8a2125 744extern int conflict_graph_add PARAMS ((conflict_graph,
4e872036 745 int, int));
7f8a2125 746extern int conflict_graph_conflict_p PARAMS ((conflict_graph,
4e872036 747 int, int));
7f8a2125
AJ
748extern void conflict_graph_enum PARAMS ((conflict_graph, int,
749 conflict_graph_enum_fn,
4e872036
AS
750 void *));
751extern void conflict_graph_merge_regs PARAMS ((conflict_graph, int,
752 int));
753extern void conflict_graph_print PARAMS ((conflict_graph, FILE*));
7f8a2125 754extern conflict_graph conflict_graph_compute
4e872036
AS
755 PARAMS ((regset,
756 partition));
0ecf09f9 757extern bool mark_dfs_back_edges PARAMS ((void));
6c81a490 758extern void set_edge_can_fallthru_flag PARAMS ((void));
b446e5a2 759extern void update_br_prob_note PARAMS ((basic_block));
068473ec 760extern void fixup_abnormal_edges PARAMS ((void));
71d2c5bd
JH
761extern bool can_hoist_insn_p PARAMS ((rtx, rtx, regset));
762extern rtx hoist_insn_after PARAMS ((rtx, rtx, rtx, rtx));
763extern rtx hoist_insn_to_edge PARAMS ((rtx, edge, rtx, rtx));
11bdd2ae 764
f8032688
MM
765/* In dominance.c */
766
767enum cdi_direction
768{
769 CDI_DOMINATORS,
770 CDI_POST_DOMINATORS
771};
772
773extern void calculate_dominance_info PARAMS ((int *, sbitmap *,
774 enum cdi_direction));
775
88657302 776#endif /* GCC_BASIC_BLOCK_H */
This page took 0.892443 seconds and 5 git commands to generate.