]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/basic-block.h
coretypes.h (struct simple_bitmap_def, [...]): New core types.
[thirdparty/gcc.git] / gcc / basic-block.h
CommitLineData
7a8cba34 1/* Define control flow data structures for the CFG.
6fb5fa3c 2 Copyright (C) 1987, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
c75c517d 3 2005, 2006, 2007, 2008, 2009, 2010 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
9dcd6f09 9Software Foundation; either version 3, or (at your option) any later
1322177d 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
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
3245eea0 20
88657302 21#ifndef GCC_BASIC_BLOCK_H
7f8a2125 22#define GCC_BASIC_BLOCK_H
3245eea0 23
6de9cd9a 24#include "predict.h"
628f6a4e 25#include "vec.h"
997de8ed 26#include "function.h"
19d18142 27
4977bab6
ZW
28/* Type we use to hold basic block counters. Should be at least
29 64bit. Although a counter cannot be negative, we use a signed
30 type, because erroneous negative counts can be generated when the
31 flow graph is manipulated by various optimizations. A signed type
32dd366d 32 makes those easy to detect. */
b2aec5c0
JH
33typedef HOST_WIDEST_INT gcov_type;
34
e881bb1b 35/* Control flow edge information. */
d1b38208 36struct GTY(()) edge_def {
e881bb1b 37 /* The two blocks at the ends of the edge. */
6de9cd9a
DN
38 struct basic_block_def *src;
39 struct basic_block_def *dest;
e881bb1b
RH
40
41 /* Instructions queued on the edge. */
6de9cd9a 42 union edge_def_insns {
726a989a 43 gimple_seq GTY ((tag ("true"))) g;
52bca999
SB
44 rtx GTY ((tag ("false"))) r;
45 } GTY ((desc ("current_ir_type () == IR_GIMPLE"))) insns;
e881bb1b
RH
46
47 /* Auxiliary info specific to a pass. */
6de9cd9a 48 PTR GTY ((skip (""))) aux;
3245eea0 49
7241571e
JJ
50 /* Location of any goto implicit in the edge and associated BLOCK. */
51 tree goto_block;
2d593c86 52 location_t goto_locus;
62b857ea 53
2eac9a76
RG
54 /* The index number corresponding to this edge in the edge vector
55 dest->preds. */
56 unsigned int dest_idx;
57
e881bb1b
RH
58 int flags; /* see EDGE_* below */
59 int probability; /* biased by REG_BR_PROB_BASE */
b2aec5c0 60 gcov_type count; /* Expected number of executions calculated
51891abe 61 in profile.c */
6de9cd9a
DN
62};
63
d4e6fecb
NS
64DEF_VEC_P(edge);
65DEF_VEC_ALLOC_P(edge,gc);
ca83d385 66DEF_VEC_ALLOC_P(edge,heap);
3245eea0 67
6c208acd
NS
68#define EDGE_FALLTHRU 1 /* 'Straight line' flow */
69#define EDGE_ABNORMAL 2 /* Strange flow, like computed
70 label, or eh */
71#define EDGE_ABNORMAL_CALL 4 /* Call with abnormal exit
72 like an exception, or sibcall */
73#define EDGE_EH 8 /* Exception throw */
74#define EDGE_FAKE 16 /* Not a real edge (profile.c) */
75#define EDGE_DFS_BACK 32 /* A backwards edge */
76#define EDGE_CAN_FALLTHRU 64 /* Candidate for straight line
4b7e68e7 77 flow. */
35b07080 78#define EDGE_IRREDUCIBLE_LOOP 128 /* Part of irreducible loop. */
1722c2c8 79#define EDGE_SIBCALL 256 /* Edge from sibcall to exit. */
65f43cdf 80#define EDGE_LOOP_EXIT 512 /* Exit of a loop. */
6de9cd9a 81#define EDGE_TRUE_VALUE 1024 /* Edge taken when controlling
b01d837f 82 predicate is nonzero. */
6de9cd9a
DN
83#define EDGE_FALSE_VALUE 2048 /* Edge taken when controlling
84 predicate is zero. */
85#define EDGE_EXECUTABLE 4096 /* Edge is executable. Only
86 valid during SSA-CCP. */
bd454efd
SB
87#define EDGE_CROSSING 8192 /* Edge crosses between hot
88 and cold sections, when we
89 do partitioning. */
90#define EDGE_ALL_FLAGS 16383
3245eea0 91
65b98a02
JW
92#define EDGE_COMPLEX (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
93
cdb23767 94/* Counter summary from the last set of coverage counts read by
71c0e7fc 95 profile.c. */
cdb23767
NS
96extern const struct gcov_ctr_summary *profile_info;
97
3d436d2a
ZD
98/* Declared in cfgloop.h. */
99struct loop;
3245eea0 100
4aab792d
KH
101/* Declared in tree-flow.h. */
102struct edge_prediction;
5e2d947c 103struct rtl_bb_info;
4aab792d 104
e68e3108
MM
105/* A basic block is a sequence of instructions with only entry and
106 only one exit. If any one of the instructions are executed, they
107 will all be executed, and in sequence from first to last.
108
109 There may be COND_EXEC instructions in the basic block. The
110 COND_EXEC *instructions* will be executed -- but if the condition
111 is false the conditionally executed *expressions* will of course
112 not be executed. We don't consider the conditionally executed
113 expression (which might have side-effects) to be in a separate
114 basic block because the program counter will always be at the same
115 location after the COND_EXEC instruction, regardless of whether the
116 condition is true or not.
117
118 Basic blocks need not start with a label nor end with a jump insn.
b53978a3
JO
119 For example, a previous basic block may just "conditionally fall"
120 into the succeeding basic block, and the last basic block need not
121 end with a jump insn. Block 0 is a descendant of the entry block.
122
123 A basic block beginning with two labels cannot have notes between
124 the labels.
125
126 Data for jump tables are stored in jump_insns that occur in no
127 basic block even though these insns can follow or precede insns in
128 basic blocks. */
129
e881bb1b 130/* Basic block information indexed by block number. */
d1b38208 131struct GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb"))) basic_block_def {
e881bb1b 132 /* The edges into and out of the block. */
d4e6fecb
NS
133 VEC(edge,gc) *preds;
134 VEC(edge,gc) *succs;
4d1d8045 135
e881bb1b 136 /* Auxiliary info specific to a pass. */
6de9cd9a 137 PTR GTY ((skip (""))) aux;
3245eea0 138
076c7ab8 139 /* Innermost loop containing the block. */
9e2f83a5 140 struct loop *loop_father;
076c7ab8
ZW
141
142 /* The dominance and postdominance information node. */
143 struct et_node * GTY ((skip (""))) dom[2];
336a6399 144
918ed612 145 /* Previous and next blocks in the chain. */
6de9cd9a
DN
146 struct basic_block_def *prev_bb;
147 struct basic_block_def *next_bb;
918ed612 148
5e2d947c 149 union basic_block_il_dependent {
726a989a 150 struct gimple_bb_info * GTY ((tag ("0"))) gimple;
5e2d947c
JH
151 struct rtl_bb_info * GTY ((tag ("1"))) rtl;
152 } GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il;
153
52a11cbf 154 /* Expected number of executions: calculated in profile.c. */
b2aec5c0 155 gcov_type count;
7f8a2125 156
076c7ab8
ZW
157 /* The index of this block. */
158 int index;
159
160 /* The loop depth of this block. */
161 int loop_depth;
162
861f9cd0
JH
163 /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */
164 int frequency;
006844a3 165
6c52e687
CC
166 /* The discriminator for this block. */
167 int discriminator;
168
006844a3
DN
169 /* Various flags. See BB_* below. */
170 int flags;
6de9cd9a
DN
171};
172
d1b38208 173struct GTY(()) rtl_bb_info {
5e2d947c
JH
174 /* The first and last insns of the block. */
175 rtx head_;
176 rtx end_;
177
370369e1
JH
178 /* In CFGlayout mode points to insn notes/jumptables to be placed just before
179 and after the block. */
6de9cd9a
DN
180 rtx header;
181 rtx footer;
997de8ed 182
997de8ed 183 /* This field is used by the bb-reorder and tracer passes. */
6de9cd9a 184 int visited;
997de8ed
SB
185};
186
d1b38208 187struct GTY(()) gimple_bb_info {
726a989a
RB
188 /* Sequence of statements in this block. */
189 gimple_seq seq;
7506e1cb 190
726a989a
RB
191 /* PHI nodes for this block. */
192 gimple_seq phi_nodes;
7506e1cb
ZD
193};
194
c71070ab
KH
195DEF_VEC_P(basic_block);
196DEF_VEC_ALLOC_P(basic_block,gc);
197DEF_VEC_ALLOC_P(basic_block,heap);
198
861f9cd0 199#define BB_FREQ_MAX 10000
e881bb1b 200
740ce53d
SB
201/* Masks for basic_block.flags.
202
740ce53d
SB
203 BB_HOT_PARTITION and BB_COLD_PARTITION should be preserved throughout
204 the compilation, so they are never cleared.
205
206 All other flags may be cleared by clear_bb_flags(). It is generally
207 a bad idea to rely on any flags being up-to-date. */
208
2dd2d53e 209enum bb_flags
9e32d2be 210{
9e32d2be 211 /* Only set on blocks that have just been created by create_bb. */
6fb5fa3c 212 BB_NEW = 1 << 0,
740ce53d 213
9e32d2be
ZD
214 /* Set by find_unreachable_blocks. Do not rely on this being set in any
215 pass. */
6fb5fa3c 216 BB_REACHABLE = 1 << 1,
740ce53d 217
9e32d2be 218 /* Set for blocks in an irreducible loop by loop analysis. */
6fb5fa3c 219 BB_IRREDUCIBLE_LOOP = 1 << 2,
740ce53d 220
9e32d2be 221 /* Set on blocks that may actually not be single-entry single-exit block. */
6fb5fa3c 222 BB_SUPERBLOCK = 1 << 3,
076c7ab8 223
9e32d2be
ZD
224 /* Set on basic blocks that the scheduler should not touch. This is used
225 by SMS to prevent other schedulers from messing with the loop schedule. */
6fb5fa3c 226 BB_DISABLE_SCHEDULE = 1 << 4,
740ce53d 227
9e32d2be 228 /* Set on blocks that should be put in a hot section. */
6fb5fa3c 229 BB_HOT_PARTITION = 1 << 5,
740ce53d 230
9e32d2be 231 /* Set on blocks that should be put in a cold section. */
6fb5fa3c 232 BB_COLD_PARTITION = 1 << 6,
6580ee77
JH
233
234 /* Set on block that was duplicated. */
6fb5fa3c
DB
235 BB_DUPLICATED = 1 << 7,
236
237 /* Set if the label at the top of this block is the target of a non-local goto. */
238 BB_NON_LOCAL_GOTO_TARGET = 1 << 8,
5e2d947c
JH
239
240 /* Set on blocks that are in RTL format. */
6fb5fa3c 241 BB_RTL = 1 << 9 ,
2dd2d53e
SB
242
243 /* Set on blocks that are forwarder blocks.
244 Only used in cfgcleanup.c. */
6fb5fa3c 245 BB_FORWARDER_BLOCK = 1 << 10,
2dd2d53e
SB
246
247 /* Set on blocks that cannot be threaded through.
248 Only used in cfgcleanup.c. */
6fb5fa3c 249 BB_NONTHREADABLE_BLOCK = 1 << 11
9e32d2be 250};
740ce53d
SB
251
252/* Dummy flag for convenience in the hot/cold partitioning code. */
076c7ab8 253#define BB_UNPARTITIONED 0
006844a3 254
750054a2
CT
255/* Partitions, to be used when partitioning hot and cold basic blocks into
256 separate sections. */
076c7ab8 257#define BB_PARTITION(bb) ((bb)->flags & (BB_HOT_PARTITION|BB_COLD_PARTITION))
51a904c9
ZW
258#define BB_SET_PARTITION(bb, part) do { \
259 basic_block bb_ = (bb); \
260 bb_->flags = ((bb_->flags & ~(BB_HOT_PARTITION|BB_COLD_PARTITION)) \
261 | (part)); \
262} while (0)
263
076c7ab8
ZW
264#define BB_COPY_PARTITION(dstbb, srcbb) \
265 BB_SET_PARTITION (dstbb, BB_PARTITION (srcbb))
750054a2 266
8fee41c2
ZD
267/* State of dominance information. */
268
269enum dom_state
270{
271 DOM_NONE, /* Not computed at all. */
272 DOM_NO_FAST_QUERY, /* The data is OK, but the fast query data are not usable. */
273 DOM_OK /* Everything is ok. */
274};
275
24b97832 276/* What sort of profiling information we have. */
c6a21142 277enum profile_status_d
24b97832
ILT
278{
279 PROFILE_ABSENT,
280 PROFILE_GUESSED,
281 PROFILE_READ
282};
283
997de8ed
SB
284/* A structure to group all the per-function control flow graph data.
285 The x_* prefixing is necessary because otherwise references to the
286 fields of this struct are interpreted as the defines for backward
287 source compatibility following the definition of this struct. */
d1b38208 288struct GTY(()) control_flow_graph {
997de8ed
SB
289 /* Block pointers for the exit and entry of a function.
290 These are always the head and tail of the basic block list. */
291 basic_block x_entry_block_ptr;
292 basic_block x_exit_block_ptr;
293
294 /* Index by basic block number, get basic block struct info. */
68f9b844 295 VEC(basic_block,gc) *x_basic_block_info;
997de8ed
SB
296
297 /* Number of basic blocks in this flow graph. */
298 int x_n_basic_blocks;
e881bb1b 299
997de8ed
SB
300 /* Number of edges in this flow graph. */
301 int x_n_edges;
e881bb1b 302
997de8ed
SB
303 /* The first free basic block number. */
304 int x_last_basic_block;
d55bc081 305
997de8ed 306 /* Mapping of labels to their associated blocks. At present
726a989a 307 only used for the gimple CFG. */
e597f337 308 VEC(basic_block,gc) *x_label_to_block_map;
d55bc081 309
c6a21142 310 enum profile_status_d x_profile_status;
8fee41c2
ZD
311
312 /* Whether the dominators and the postdominators are available. */
313 enum dom_state x_dom_computed[2];
314
315 /* Number of basic blocks in the dominance tree. */
316 unsigned x_n_bbs_in_dom_tree[2];
cb91fab0
JH
317
318 /* Maximal number of entities in the single jumptable. Used to estimate
319 final flowgraph size. */
320 int max_jumptable_ents;
321
322 /* UIDs for LABEL_DECLs. */
323 int last_label_uid;
997de8ed 324};
d3a923ee 325
997de8ed
SB
326/* Defines for accessing the fields of the CFG structure for function FN. */
327#define ENTRY_BLOCK_PTR_FOR_FUNCTION(FN) ((FN)->cfg->x_entry_block_ptr)
328#define EXIT_BLOCK_PTR_FOR_FUNCTION(FN) ((FN)->cfg->x_exit_block_ptr)
329#define basic_block_info_for_function(FN) ((FN)->cfg->x_basic_block_info)
330#define n_basic_blocks_for_function(FN) ((FN)->cfg->x_n_basic_blocks)
331#define n_edges_for_function(FN) ((FN)->cfg->x_n_edges)
332#define last_basic_block_for_function(FN) ((FN)->cfg->x_last_basic_block)
333#define label_to_block_map_for_function(FN) ((FN)->cfg->x_label_to_block_map)
9defb1fe 334#define profile_status_for_function(FN) ((FN)->cfg->x_profile_status)
997de8ed
SB
335
336#define BASIC_BLOCK_FOR_FUNCTION(FN,N) \
68f9b844 337 (VEC_index (basic_block, basic_block_info_for_function(FN), (N)))
9defb1fe
DN
338#define SET_BASIC_BLOCK_FOR_FUNCTION(FN,N,BB) \
339 (VEC_replace (basic_block, basic_block_info_for_function(FN), (N), (BB)))
997de8ed 340
f0e4ea10 341/* Defines for textual backward source compatibility. */
997de8ed
SB
342#define ENTRY_BLOCK_PTR (cfun->cfg->x_entry_block_ptr)
343#define EXIT_BLOCK_PTR (cfun->cfg->x_exit_block_ptr)
344#define basic_block_info (cfun->cfg->x_basic_block_info)
345#define n_basic_blocks (cfun->cfg->x_n_basic_blocks)
346#define n_edges (cfun->cfg->x_n_edges)
347#define last_basic_block (cfun->cfg->x_last_basic_block)
348#define label_to_block_map (cfun->cfg->x_label_to_block_map)
349#define profile_status (cfun->cfg->x_profile_status)
350
68f9b844
KH
351#define BASIC_BLOCK(N) (VEC_index (basic_block, basic_block_info, (N)))
352#define SET_BASIC_BLOCK(N,BB) (VEC_replace (basic_block, basic_block_info, (N), (BB)))
d3a923ee 353
918ed612
ZD
354/* For iterating over basic blocks. */
355#define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
356 for (BB = FROM; BB != TO; BB = BB->DIR)
357
997de8ed
SB
358#define FOR_EACH_BB_FN(BB, FN) \
359 FOR_BB_BETWEEN (BB, (FN)->cfg->x_entry_block_ptr->next_bb, (FN)->cfg->x_exit_block_ptr, next_bb)
360
361#define FOR_EACH_BB(BB) FOR_EACH_BB_FN (BB, cfun)
918ed612 362
997de8ed
SB
363#define FOR_EACH_BB_REVERSE_FN(BB, FN) \
364 FOR_BB_BETWEEN (BB, (FN)->cfg->x_exit_block_ptr->prev_bb, (FN)->cfg->x_entry_block_ptr, prev_bb)
365
366#define FOR_EACH_BB_REVERSE(BB) FOR_EACH_BB_REVERSE_FN(BB, cfun)
918ed612 367
50654f6c
ZD
368/* For iterating over insns in basic block. */
369#define FOR_BB_INSNS(BB, INSN) \
370 for ((INSN) = BB_HEAD (BB); \
24bd1a0b 371 (INSN) && (INSN) != NEXT_INSN (BB_END (BB)); \
50654f6c
ZD
372 (INSN) = NEXT_INSN (INSN))
373
6fb5fa3c
DB
374/* For iterating over insns in basic block when we might remove the
375 current insn. */
376#define FOR_BB_INSNS_SAFE(BB, INSN, CURR) \
377 for ((INSN) = BB_HEAD (BB), (CURR) = (INSN) ? NEXT_INSN ((INSN)): NULL; \
378 (INSN) && (INSN) != NEXT_INSN (BB_END (BB)); \
379 (INSN) = (CURR), (CURR) = (INSN) ? NEXT_INSN ((INSN)) : NULL)
b8698a0f 380
50654f6c
ZD
381#define FOR_BB_INSNS_REVERSE(BB, INSN) \
382 for ((INSN) = BB_END (BB); \
24bd1a0b 383 (INSN) && (INSN) != PREV_INSN (BB_HEAD (BB)); \
50654f6c
ZD
384 (INSN) = PREV_INSN (INSN))
385
6fb5fa3c
DB
386#define FOR_BB_INSNS_REVERSE_SAFE(BB, INSN, CURR) \
387 for ((INSN) = BB_END (BB),(CURR) = (INSN) ? PREV_INSN ((INSN)) : NULL; \
388 (INSN) && (INSN) != PREV_INSN (BB_HEAD (BB)); \
389 (INSN) = (CURR), (CURR) = (INSN) ? PREV_INSN ((INSN)) : NULL)
390
ed8d2920
MM
391/* Cycles through _all_ basic blocks, even the fake ones (entry and
392 exit block). */
393
394#define FOR_ALL_BB(BB) \
395 for (BB = ENTRY_BLOCK_PTR; BB; BB = BB->next_bb)
396
a930a4ef
JH
397#define FOR_ALL_BB_FN(BB, FN) \
398 for (BB = ENTRY_BLOCK_PTR_FOR_FUNCTION (FN); BB; BB = BB->next_bb)
399
5ece9746
JL
400\f
401/* Stuff for recording basic block info. */
402
5e2d947c
JH
403#define BB_HEAD(B) (B)->il.rtl->head_
404#define BB_END(B) (B)->il.rtl->end_
2b1d9dc0 405
95bca6b0
BRF
406/* Special block numbers [markers] for entry and exit.
407 Neither of them is supposed to hold actual statements. */
24bd1a0b
DB
408#define ENTRY_BLOCK (0)
409#define EXIT_BLOCK (1)
410
411/* The two blocks that are always in the cfg. */
412#define NUM_FIXED_BLOCKS (2)
5ece9746 413
ba4f7968 414#define set_block_for_insn(INSN, BB) (BLOCK_FOR_INSN (INSN) = BB)
e881bb1b 415
f55ade6e 416extern void compute_bb_for_insn (void);
c2924966 417extern unsigned int free_bb_for_insn (void);
f55ade6e 418extern void update_bb_for_insn (basic_block);
e881bb1b 419
f55ade6e 420extern void insert_insn_on_edge (rtx, edge);
598ec7bd 421basic_block split_edge_and_insert (edge, rtx);
3dec4024 422
4e3825db 423extern void commit_one_edge_insertion (edge e);
f55ade6e 424extern void commit_edge_insertions (void);
f55ade6e
AJ
425
426extern void remove_fake_edges (void);
6809cbf9 427extern void remove_fake_exit_edges (void);
f55ade6e
AJ
428extern void add_noreturn_fake_exit_edges (void);
429extern void connect_infinite_loops_to_exit (void);
f55ade6e 430extern edge unchecked_make_edge (basic_block, basic_block, int);
a6ee1a15 431extern edge cached_make_edge (sbitmap, basic_block, basic_block, int);
f55ade6e
AJ
432extern edge make_edge (basic_block, basic_block, int);
433extern edge make_single_succ_edge (basic_block, basic_block, int);
452ba14d 434extern void remove_edge_raw (edge);
f55ade6e
AJ
435extern void redirect_edge_succ (edge, basic_block);
436extern edge redirect_edge_succ_nodup (edge, basic_block);
437extern void redirect_edge_pred (edge, basic_block);
438extern basic_block create_basic_block_structure (rtx, rtx, rtx, basic_block);
439extern void clear_bb_flags (void);
6fb5fa3c
DB
440extern int post_order_compute (int *, bool, bool);
441extern int inverted_post_order_compute (int *);
f91a0beb 442extern int pre_and_rev_post_order_compute (int *, int *, bool);
f55ade6e 443extern int dfs_enumerate_from (basic_block, int,
ed7a4b4b
KG
444 bool (*)(const_basic_block, const void *),
445 basic_block *, int, const void *);
bd454efd 446extern void compute_dominance_frontiers (bitmap *);
25e87727 447extern bitmap compute_idf (bitmap, bitmap *);
a68e7e6c 448extern void dump_bb_info (basic_block, bool, bool, int, const char *, FILE *);
f55ade6e 449extern void dump_edge_info (FILE *, edge, int);
6de9cd9a 450extern void brief_dump_cfg (FILE *);
f55ade6e 451extern void clear_edges (void);
33156717 452extern void scale_bbs_frequencies_int (basic_block *, int, int, int);
c22cacf3 453extern void scale_bbs_frequencies_gcov_type (basic_block *, int, gcov_type,
33156717 454 gcov_type);
10c4b247 455
c05ffc49
BS
456/* Structure to group all of the information to process IF-THEN and
457 IF-THEN-ELSE blocks for the conditional execution support. This
458 needs to be in a public file in case the IFCVT macros call
459 functions passing the ce_if_block data structure. */
460
461typedef struct ce_if_block
462{
463 basic_block test_bb; /* First test block. */
464 basic_block then_bb; /* THEN block. */
465 basic_block else_bb; /* ELSE block or NULL. */
466 basic_block join_bb; /* Join THEN/ELSE blocks. */
467 basic_block last_test_bb; /* Last bb to hold && or || tests. */
468 int num_multiple_test_blocks; /* # of && and || basic blocks. */
469 int num_and_and_blocks; /* # of && blocks. */
470 int num_or_or_blocks; /* # of || blocks. */
471 int num_multiple_test_insns; /* # of insns in && and || blocks. */
472 int and_and_p; /* Complex test is &&. */
473 int num_then_insns; /* # of insns in THEN block. */
474 int num_else_insns; /* # of insns in ELSE block. */
475 int pass; /* Pass number. */
476
477#ifdef IFCVT_EXTRA_FIELDS
478 IFCVT_EXTRA_FIELDS /* Any machine dependent fields. */
479#endif
480
481} ce_if_block_t;
482
410538ea 483/* This structure maintains an edge list vector. */
7f8a2125 484struct edge_list
410538ea
AM
485{
486 int num_blocks;
487 int num_edges;
488 edge *index_to_edge;
489};
490
e42922b1
JH
491/* The base value for branch probability notes and edge probabilities. */
492#define REG_BR_PROB_BASE 10000
493
410538ea
AM
494/* This is the value which indicates no edge is present. */
495#define EDGE_INDEX_NO_EDGE -1
496
497/* EDGE_INDEX returns an integer index for an edge, or EDGE_INDEX_NO_EDGE
498 if there is no edge between the 2 basic blocks. */
499#define EDGE_INDEX(el, pred, succ) (find_edge_index ((el), (pred), (succ)))
500
501/* INDEX_EDGE_PRED_BB and INDEX_EDGE_SUCC_BB return a pointer to the basic
502 block which is either the pred or succ end of the indexed edge. */
503#define INDEX_EDGE_PRED_BB(el, index) ((el)->index_to_edge[(index)]->src)
504#define INDEX_EDGE_SUCC_BB(el, index) ((el)->index_to_edge[(index)]->dest)
505
506/* INDEX_EDGE returns a pointer to the edge. */
507#define INDEX_EDGE(el, index) ((el)->index_to_edge[(index)])
508
509/* Number of edges in the compressed edge list. */
510#define NUM_EDGES(el) ((el)->num_edges)
511
7a442791 512/* BB is assumed to contain conditional jump. Return the fallthru edge. */
628f6a4e
BE
513#define FALLTHRU_EDGE(bb) (EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
514 ? EDGE_SUCC ((bb), 0) : EDGE_SUCC ((bb), 1))
7a442791
JH
515
516/* BB is assumed to contain conditional jump. Return the branch edge. */
628f6a4e
BE
517#define BRANCH_EDGE(bb) (EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
518 ? EDGE_SUCC ((bb), 1) : EDGE_SUCC ((bb), 0))
7a442791 519
134d3a2e
JH
520/* Return expected execution frequency of the edge E. */
521#define EDGE_FREQUENCY(e) (((e)->src->frequency \
522 * (e)->probability \
523 + REG_BR_PROB_BASE / 2) \
524 / REG_BR_PROB_BASE)
525
4262e623 526/* Return nonzero if edge is critical. */
628f6a4e
BE
527#define EDGE_CRITICAL_P(e) (EDGE_COUNT ((e)->src->succs) >= 2 \
528 && EDGE_COUNT ((e)->dest->preds) >= 2)
529
530#define EDGE_COUNT(ev) VEC_length (edge, (ev))
531#define EDGE_I(ev,i) VEC_index (edge, (ev), (i))
532#define EDGE_PRED(bb,i) VEC_index (edge, (bb)->preds, (i))
533#define EDGE_SUCC(bb,i) VEC_index (edge, (bb)->succs, (i))
534
c5cbcccf
ZD
535/* Returns true if BB has precisely one successor. */
536
537static inline bool
ed7a4b4b 538single_succ_p (const_basic_block bb)
c5cbcccf
ZD
539{
540 return EDGE_COUNT (bb->succs) == 1;
541}
542
543/* Returns true if BB has precisely one predecessor. */
544
545static inline bool
ed7a4b4b 546single_pred_p (const_basic_block bb)
c5cbcccf
ZD
547{
548 return EDGE_COUNT (bb->preds) == 1;
549}
550
81b29e2f
ZD
551/* Returns the single successor edge of basic block BB. Aborts if
552 BB does not have exactly one successor. */
c5cbcccf
ZD
553
554static inline edge
ed7a4b4b 555single_succ_edge (const_basic_block bb)
c5cbcccf
ZD
556{
557 gcc_assert (single_succ_p (bb));
558 return EDGE_SUCC (bb, 0);
559}
560
81b29e2f
ZD
561/* Returns the single predecessor edge of basic block BB. Aborts
562 if BB does not have exactly one predecessor. */
c5cbcccf
ZD
563
564static inline edge
ed7a4b4b 565single_pred_edge (const_basic_block bb)
c5cbcccf
ZD
566{
567 gcc_assert (single_pred_p (bb));
568 return EDGE_PRED (bb, 0);
569}
570
81b29e2f
ZD
571/* Returns the single successor block of basic block BB. Aborts
572 if BB does not have exactly one successor. */
c5cbcccf
ZD
573
574static inline basic_block
ed7a4b4b 575single_succ (const_basic_block bb)
c5cbcccf
ZD
576{
577 return single_succ_edge (bb)->dest;
578}
579
81b29e2f
ZD
580/* Returns the single predecessor block of basic block BB. Aborts
581 if BB does not have exactly one predecessor.*/
c5cbcccf
ZD
582
583static inline basic_block
ed7a4b4b 584single_pred (const_basic_block bb)
c5cbcccf
ZD
585{
586 return single_pred_edge (bb)->src;
587}
588
628f6a4e
BE
589/* Iterator object for edges. */
590
591typedef struct {
592 unsigned index;
d4e6fecb 593 VEC(edge,gc) **container;
628f6a4e
BE
594} edge_iterator;
595
d4e6fecb 596static inline VEC(edge,gc) *
f76ccf60
BE
597ei_container (edge_iterator i)
598{
599 gcc_assert (i.container);
600 return *i.container;
601}
602
603#define ei_start(iter) ei_start_1 (&(iter))
604#define ei_last(iter) ei_last_1 (&(iter))
605
628f6a4e
BE
606/* Return an iterator pointing to the start of an edge vector. */
607static inline edge_iterator
d4e6fecb 608ei_start_1 (VEC(edge,gc) **ev)
628f6a4e
BE
609{
610 edge_iterator i;
611
612 i.index = 0;
613 i.container = ev;
614
615 return i;
616}
617
618/* Return an iterator pointing to the last element of an edge
471854f8 619 vector. */
628f6a4e 620static inline edge_iterator
d4e6fecb 621ei_last_1 (VEC(edge,gc) **ev)
628f6a4e
BE
622{
623 edge_iterator i;
624
f76ccf60 625 i.index = EDGE_COUNT (*ev) - 1;
628f6a4e
BE
626 i.container = ev;
627
628 return i;
629}
630
631/* Is the iterator `i' at the end of the sequence? */
632static inline bool
633ei_end_p (edge_iterator i)
634{
f76ccf60 635 return (i.index == EDGE_COUNT (ei_container (i)));
628f6a4e
BE
636}
637
638/* Is the iterator `i' at one position before the end of the
639 sequence? */
640static inline bool
641ei_one_before_end_p (edge_iterator i)
642{
f76ccf60 643 return (i.index + 1 == EDGE_COUNT (ei_container (i)));
628f6a4e
BE
644}
645
646/* Advance the iterator to the next element. */
647static inline void
648ei_next (edge_iterator *i)
649{
f76ccf60 650 gcc_assert (i->index < EDGE_COUNT (ei_container (*i)));
628f6a4e
BE
651 i->index++;
652}
653
654/* Move the iterator to the previous element. */
655static inline void
656ei_prev (edge_iterator *i)
657{
658 gcc_assert (i->index > 0);
659 i->index--;
660}
661
662/* Return the edge pointed to by the iterator `i'. */
663static inline edge
664ei_edge (edge_iterator i)
665{
f76ccf60 666 return EDGE_I (ei_container (i), i.index);
628f6a4e
BE
667}
668
669/* Return an edge pointed to by the iterator. Do it safely so that
670 NULL is returned when the iterator is pointing at the end of the
671 sequence. */
672static inline edge
673ei_safe_edge (edge_iterator i)
674{
675 return !ei_end_p (i) ? ei_edge (i) : NULL;
676}
677
f3522a84
KH
678/* Return 1 if we should continue to iterate. Return 0 otherwise.
679 *Edge P is set to the next edge if we are to continue to iterate
680 and NULL otherwise. */
681
682static inline bool
683ei_cond (edge_iterator ei, edge *p)
684{
685 if (!ei_end_p (ei))
686 {
687 *p = ei_edge (ei);
688 return 1;
689 }
690 else
691 {
692 *p = NULL;
693 return 0;
694 }
695}
696
628f6a4e 697/* This macro serves as a convenient way to iterate each edge in a
c2b7c2d8 698 vector of predecessor or successor edges. It must not be used when
628f6a4e
BE
699 an element might be removed during the traversal, otherwise
700 elements will be missed. Instead, use a for-loop like that shown
701 in the following pseudo-code:
c22cacf3 702
628f6a4e
BE
703 FOR (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
704 {
705 IF (e != taken_edge)
d0d2cc21 706 remove_edge (e);
628f6a4e
BE
707 ELSE
708 ei_next (&ei);
709 }
710*/
711
f3522a84
KH
712#define FOR_EACH_EDGE(EDGE,ITER,EDGE_VEC) \
713 for ((ITER) = ei_start ((EDGE_VEC)); \
714 ei_cond ((ITER), &(EDGE)); \
628f6a4e 715 ei_next (&(ITER)))
4262e623 716
f55ade6e
AJ
717struct edge_list * create_edge_list (void);
718void free_edge_list (struct edge_list *);
719void print_edge_list (FILE *, struct edge_list *);
720void verify_edge_list (FILE *, struct edge_list *);
721int find_edge_index (struct edge_list *, basic_block, basic_block);
6de9cd9a 722edge find_edge (basic_block, basic_block);
410538ea 723
e0bb17a8 724#define CLEANUP_EXPENSIVE 1 /* Do relatively expensive optimizations
46fac664
JH
725 except for edge forwarding */
726#define CLEANUP_CROSSJUMP 2 /* Do crossjumping. */
727#define CLEANUP_POST_REGSTACK 4 /* We run after reg-stack and need
728 to care REG_DEAD notes. */
6fb5fa3c
DB
729#define CLEANUP_THREADING 8 /* Do jump threading. */
730#define CLEANUP_NO_INSN_DEL 16 /* Do not try to delete trivially dead
95479831 731 insns. */
6fb5fa3c 732#define CLEANUP_CFGLAYOUT 32 /* Do cleanup in cfglayout mode. */
6ce2bcb7 733
077692c6 734/* In lcm.c */
10d22567 735extern struct edge_list *pre_edge_lcm (int, sbitmap *, sbitmap *,
f55ade6e
AJ
736 sbitmap *, sbitmap *, sbitmap **,
737 sbitmap **);
10d22567 738extern struct edge_list *pre_edge_rev_lcm (int, sbitmap *,
f55ade6e
AJ
739 sbitmap *, sbitmap *,
740 sbitmap *, sbitmap **,
741 sbitmap **);
742extern void compute_available (sbitmap *, sbitmap *, sbitmap *, sbitmap *);
a05924f9 743
f1ebdfc5 744/* In predict.c */
ed7a4b4b 745extern bool maybe_hot_bb_p (const_basic_block);
3250d724 746extern bool maybe_hot_edge_p (edge);
ed7a4b4b 747extern bool probably_never_executed_bb_p (const_basic_block);
cc870036
JH
748extern bool optimize_bb_for_size_p (const_basic_block);
749extern bool optimize_bb_for_speed_p (const_basic_block);
bf08ebeb
JH
750extern bool optimize_edge_for_size_p (edge);
751extern bool optimize_edge_for_speed_p (edge);
3debdc1e
JH
752extern bool optimize_function_for_size_p (struct function *);
753extern bool optimize_function_for_speed_p (struct function *);
cc870036
JH
754extern bool optimize_loop_for_size_p (struct loop *);
755extern bool optimize_loop_for_speed_p (struct loop *);
efd8f750
JH
756extern bool optimize_loop_nest_for_size_p (struct loop *);
757extern bool optimize_loop_nest_for_speed_p (struct loop *);
726a989a 758extern bool gimple_predicted_by_p (const_basic_block, enum br_predictor);
9678086d 759extern bool rtl_predicted_by_p (const_basic_block, enum br_predictor);
726a989a 760extern void gimple_predict_edge (edge, enum br_predictor, int);
6de9cd9a
DN
761extern void rtl_predict_edge (edge, enum br_predictor, int);
762extern void predict_edge_def (edge, enum br_predictor, enum prediction);
87022a6b 763extern void guess_outgoing_edge_probabilities (basic_block);
3809e990 764extern void remove_predictions_associated_with_edge (edge);
ed7a4b4b
KG
765extern bool edge_probability_reliable_p (const_edge);
766extern bool br_prob_note_reliable_p (const_rtx);
3a4fd356 767extern bool predictable_edge_p (edge);
f1ebdfc5 768
6fb5fa3c 769/* In cfg.c */
9defb1fe 770extern void init_flow (struct function *);
f55ade6e
AJ
771extern void debug_bb (basic_block);
772extern basic_block debug_bb_n (int);
f55ade6e
AJ
773extern void expunge_block (basic_block);
774extern void link_block (basic_block, basic_block);
775extern void unlink_block (basic_block);
776extern void compact_blocks (void);
777extern basic_block alloc_block (void);
f55ade6e
AJ
778extern void alloc_aux_for_block (basic_block, int);
779extern void alloc_aux_for_blocks (int);
780extern void clear_aux_for_blocks (void);
781extern void free_aux_for_blocks (void);
782extern void alloc_aux_for_edge (edge, int);
783extern void alloc_aux_for_edges (int);
784extern void clear_aux_for_edges (void);
785extern void free_aux_for_edges (void);
6fb5fa3c
DB
786
787/* In cfganal.c */
788extern void find_unreachable_blocks (void);
ed7a4b4b 789extern bool forwarder_block_p (const_basic_block);
6fb5fa3c
DB
790extern bool can_fallthru (basic_block, basic_block);
791extern bool could_fall_through (basic_block, basic_block);
ed7a4b4b 792extern void flow_nodes_print (const char *, const_sbitmap, FILE *);
6fb5fa3c
DB
793extern void flow_edge_list_print (const char *, const edge *, int, FILE *);
794
795/* In cfgrtl.c */
796extern basic_block force_nonfallthru (edge);
797extern rtx block_label (basic_block);
798extern bool purge_all_dead_edges (void);
799extern bool purge_dead_edges (basic_block);
800
801/* In cfgbuild.c. */
802extern void find_many_sub_basic_blocks (sbitmap);
803extern void rtl_make_eh_edge (sbitmap, basic_block, rtx);
6fb5fa3c
DB
804
805/* In cfgcleanup.c. */
6de9cd9a 806extern bool cleanup_cfg (int);
31ce8a53
BS
807extern int flow_find_cross_jump (basic_block, basic_block, rtx *, rtx *);
808extern int flow_find_head_matching_sequence (basic_block, basic_block,
809 rtx *, rtx *, int);
810
6de9cd9a 811extern bool delete_unreachable_blocks (void);
11bdd2ae 812
f55ade6e
AJ
813extern bool mark_dfs_back_edges (void);
814extern void set_edge_can_fallthru_flag (void);
815extern void update_br_prob_note (basic_block);
816extern void fixup_abnormal_edges (void);
ed7a4b4b
KG
817extern bool inside_basic_block_p (const_rtx);
818extern bool control_flow_insn_p (const_rtx);
96370780 819extern rtx get_last_bb_insn (basic_block);
11bdd2ae 820
4682ae04 821/* In bb-reorder.c */
ad21dab7 822extern void reorder_basic_blocks (void);
4682ae04 823
f8032688
MM
824/* In dominance.c */
825
826enum cdi_direction
827{
2b28c07a
JC
828 CDI_DOMINATORS = 1,
829 CDI_POST_DOMINATORS = 2
f8032688
MM
830};
831
2b28c07a
JC
832extern enum dom_state dom_info_state (enum cdi_direction);
833extern void set_dom_info_availability (enum cdi_direction, enum dom_state);
fce22de5 834extern bool dom_info_available_p (enum cdi_direction);
d47cc544
SB
835extern void calculate_dominance_info (enum cdi_direction);
836extern void free_dominance_info (enum cdi_direction);
837extern basic_block nearest_common_dominator (enum cdi_direction,
f55ade6e 838 basic_block, basic_block);
c22cacf3 839extern basic_block nearest_common_dominator_for_set (enum cdi_direction,
0bca51f0 840 bitmap);
d47cc544 841extern void set_immediate_dominator (enum cdi_direction, basic_block,
f55ade6e 842 basic_block);
d47cc544 843extern basic_block get_immediate_dominator (enum cdi_direction, basic_block);
ed7a4b4b 844extern bool dominated_by_p (enum cdi_direction, const_basic_block, const_basic_block);
66f97d31
ZD
845extern VEC (basic_block, heap) *get_dominated_by (enum cdi_direction, basic_block);
846extern VEC (basic_block, heap) *get_dominated_by_region (enum cdi_direction,
847 basic_block *,
848 unsigned);
438c239d
RG
849extern VEC (basic_block, heap) *get_all_dominated_blocks (enum cdi_direction,
850 basic_block);
d47cc544
SB
851extern void add_to_dominance_info (enum cdi_direction, basic_block);
852extern void delete_from_dominance_info (enum cdi_direction, basic_block);
66f97d31 853basic_block recompute_dominator (enum cdi_direction, basic_block);
d47cc544 854extern void redirect_immediate_dominators (enum cdi_direction, basic_block,
f55ade6e 855 basic_block);
66f97d31
ZD
856extern void iterate_fix_dominators (enum cdi_direction,
857 VEC (basic_block, heap) *, bool);
d47cc544
SB
858extern void verify_dominators (enum cdi_direction);
859extern basic_block first_dom_son (enum cdi_direction, basic_block);
860extern basic_block next_dom_son (enum cdi_direction, basic_block);
f074ff6c
ZD
861unsigned bb_dom_dfs_in (enum cdi_direction, basic_block);
862unsigned bb_dom_dfs_out (enum cdi_direction, basic_block);
863
6de9cd9a 864extern edge try_redirect_by_replacing_jump (edge, basic_block, bool);
12c3874e 865extern void break_superblocks (void);
ad21dab7 866extern void relink_block_chain (bool);
878f99d2 867extern void check_bb_profile (basic_block, FILE *);
15db5571 868extern void update_bb_profile_for_threading (basic_block, int, gcov_type, edge);
5e2d947c 869extern void init_rtl_bb_info (basic_block);
9ee634e3 870
6580ee77
JH
871extern void initialize_original_copy_tables (void);
872extern void free_original_copy_tables (void);
873extern void set_bb_original (basic_block, basic_block);
874extern basic_block get_bb_original (basic_block);
875extern void set_bb_copy (basic_block, basic_block);
876extern basic_block get_bb_copy (basic_block);
561e8a90
ZD
877void set_loop_copy (struct loop *, struct loop *);
878struct loop *get_loop_copy (struct loop *);
879
6580ee77 880
8cd37d0b
RL
881extern rtx insert_insn_end_bb_new (rtx, basic_block);
882
9ee634e3
JH
883#include "cfghooks.h"
884
f66fd328 885/* Return true when one of the predecessor edges of BB is marked with EDGE_EH. */
bae8b6b2
SB
886static inline bool
887bb_has_eh_pred (basic_block bb)
fcc42bca
AK
888{
889 edge e;
890 edge_iterator ei;
891
892 FOR_EACH_EDGE (e, ei, bb->preds)
893 {
894 if (e->flags & EDGE_EH)
895 return true;
896 }
897 return false;
898}
899
ba49cb7b
KZ
900/* Return true when one of the predecessor edges of BB is marked with EDGE_ABNORMAL. */
901static inline bool
902bb_has_abnormal_pred (basic_block bb)
903{
904 edge e;
905 edge_iterator ei;
906
907 FOR_EACH_EDGE (e, ei, bb->preds)
908 {
909 if (e->flags & EDGE_ABNORMAL)
910 return true;
911 }
912 return false;
913}
914
b02b9b53
ZD
915/* In cfgloopmanip.c. */
916extern edge mfb_kj_edge;
bf08ebeb
JH
917extern bool mfb_keep_just (edge);
918
919/* In cfgexpand.c. */
920extern void rtl_profile_for_bb (basic_block);
921extern void rtl_profile_for_edge (edge);
922extern void default_rtl_profile (void);
b02b9b53 923
88657302 924#endif /* GCC_BASIC_BLOCK_H */