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