GCC Middle and Back End API Reference
tree-cfg.h
Go to the documentation of this file.
1/* Data and Control Flow Analysis for Trees.
2 Copyright (C) 2001-2026 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef _TREE_CFG_H
22#define _TREE_CFG_H
23
24/* Location to track pending stmt for edge insertion. */
25#define PENDING_STMT(e) ((e)->insns.g)
26
27/* Garbage collection and PCH support for edge_def. */
28extern void gt_ggc_mx (edge_def *e);
29extern void gt_pch_nx (edge_def *e);
30extern void gt_pch_nx (edge_def *e, gt_pointer_operator, void *);
31
32extern void init_empty_tree_cfg_for_function (struct function *);
33extern void init_empty_tree_cfg (void);
34extern void start_recording_case_labels (void);
35extern void end_recording_case_labels (void);
37extern basic_block label_to_block (struct function *, tree);
38extern void cleanup_dead_labels (void);
39extern bool group_case_labels_stmt (gswitch *);
40extern bool group_case_labels (void);
41extern void replace_uses_by (tree, tree);
43extern void notice_special_calls (gcall *);
44extern void clear_special_calls (void);
46extern void gimple_debug_bb (basic_block);
48extern void gimple_debug_cfg (dump_flags_t);
49extern void gimple_dump_cfg (FILE *, dump_flags_t);
50extern void dump_cfg_stats (FILE *);
51extern void debug_cfg_stats (void);
52extern bool computed_goto_p (gimple *);
55extern bool is_ctrl_stmt (gimple *);
56extern bool is_ctrl_altering_stmt (gimple *);
57extern bool simple_goto_p (gimple *);
58extern bool stmt_ends_bb_p (gimple *);
66extern bool verify_gimple_in_seq (gimple_seq, bool = true);
67extern bool verify_gimple_in_cfg (struct function *, bool, bool = true);
70extern void add_phi_args_after_copy (basic_block *, unsigned, edge);
72extern bool gimple_duplicate_seme_region (edge, edge, basic_block *, unsigned,
73 basic_block *, bool);
74extern bool gimple_duplicate_sese_tail (edge, edge, basic_block *, unsigned,
75 basic_block *);
77 vec<basic_block> *bbs_p);
79extern bool gather_ssa_name_hash_map_from (tree const &, tree const &, void *);
80extern void fold_loop_internal_call (gimple *, tree);
83extern void dump_function_to_file (tree, FILE *, dump_flags_t);
84extern void debug_function (tree, dump_flags_t);
85extern void print_loops_bb (FILE *, basic_block, int, int);
86extern void print_loops (FILE *, int);
87extern void debug (class loop &ref);
88extern void debug (class loop *ptr);
89extern void debug_verbose (class loop &ref);
90extern void debug_verbose (class loop *ptr);
91extern void debug_loops (int);
92extern void debug_loop (class loop *, int);
93extern void debug_loop_num (unsigned, int);
100extern tree find_case_label_for_value (const gswitch *switch_stmt, tree val);
101extern edge find_taken_edge_switch_expr (const gswitch *switch_stmt, tree val);
102extern unsigned int execute_fixup_cfg (void);
103extern unsigned int split_critical_edges (bool for_edge_insertion_p = false);
108 edge *, edge *);
109extern void generate_range_test (basic_block bb, tree index, tree low,
110 tree high, tree *lhs, tree *rhs);
111extern basic_block gimple_switch_label_bb (function *, gswitch *, unsigned);
113extern edge gimple_switch_edge (function *, gswitch *, unsigned);
115extern bool cond_only_block_p (basic_block);
116extern void copy_phi_arg_into_existing_phi (edge, edge, bool = false);
117extern bool make_forwarders_with_degenerate_phis (function *, bool = false);
118
119/* Return true if the LHS of a call should be removed. */
120
121inline bool
123{
124 return (lhs
125 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST
126 && !TREE_ADDRESSABLE (TREE_TYPE (lhs)));
127}
128
129
130inline unsigned int
132{
133 return split_critical_edges (/*for_edge_insertion_p=*/true);
134}
135
136#endif /* _TREE_CFG_H */
void gt_pch_nx(bbitmap< N > *)
Definition bbitmap.h:226
void gt_ggc_mx(bbitmap< N > *)
Definition bbitmap.h:220
Definition basic-block.h:26
Definition cfgloop.h:120
Definition profile-count.h:149
bool debug
Definition collect-utils.cc:34
struct basic_block_def * basic_block
Definition coretypes.h:351
class edge_def * edge
Definition coretypes.h:348
gimple * gimple_seq
Definition coretypes.h:100
const class bitmap_head * const_bitmap
Definition coretypes.h:52
union tree_node * tree
Definition coretypes.h:97
void(*) gt_pointer_operator(void *, void *, void *)
Definition coretypes.h:469
enum dump_flag dump_flags_t
Definition dumpfile.h:209
void debug_verbose(const tree_node &ref)
Definition function.h:249
Definition gimple.h:355
Definition gimple-iterator.h:26
Definition gimple.h:224
Definition gimple.h:464
Definition gimple.h:901
Definition vec.h:450
void copy_phi_arg_into_existing_phi(edge src_e, edge tgt_e, bool use_map)
Definition tree-cfg.cc:6846
bool gimple_purge_all_dead_abnormal_call_edges(const_bitmap blocks)
Definition tree-cfg.cc:9253
gimple * first_stmt(basic_block bb)
Definition tree-cfg.cc:2871
void extract_true_false_edges_from_block(basic_block b, edge *true_edge, edge *false_edge)
Definition tree-cfg.cc:9594
basic_block split_edge_bb_loc(edge edge_in)
Definition tree-cfg.cc:2938
DEBUG_FUNCTION void debug_loop(class loop *loop, int verbosity)
Definition tree-cfg.cc:8798
bool group_case_labels_stmt(gswitch *stmt)
Definition tree-cfg.cc:1761
void print_loops(FILE *file, int verbosity)
Definition tree-cfg.cc:8742
unsigned int execute_fixup_cfg(void)
Definition tree-cfg.cc:10064
bool computed_goto_p(gimple *t)
Definition tree-cfg.cc:391
void start_recording_case_labels(void)
Definition tree-cfg.cc:1297
basic_block insert_cond_bb(basic_block bb, gimple *stmt, gimple *cond, profile_probability prob)
Definition tree-cfg.cc:9545
void dump_cfg_stats(FILE *file)
Definition tree-cfg.cc:2600
void init_empty_tree_cfg(void)
Definition tree-cfg.cc:170
bool gather_ssa_name_hash_map_from(tree const &from, tree const &, void *data)
Definition tree-cfg.cc:7745
basic_block gimple_switch_default_bb(function *ifun, gswitch *gs)
Definition tree-cfg.cc:9713
void clear_special_calls(void)
Definition tree-cfg.cc:2236
void end_recording_case_labels(void)
Definition tree-cfg.cc:1315
bool is_ctrl_stmt(gimple *t)
Definition tree-cfg.cc:2701
edge gimple_switch_default_edge(function *ifun, gswitch *gs)
Definition tree-cfg.cc:9730
bool simple_goto_p(gimple *t)
Definition tree-cfg.cc:2765
bool assert_unreachable_fallthru_edge_p(edge e)
Definition tree-cfg.cc:441
void gimple_debug_bb(basic_block bb)
Definition tree-cfg.cc:2543
bool gimple_seq_unreachable_p(gimple_seq stmts)
Definition tree-cfg.cc:401
edge find_taken_edge_switch_expr(const gswitch *switch_stmt, tree val)
Definition tree-cfg.cc:2473
gimple * last_and_only_stmt(basic_block bb)
Definition tree-cfg.cc:2905
void gather_blocks_in_sese_region(basic_block entry, basic_block exit, vec< basic_block > *bbs_p)
Definition tree-cfg.cc:7057
basic_block gimple_switch_label_bb(function *ifun, gswitch *gs, unsigned index)
Definition tree-cfg.cc:9705
void generate_range_test(basic_block bb, tree index, tree low, tree high, tree *lhs, tree *rhs)
Definition tree-cfg.cc:9683
void remove_edge_and_dominated_blocks(edge e)
Definition tree-cfg.cc:9028
DEBUG_FUNCTION void debug_loops(int verbosity)
Definition tree-cfg.cc:8790
void delete_tree_cfg_annotations(struct function *fn)
Definition tree-cfg.cc:2845
edge find_taken_edge(basic_block bb, tree val)
Definition tree-cfg.cc:2378
bool stmt_ends_bb_p(gimple *t)
Definition tree-cfg.cc:2837
edge gimple_switch_edge(function *ifun, gswitch *gs, unsigned index)
Definition tree-cfg.cc:9722
DEBUG_FUNCTION void verify_sese(basic_block entry, basic_block exit, vec< basic_block > *bbs_p)
Definition tree-cfg.cc:7692
bool gimple_duplicate_seme_region(edge entry, edge exit, basic_block *region, unsigned n_region, basic_block *region_copy, bool update_dominance)
Definition tree-cfg.cc:6726
basic_block gimple_debug_bb_n(int n)
Definition tree-cfg.cc:2552
DEBUG_FUNCTION bool verify_gimple_in_cfg(struct function *fn, bool verify_nothrow, bool ice)
Definition tree-cfg.cc:5486
basic_block move_sese_region_to_fn(struct function *dest_cfun, basic_block entry_bb, basic_block exit_bb, tree orig_block)
Definition tree-cfg.cc:7860
void init_empty_tree_cfg_for_function(struct function *fn)
Definition tree-cfg.cc:146
basic_block label_to_block(struct function *ifun, tree dest)
Definition tree-cfg.cc:1396
tree find_case_label_for_value(const gswitch *switch_stmt, tree val)
Definition tree-cfg.cc:2503
basic_block single_noncomplex_succ(basic_block bb)
Definition tree-cfg.cc:2200
void add_phi_args_after_copy(basic_block *region_copy, unsigned n_region, edge e_copy)
Definition tree-cfg.cc:6693
void notice_special_calls(gcall *call)
Definition tree-cfg.cc:2219
bool cond_only_block_p(basic_block bb)
Definition tree-cfg.cc:9738
DEBUG_FUNCTION void debug_cfg_stats(void)
Definition tree-cfg.cc:2651
bool group_case_labels(void)
Definition tree-cfg.cc:1838
void print_loops_bb(FILE *file, basic_block bb, int indent, int verbosity)
Definition tree-cfg.cc:8597
gimple * last_nondebug_stmt(basic_block bb)
Definition tree-cfg.cc:2887
void replace_uses_by(tree name, tree val)
Definition tree-cfg.cc:1960
basic_block get_abnormal_succ_dispatcher(basic_block bb)
Definition tree-cfg.cc:725
unsigned int split_critical_edges(bool for_edge_insertion_p)
Definition tree-cfg.cc:9450
void dump_function_to_file(tree fndecl, FILE *file, dump_flags_t flags)
Definition tree-cfg.cc:8288
gphi * get_virtual_phi(basic_block bb)
Definition tree-cfg.cc:2853
bool gimple_purge_dead_eh_edges(basic_block bb)
Definition tree-cfg.cc:9173
bool gimple_purge_dead_abnormal_call_edges(basic_block bb)
Definition tree-cfg.cc:9223
DEBUG_FUNCTION void debug_function(tree fn, dump_flags_t flags)
Definition tree-cfg.cc:8563
void fold_loop_internal_call(gimple *g, tree value)
Definition tree-cfg.cc:7779
bool gimple_duplicate_sese_tail(edge entry, edge exit, basic_block *region, unsigned n_region, basic_block *region_copy)
Definition tree-cfg.cc:6924
bool stmt_can_make_abnormal_goto(gimple *t)
Definition tree-cfg.cc:2688
DEBUG_FUNCTION void debug_loop_num(unsigned num, int verbosity)
Definition tree-cfg.cc:8807
bool is_ctrl_altering_stmt(gimple *t)
Definition tree-cfg.cc:2721
bool make_forwarders_with_degenerate_phis(function *fn, bool skip_ifcvtable)
Definition tree-cfg.cc:10318
void gimple_debug_cfg(dump_flags_t flags)
Definition tree-cfg.cc:2565
tree get_cases_for_edge(edge e, gswitch *t)
Definition tree-cfg.cc:1340
void gimple_dump_cfg(FILE *file, dump_flags_t flags)
Definition tree-cfg.cc:2577
DEBUG_FUNCTION bool verify_gimple_in_seq(gimple_seq stmts, bool ice)
Definition tree-cfg.cc:5287
bool extract_true_false_controlled_edges(basic_block dom, basic_block phiblock, edge *true_controlled_edge, edge *false_controlled_edge)
Definition tree-cfg.cc:9621
tree gimple_block_label(basic_block bb)
Definition tree-cfg.cc:6098
void cleanup_dead_labels(void)
Definition tree-cfg.cc:1558
void add_phi_args_after_copy_bb(basic_block bb_copy)
Definition tree-cfg.cc:6676
bool gimple_purge_all_dead_eh_edges(const_bitmap blocks)
Definition tree-cfg.cc:9200
bool gimple_find_sub_bbs(gimple_seq seq, gimple_stmt_iterator *gsi)
Definition tree-cfg.cc:1087
bool should_remove_lhs_p(tree lhs)
Definition tree-cfg.h:122
unsigned int split_edges_for_insertion()
Definition tree-cfg.h:131
#define TYPE_SIZE_UNIT(NODE)
Definition tree.h:2437
#define TREE_CODE(NODE)
Definition tree.h:325
#define TREE_TYPE(NODE)
Definition tree.h:513
#define TREE_ADDRESSABLE(NODE)
Definition tree.h:757