]> gcc.gnu.org Git - gcc.git/blame - gcc/basic-block.h
* doc/invoke.texi: Replace references to -fdump-tree with -fdump-ast.
[gcc.git] / gcc / basic-block.h
CommitLineData
3245eea0 1/* Define control and data flow tables, and regsets.
e68e3108 2 Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3245eea0
CH
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
940d9d63
RK
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
3245eea0 20
88657302 21#ifndef GCC_BASIC_BLOCK_H
7f8a2125 22#define GCC_BASIC_BLOCK_H
3245eea0 23
19d18142 24#include "bitmap.h"
5f6c11d6 25#include "sbitmap.h"
e881bb1b 26#include "varray.h"
4e872036 27#include "partition.h"
19d18142 28
2b1d9dc0
DN
29#ifndef TREE_CODE
30union tree_node;
31#define tree union tree_node *
32#endif
33
b1dbfa1d
BS
34/* Head of register set linked list. */
35typedef bitmap_head regset_head;
36/* A pointer to a regset_head. */
37typedef bitmap regset;
38
39/* Initialize a new regset. */
40#define INIT_REG_SET(HEAD) bitmap_initialize (HEAD)
19d18142
RK
41
42/* Clear a register set by freeing up the linked list. */
43#define CLEAR_REG_SET(HEAD) bitmap_clear (HEAD)
44
45/* Copy a register set to another register set. */
46#define COPY_REG_SET(TO, FROM) bitmap_copy (TO, FROM)
47
d3a923ee
RH
48/* Compare two register sets. */
49#define REG_SET_EQUAL_P(A, B) bitmap_equal_p (A, B)
50
19d18142
RK
51/* `and' a register set with a second register set. */
52#define AND_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_AND)
53
54/* `and' the complement of a register set with a register set. */
55#define AND_COMPL_REG_SET(TO, FROM) \
56 bitmap_operation (TO, TO, FROM, BITMAP_AND_COMPL)
57
58/* Inclusive or a register set with a second register set. */
59#define IOR_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_IOR)
60
d3a923ee
RH
61/* Exclusive or a register set with a second register set. */
62#define XOR_REG_SET(TO, FROM) bitmap_operation (TO, TO, FROM, BITMAP_XOR)
63
19d18142
RK
64/* Or into TO the register set FROM1 `and'ed with the complement of FROM2. */
65#define IOR_AND_COMPL_REG_SET(TO, FROM1, FROM2) \
66 bitmap_ior_and_compl (TO, FROM1, FROM2)
916b1701
MM
67
68/* Clear a single register in a register set. */
19d18142 69#define CLEAR_REGNO_REG_SET(HEAD, REG) bitmap_clear_bit (HEAD, REG)
916b1701
MM
70
71/* Set a single register in a register set. */
19d18142 72#define SET_REGNO_REG_SET(HEAD, REG) bitmap_set_bit (HEAD, REG)
916b1701
MM
73
74/* Return true if a register is set in a register set. */
19d18142 75#define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG)
916b1701
MM
76
77/* Copy the hard registers in a register set to the hard register set. */
efc9bd41 78extern void reg_set_to_hard_reg_set PARAMS ((HARD_REG_SET *, bitmap));
916b1701
MM
79#define REG_SET_TO_HARD_REG_SET(TO, FROM) \
80do { \
916b1701 81 CLEAR_HARD_REG_SET (TO); \
efc9bd41 82 reg_set_to_hard_reg_set (&TO, FROM); \
916b1701
MM
83} while (0)
84
85/* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the
86 register number and executing CODE for all registers that are set. */
87#define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, CODE) \
19d18142 88 EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, CODE)
916b1701
MM
89
90/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
91 REGNUM to the register number and executing CODE for all registers that are
92 set in the first regset and not set in the second. */
93#define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
19d18142 94 EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
916b1701 95
22fa5b8a
MM
96/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
97 REGNUM to the register number and executing CODE for all registers that are
98 set in both regsets. */
99#define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, CODE) \
100 EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, CODE)
101
916b1701 102/* Allocate a register set with oballoc. */
19d18142 103#define OBSTACK_ALLOC_REG_SET(OBSTACK) BITMAP_OBSTACK_ALLOC (OBSTACK)
916b1701 104
ee25a7a5
MM
105/* Initialize a register set. Returns the new register set. */
106#define INITIALIZE_REG_SET(HEAD) bitmap_initialize (&HEAD)
19d18142
RK
107
108/* Do any cleanup needed on a regset when it is no longer used. */
109#define FREE_REG_SET(REGSET) BITMAP_FREE(REGSET)
110
111/* Do any one-time initializations needed for regsets. */
112#define INIT_ONCE_REG_SET() BITMAP_INIT_ONCE ()
113
114/* Grow any tables needed when the number of registers is calculated
115 or extended. For the linked list allocation, nothing needs to
116 be done, other than zero the statistics on the first allocation. */
7f8a2125 117#define MAX_REGNO_REG_SET(NUM_REGS, NEW_P, RENUMBER_P)
916b1701 118
b2aec5c0
JH
119/* Type we use to hold basic block counters. Should be at least 64bit. */
120typedef HOST_WIDEST_INT gcov_type;
121
e881bb1b
RH
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;
3245eea0 126
e881bb1b
RH
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;
3245eea0 135
e881bb1b
RH
136 int flags; /* see EDGE_* below */
137 int probability; /* biased by REG_BR_PROB_BASE */
b2aec5c0 138 gcov_type count; /* Expected number of executions calculated
51891abe 139 in profile.c */
e881bb1b 140} *edge;
3245eea0 141
e881bb1b
RH
142#define EDGE_FALLTHRU 1
143#define EDGE_CRITICAL 2
144#define EDGE_ABNORMAL 4
145#define EDGE_ABNORMAL_CALL 8
146#define EDGE_EH 16
147#define EDGE_FAKE 32
0ecf09f9 148#define EDGE_DFS_BACK 64
3245eea0 149
65b98a02
JW
150#define EDGE_COMPLEX (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
151
3245eea0 152
e68e3108
MM
153/* A basic block is a sequence of instructions with only entry and
154 only one exit. If any one of the instructions are executed, they
155 will all be executed, and in sequence from first to last.
156
157 There may be COND_EXEC instructions in the basic block. The
158 COND_EXEC *instructions* will be executed -- but if the condition
159 is false the conditionally executed *expressions* will of course
160 not be executed. We don't consider the conditionally executed
161 expression (which might have side-effects) to be in a separate
162 basic block because the program counter will always be at the same
163 location after the COND_EXEC instruction, regardless of whether the
164 condition is true or not.
165
166 Basic blocks need not start with a label nor end with a jump insn.
b53978a3
JO
167 For example, a previous basic block may just "conditionally fall"
168 into the succeeding basic block, and the last basic block need not
169 end with a jump insn. Block 0 is a descendant of the entry block.
170
171 A basic block beginning with two labels cannot have notes between
172 the labels.
173
174 Data for jump tables are stored in jump_insns that occur in no
175 basic block even though these insns can follow or precede insns in
176 basic blocks. */
177
e881bb1b
RH
178/* Basic block information indexed by block number. */
179typedef struct basic_block_def {
180 /* The first and last insns of the block. */
181 rtx head, end;
3245eea0 182
2b1d9dc0
DN
183 /* The first and last trees of the block. */
184 tree head_tree;
185 tree end_tree;
186
e881bb1b
RH
187 /* The edges into and out of the block. */
188 edge pred, succ;
4d1d8045 189
e68e3108
MM
190 /* Liveness info. */
191
192 /* The registers that are modified within this in block. */
e881bb1b 193 regset local_set;
e68e3108
MM
194 /* The registers that are conditionally modified within this block.
195 In other words, registers that are set only as part of a
196 COND_EXEC. */
7dfc0fbe 197 regset cond_local_set;
e68e3108
MM
198 /* The registers that are live on entry to this block.
199
200 Note that in SSA form, global_live_at_start does not reflect the
201 use of regs in phi functions, since the liveness of these regs
202 may depend on which edge was taken into the block. */
e881bb1b 203 regset global_live_at_start;
e68e3108 204 /* The registers that are live on exit from this block. */
e881bb1b 205 regset global_live_at_end;
4d1d8045 206
e881bb1b
RH
207 /* Auxiliary info specific to a pass. */
208 void *aux;
3245eea0 209
e881bb1b
RH
210 /* The index of this block. */
211 int index;
336a6399 212
52a11cbf
RH
213 /* The loop depth of this block. */
214 int loop_depth;
51891abe 215
52a11cbf 216 /* Expected number of executions: calculated in profile.c. */
b2aec5c0 217 gcov_type count;
7f8a2125 218
861f9cd0
JH
219 /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */
220 int frequency;
e881bb1b 221} *basic_block;
7f8a2125 222
861f9cd0 223#define BB_FREQ_MAX 10000
e881bb1b
RH
224
225/* Number of basic blocks in the current function. */
226
227extern int n_basic_blocks;
228
d3a923ee
RH
229/* Number of edges in the current function. */
230
231extern int n_edges;
232
e881bb1b
RH
233/* Index by basic block number, get basic block struct info. */
234
235extern varray_type basic_block_info;
236
237#define BASIC_BLOCK(N) (VARRAY_BB (basic_block_info, (N)))
3245eea0 238
19d18142
RK
239/* What registers are live at the setjmp call. */
240
241extern regset regs_live_at_setjmp;
242
3245eea0
CH
243/* Indexed by n, gives number of basic block that (REG n) is used in.
244 If the value is REG_BLOCK_GLOBAL (-2),
245 it means (REG n) is used in more than one basic block.
246 REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know.
247 This information remains valid for the rest of the compilation
248 of the current function; it is used to control register allocation. */
249
250#define REG_BLOCK_UNKNOWN -1
251#define REG_BLOCK_GLOBAL -2
b1f21e0a 252
6feacd09 253#define REG_BASIC_BLOCK(N) (VARRAY_REG (reg_n_info, N)->basic_block)
5ece9746
JL
254\f
255/* Stuff for recording basic block info. */
256
e881bb1b
RH
257#define BLOCK_HEAD(B) (BASIC_BLOCK (B)->head)
258#define BLOCK_END(B) (BASIC_BLOCK (B)->end)
5ece9746 259
2b1d9dc0
DN
260#define BLOCK_HEAD_TREE(B) (BASIC_BLOCK (B)->head_tree)
261#define BLOCK_END_TREE(B) (BASIC_BLOCK (B)->end_tree)
262
5ece9746
JL
263/* Special block numbers [markers] for entry and exit. */
264#define ENTRY_BLOCK (-1)
265#define EXIT_BLOCK (-2)
266
b53978a3
JO
267/* Special block number not valid for any block. */
268#define INVALID_BLOCK (-3)
269
e881bb1b
RH
270/* Similarly, block pointers for the edge list. */
271extern struct basic_block_def entry_exit_blocks[2];
272#define ENTRY_BLOCK_PTR (&entry_exit_blocks[0])
273#define EXIT_BLOCK_PTR (&entry_exit_blocks[1])
274
e881bb1b
RH
275extern varray_type basic_block_for_insn;
276#define BLOCK_FOR_INSN(INSN) VARRAY_BB (basic_block_for_insn, INSN_UID (INSN))
277#define BLOCK_NUM(INSN) (BLOCK_FOR_INSN (INSN)->index + 0)
278
3d994c6b 279extern void compute_bb_for_insn PARAMS ((int));
c586192c 280extern void update_bb_for_insn PARAMS ((basic_block));
3d994c6b 281extern void set_block_for_insn PARAMS ((rtx, basic_block));
ccbaf064 282extern void set_block_for_new_insns PARAMS ((rtx, basic_block));
e881bb1b 283
3d994c6b 284extern void free_basic_block_vars PARAMS ((int));
52becdc0 285
c586192c 286extern edge split_block PARAMS ((basic_block, rtx));
3d994c6b
KG
287extern basic_block split_edge PARAMS ((edge));
288extern void insert_insn_on_edge PARAMS ((rtx, edge));
289extern void commit_edge_insertions PARAMS ((void));
290extern void remove_fake_edges PARAMS ((void));
291extern void add_noreturn_fake_exit_edges PARAMS ((void));
b53978a3 292extern void connect_infinite_loops_to_exit PARAMS ((void));
7f8a2125 293extern int flow_call_edges_add PARAMS ((sbitmap));
69732dcb 294extern rtx flow_delete_insn PARAMS ((rtx));
3d994c6b 295extern void flow_delete_insn_chain PARAMS ((rtx, rtx));
69732dcb
RH
296extern void make_edge PARAMS ((sbitmap *, basic_block,
297 basic_block, int));
298extern void remove_edge PARAMS ((edge));
f008a564 299extern void redirect_edge_succ PARAMS ((edge, basic_block));
ca9fef16 300extern void redirect_edge_succ_nodup PARAMS ((edge, basic_block));
f008a564 301extern void redirect_edge_pred PARAMS ((edge, basic_block));
295ae817 302extern void create_basic_block PARAMS ((int, rtx, rtx, rtx));
52294521 303extern int flow_delete_block PARAMS ((basic_block));
dc108b7a
RH
304extern void merge_blocks_nomove PARAMS ((basic_block, basic_block));
305extern void tidy_fallthru_edge PARAMS ((edge, basic_block,
306 basic_block));
10c4b247 307extern int flow_depth_first_order_compute PARAMS ((int *, int *));
316dcdf6
DN
308extern void dump_edge_info PARAMS ((FILE *, edge, int));
309extern void clear_edges PARAMS ((void));
310extern void mark_critical_edges PARAMS ((void));
b62c8881 311extern rtx first_insn_after_basic_block_note PARAMS ((basic_block));
10c4b247 312
4dc9341c
MH
313/* Structure to hold information for each natural loop. */
314struct loop
315{
c34d5374 316 /* Index into loops array. */
4dc9341c
MH
317 int num;
318
319 /* Basic block of loop header. */
320 basic_block header;
321
322 /* Basic block of loop latch. */
323 basic_block latch;
324
325 /* Basic block of loop pre-header or NULL if it does not exist. */
326 basic_block pre_header;
327
7f8a2125 328 /* Array of edges along the pre-header extended basic block trace.
4a7da9b5
MH
329 The source of the first edge is the root node of pre-header
330 extended basic block, if it exists. */
331 edge *pre_header_edges;
5d6a16e2 332
4a7da9b5
MH
333 /* Number of edges along the pre_header extended basic block trace. */
334 int num_pre_header_edges;
5d6a16e2 335
65169dcf
JE
336 /* The first block in the loop. This is not necessarily the same as
337 the loop header. */
338 basic_block first;
339
340 /* The last block in the loop. This is not necessarily the same as
341 the loop latch. */
342 basic_block last;
343
4dc9341c
MH
344 /* Bitmap of blocks contained within the loop. */
345 sbitmap nodes;
346
347 /* Number of blocks contained within the loop. */
348 int num_nodes;
349
135ebc36
MH
350 /* Array of edges that enter the loop. */
351 edge *entry_edges;
352
353 /* Number of edges that enter the loop. */
354 int num_entries;
355
4dc9341c 356 /* Array of edges that exit the loop. */
135ebc36 357 edge *exit_edges;
4dc9341c
MH
358
359 /* Number of edges that exit the loop. */
360 int num_exits;
361
5d6a16e2
MH
362 /* Bitmap of blocks that dominate all exits of the loop. */
363 sbitmap exits_doms;
364
4dc9341c
MH
365 /* The loop nesting depth. */
366 int depth;
367
368 /* The height of the loop (enclosed loop levels) within the loop
369 hierarchy tree. */
370 int level;
371
372 /* The outer (parent) loop or NULL if outermost loop. */
373 struct loop *outer;
374
375 /* The first inner (child) loop or NULL if innermost loop. */
376 struct loop *inner;
377
378 /* Link to the next (sibling) loop. */
379 struct loop *next;
380
381 /* Non-zero if the loop shares a header with another loop. */
382 int shared;
383
384 /* Non-zero if the loop is invalid (e.g., contains setjmp.). */
385 int invalid;
386
387 /* Auxiliary info specific to a pass. */
52b38064 388 void *aux;
a2be868f
MH
389
390 /* The following are currently used by loop.c but they are likely to
391 disappear as loop.c is converted to use the CFG. */
392
393 /* Non-zero if the loop has a NOTE_INSN_LOOP_VTOP. */
394 rtx vtop;
395
396 /* Non-zero if the loop has a NOTE_INSN_LOOP_CONT.
397 A continue statement will generate a branch to NEXT_INSN (cont). */
398 rtx cont;
399
400 /* The dominator of cont. */
401 rtx cont_dominator;
402
403 /* The NOTE_INSN_LOOP_BEG. */
404 rtx start;
405
406 /* The NOTE_INSN_LOOP_END. */
407 rtx end;
408
409 /* For a rotated loop that is entered near the bottom,
410 this is the label at the top. Otherwise it is zero. */
411 rtx top;
412
413 /* Place in the loop where control enters. */
414 rtx scan_start;
415
96a45535
MH
416 /* The position where to sink insns out of the loop. */
417 rtx sink;
418
a2be868f
MH
419 /* List of all LABEL_REFs which refer to code labels outside the
420 loop. Used by routines that need to know all loop exits, such as
421 final_biv_value and final_giv_value.
7f8a2125 422
a2be868f
MH
423 This does not include loop exits due to return instructions.
424 This is because all bivs and givs are pseudos, and hence must be
425 dead after a return, so the presense of a return does not affect
426 any of the optimizations that use this info. It is simpler to
427 just not include return instructions on this list. */
428 rtx exit_labels;
429
430 /* The number of LABEL_REFs on exit_labels for this loop and all
431 loops nested inside it. */
432 int exit_count;
4dc9341c
MH
433};
434
435
436/* Structure to hold CFG information about natural loops within a function. */
437struct loops
438{
439 /* Number of natural loops in the function. */
440 int num;
441
d6181b1b
MH
442 /* Maxium nested loop level in the function. */
443 int levels;
444
4dc9341c
MH
445 /* Array of natural loop descriptors (scanning this array in reverse order
446 will find the inner loops before their enclosing outer loops). */
447 struct loop *array;
448
449 /* Pointer to root of loop heirachy tree. */
2b1d9dc0 450 struct loop *tree_root;
4dc9341c
MH
451
452 /* Information derived from the CFG. */
453 struct cfg
454 {
455 /* The bitmap vector of dominators or NULL if not computed. */
456 sbitmap *dom;
457
458 /* The ordering of the basic blocks in a depth first search. */
459 int *dfs_order;
c34d5374
MH
460
461 /* The reverse completion ordering of the basic blocks found in a
462 depth first search. */
463 int *rc_order;
4dc9341c
MH
464 } cfg;
465
466 /* Headers shared by multiple loops that should be merged. */
467 sbitmap shared_headers;
468};
469
5d6a16e2
MH
470extern int flow_loops_find PARAMS ((struct loops *, int flags));
471extern int flow_loops_update PARAMS ((struct loops *, int flags));
3d994c6b 472extern void flow_loops_free PARAMS ((struct loops *));
6057c0e6
MH
473extern void flow_loops_dump PARAMS ((const struct loops *, FILE *,
474 void (*)(const struct loop *,
475 FILE *, int), int));
476extern void flow_loop_dump PARAMS ((const struct loop *, FILE *,
477 void (*)(const struct loop *,
478 FILE *, int), int));
eab02feb 479extern int flow_loop_scan PARAMS ((struct loops *, struct loop *, int));
4dc9341c 480
410538ea 481/* This structure maintains an edge list vector. */
7f8a2125 482struct edge_list
410538ea
AM
483{
484 int num_blocks;
485 int num_edges;
486 edge *index_to_edge;
487};
488
489/* This is the value which indicates no edge is present. */
490#define EDGE_INDEX_NO_EDGE -1
491
492/* EDGE_INDEX returns an integer index for an edge, or EDGE_INDEX_NO_EDGE
493 if there is no edge between the 2 basic blocks. */
494#define EDGE_INDEX(el, pred, succ) (find_edge_index ((el), (pred), (succ)))
495
496/* INDEX_EDGE_PRED_BB and INDEX_EDGE_SUCC_BB return a pointer to the basic
497 block which is either the pred or succ end of the indexed edge. */
498#define INDEX_EDGE_PRED_BB(el, index) ((el)->index_to_edge[(index)]->src)
499#define INDEX_EDGE_SUCC_BB(el, index) ((el)->index_to_edge[(index)]->dest)
500
501/* INDEX_EDGE returns a pointer to the edge. */
502#define INDEX_EDGE(el, index) ((el)->index_to_edge[(index)])
503
504/* Number of edges in the compressed edge list. */
505#define NUM_EDGES(el) ((el)->num_edges)
506
7a442791
JH
507/* BB is assumed to contain conditional jump. Return the fallthru edge. */
508#define FALLTHRU_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
509 ? (bb)->succ : (bb)->succ->succ_next)
510
511/* BB is assumed to contain conditional jump. Return the branch edge. */
512#define BRANCH_EDGE(bb) ((bb)->succ->flags & EDGE_FALLTHRU \
513 ? (bb)->succ->succ_next : (bb)->succ)
514
134d3a2e
JH
515/* Return expected execution frequency of the edge E. */
516#define EDGE_FREQUENCY(e) (((e)->src->frequency \
517 * (e)->probability \
518 + REG_BR_PROB_BASE / 2) \
519 / REG_BR_PROB_BASE)
520
3d994c6b
KG
521struct edge_list * create_edge_list PARAMS ((void));
522void free_edge_list PARAMS ((struct edge_list *));
523void print_edge_list PARAMS ((FILE *, struct edge_list *));
524void verify_edge_list PARAMS ((FILE *, struct edge_list *));
7f8a2125 525int find_edge_index PARAMS ((struct edge_list *,
3d994c6b 526 basic_block, basic_block));
410538ea 527
49c3bb12 528
d3a923ee
RH
529enum update_life_extent
530{
715e7fbc
RH
531 UPDATE_LIFE_LOCAL = 0,
532 UPDATE_LIFE_GLOBAL = 1,
5a425893 533 UPDATE_LIFE_GLOBAL_RM_NOTES = 2
d3a923ee
RH
534};
535
49c3bb12
RH
536/* Flags for life_analysis and update_life_info. */
537
538#define PROP_DEATH_NOTES 1 /* Create DEAD and UNUSED notes. */
539#define PROP_LOG_LINKS 2 /* Create LOG_LINKS. */
540#define PROP_REG_INFO 4 /* Update regs_ever_live et al. */
541#define PROP_KILL_DEAD_CODE 8 /* Remove dead code. */
542#define PROP_SCAN_DEAD_CODE 16 /* Scan for dead code. */
11f68165
JW
543#define PROP_ALLOW_CFG_CHANGES 32 /* Allow the CFG to be changed
544 by dead code removal. */
545#define PROP_AUTOINC 64 /* Create autoinc mem references. */
546#define PROP_FINAL 127 /* All of the above. */
5d6a16e2 547
46fac664
JH
548#define CLEANUP_EXPENSIVE 1 /* Do relativly expensive optimizations
549 except for edge forwarding */
550#define CLEANUP_CROSSJUMP 2 /* Do crossjumping. */
551#define CLEANUP_POST_REGSTACK 4 /* We run after reg-stack and need
552 to care REG_DEAD notes. */
4793dca1
JH
553#define CLEANUP_PRE_SIBCALL 8 /* Do not get confused by code hidden
554 inside call_placeholders.. */
0068fd96
JH
555#define CLEANUP_PRE_LOOP 16 /* Take care to preserve syntactic loop
556 notes. */
5d6a16e2
MH
557/* Flags for loop discovery. */
558
7f8a2125 559#define LOOP_TREE 1 /* Build loop hierarchy tree. */
5d6a16e2 560#define LOOP_PRE_HEADER 2 /* Analyse loop pre-header. */
7f8a2125
AJ
561#define LOOP_ENTRY_EDGES 4 /* Find entry edges. */
562#define LOOP_EXIT_EDGES 8 /* Find exit edges. */
eab02feb 563#define LOOP_EDGES (LOOP_ENTRY_EDGES | LOOP_EXIT_EDGES)
7f8a2125
AJ
564#define LOOP_EXITS_DOMS 16 /* Find nodes that dom. all exits. */
565#define LOOP_ALL 31 /* All of the above */
5d6a16e2 566
7f8a79ba 567extern void life_analysis PARAMS ((rtx, FILE *, int));
3d994c6b
KG
568extern void update_life_info PARAMS ((sbitmap, enum update_life_extent,
569 int));
570extern int count_or_remove_death_notes PARAMS ((sbitmap, int));
11f68165 571extern int propagate_block PARAMS ((basic_block, regset, regset, regset,
7dfc0fbe 572 int));
292f3869
RH
573
574struct propagate_block_info;
575extern rtx propagate_one_insn PARAMS ((struct propagate_block_info *, rtx));
576extern struct propagate_block_info *init_propagate_block_info
7dfc0fbe 577 PARAMS ((basic_block, regset, regset, regset, int));
292f3869 578extern void free_propagate_block_info PARAMS ((struct propagate_block_info *));
d3a923ee 579
077692c6 580/* In lcm.c */
7f8a2125
AJ
581extern struct edge_list *pre_edge_lcm PARAMS ((FILE *, int, sbitmap *,
582 sbitmap *, sbitmap *,
3d994c6b
KG
583 sbitmap *, sbitmap **,
584 sbitmap **));
585extern struct edge_list *pre_edge_rev_lcm PARAMS ((FILE *, int, sbitmap *,
7f8a2125
AJ
586 sbitmap *, sbitmap *,
587 sbitmap *, sbitmap **,
3d994c6b
KG
588 sbitmap **));
589extern void compute_available PARAMS ((sbitmap *, sbitmap *,
590 sbitmap *, sbitmap *));
97d36f45 591extern int optimize_mode_switching PARAMS ((FILE *));
a05924f9
JH
592
593/* In emit-rtl.c. */
3d994c6b
KG
594extern rtx emit_block_insn_after PARAMS ((rtx, rtx, basic_block));
595extern rtx emit_block_insn_before PARAMS ((rtx, rtx, basic_block));
4dc9341c 596
f1ebdfc5
JE
597/* In predict.c */
598extern void estimate_probability PARAMS ((struct loops *));
994a57cd 599extern void expected_value_to_br_prob PARAMS ((void));
f1ebdfc5 600
11bdd2ae 601/* In flow.c */
1f8f4a0b 602extern void init_flow PARAMS ((void));
11bdd2ae 603extern void reorder_basic_blocks PARAMS ((void));
b7ba4d8d
ZW
604extern void dump_bb PARAMS ((basic_block, FILE *));
605extern void debug_bb PARAMS ((basic_block));
606extern void debug_bb_n PARAMS ((int));
607extern void dump_regset PARAMS ((regset, FILE *));
608extern void debug_regset PARAMS ((regset));
1f8f4a0b 609extern void allocate_reg_life_data PARAMS ((void));
c319629b 610extern void allocate_bb_life_data PARAMS ((void));
1e29ee12 611extern void find_unreachable_blocks PARAMS ((void));
0005550b 612extern void delete_noop_moves PARAMS ((rtx));
7f8a2125 613extern rtx last_loop_beg_note PARAMS ((rtx));
6b24c259
JH
614extern basic_block redirect_edge_and_branch_force PARAMS ((edge, basic_block));
615extern bool redirect_edge_and_branch PARAMS ((edge, basic_block));
616extern rtx block_label PARAMS ((basic_block));
617extern bool forwarder_block_p PARAMS ((basic_block));
39f95a2c
JH
618extern bool purge_all_dead_edges PARAMS ((void));
619extern bool purge_dead_edges PARAMS ((basic_block));
0005550b 620extern void find_sub_basic_blocks PARAMS ((basic_block));
6b24c259 621
11bdd2ae 622
5b99e449
JL
623/* This function is always defined so it can be called from the
624 debugger, and it is declared extern so we don't get warnings about
625 it being unused. */
626extern void verify_flow_info PARAMS ((void));
627extern int flow_loop_outside_edge_p PARAMS ((const struct loop *, edge));
628
4e872036
AS
629typedef struct conflict_graph_def *conflict_graph;
630
631/* Callback function when enumerating conflicts. The arguments are
632 the smaller and larger regno in the conflict. Returns zero if
633 enumeration is to continue, non-zero to halt enumeration. */
b0340202 634typedef int (*conflict_graph_enum_fn) PARAMS ((int, int, void *));
4e872036
AS
635
636
637/* Prototypes of operations on conflict graphs. */
638
7f8a2125 639extern conflict_graph conflict_graph_new
4e872036
AS
640 PARAMS ((int));
641extern void conflict_graph_delete PARAMS ((conflict_graph));
7f8a2125 642extern int conflict_graph_add PARAMS ((conflict_graph,
4e872036 643 int, int));
7f8a2125 644extern int conflict_graph_conflict_p PARAMS ((conflict_graph,
4e872036 645 int, int));
7f8a2125
AJ
646extern void conflict_graph_enum PARAMS ((conflict_graph, int,
647 conflict_graph_enum_fn,
4e872036
AS
648 void *));
649extern void conflict_graph_merge_regs PARAMS ((conflict_graph, int,
650 int));
651extern void conflict_graph_print PARAMS ((conflict_graph, FILE*));
7f8a2125 652extern conflict_graph conflict_graph_compute
4e872036
AS
653 PARAMS ((regset,
654 partition));
0ecf09f9 655extern bool mark_dfs_back_edges PARAMS ((void));
11bdd2ae 656
f8032688
MM
657/* In dominance.c */
658
659enum cdi_direction
660{
661 CDI_DOMINATORS,
662 CDI_POST_DOMINATORS
663};
664
665extern void calculate_dominance_info PARAMS ((int *, sbitmap *,
666 enum cdi_direction));
667
88657302 668#endif /* GCC_BASIC_BLOCK_H */
This page took 0.792631 seconds and 5 git commands to generate.