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