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