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-2025 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);
117
118/* Return true if the LHS of a call should be removed. */
119
120inline bool
122{
123 return (lhs
124 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST
125 && !TREE_ADDRESSABLE (TREE_TYPE (lhs)));
126}
127
128
129inline unsigned int
131{
132 return split_critical_edges (/*for_edge_insertion_p=*/true);
133}
134
135#endif /* _TREE_CFG_H */
Definition basic-block.h:26
Definition cfgloop.h:120
Definition profile-count.h:147
bool debug
Definition collect-utils.cc:34
struct basic_block_def * basic_block
Definition coretypes.h:355
class edge_def * edge
Definition coretypes.h:352
gimple * gimple_seq
Definition coretypes.h:100
const class bitmap_head * const_bitmap
Definition coretypes.h:52
void(* gt_pointer_operator)(void *, void *, void *)
Definition coretypes.h:473
union tree_node * tree
Definition coretypes.h:97
enum dump_flag dump_flags_t
Definition dumpfile.h:209
Definition function.h:249
Definition gimple.h:352
Definition gimple-iterator.h:26
Definition gimple.h:221
Definition gimple.h:461
Definition gimple.h:894
Definition vec.h:450
basic_block label_to_block(struct function *, tree)
Definition tree-cfg.cc:1445
void verify_sese(basic_block, basic_block, vec< basic_block > *)
Definition tree-cfg.cc:7688
bool gimple_purge_all_dead_eh_edges(const_bitmap)
Definition tree-cfg.cc:9196
void add_phi_args_after_copy(basic_block *, unsigned, edge)
Definition tree-cfg.cc:6718
gimple * first_stmt(basic_block)
Definition tree-cfg.cc:2938
bool gimple_duplicate_seme_region(edge, edge, basic_block *, unsigned, basic_block *, bool)
Definition tree-cfg.cc:6751
basic_block gimple_debug_bb_n(int)
Definition tree-cfg.cc:2619
unsigned int execute_fixup_cfg(void)
Definition tree-cfg.cc:10053
void gt_pch_nx(edge_def *e)
Definition tree-cfg.cc:10257
bool assert_unreachable_fallthru_edge_p(edge)
Definition tree-cfg.cc:481
void dump_function_to_file(tree, FILE *, dump_flags_t)
Definition tree-cfg.cc:8284
void start_recording_case_labels(void)
Definition tree-cfg.cc:1346
gphi * get_virtual_phi(basic_block)
Definition tree-cfg.cc:2920
basic_block gimple_switch_label_bb(function *, gswitch *, unsigned)
Definition tree-cfg.cc:9698
void debug_loop(class loop *, int)
Definition tree-cfg.cc:8794
void debug_loop_num(unsigned, int)
Definition tree-cfg.cc:8803
void init_empty_tree_cfg_for_function(struct function *)
Definition tree-cfg.cc:183
void init_empty_tree_cfg(void)
Definition tree-cfg.cc:207
bool gimple_purge_dead_abnormal_call_edges(basic_block)
Definition tree-cfg.cc:9219
void debug_verbose(class loop &ref)
Definition tree-cfg.cc:8768
void clear_special_calls(void)
Definition tree-cfg.cc:2303
void end_recording_case_labels(void)
Definition tree-cfg.cc:1364
bool gimple_purge_all_dead_abnormal_call_edges(const_bitmap)
Definition tree-cfg.cc:9249
void gt_ggc_mx(edge_def *e)
Definition tree-cfg.cc:10230
tree get_cases_for_edge(edge, gswitch *)
Definition tree-cfg.cc:1389
bool gather_ssa_name_hash_map_from(tree const &, tree const &, void *)
Definition tree-cfg.cc:7741
void debug_cfg_stats(void)
Definition tree-cfg.cc:2718
bool extract_true_false_controlled_edges(basic_block, basic_block, edge *, edge *)
Definition tree-cfg.cc:9614
void print_loops(FILE *, int)
Definition tree-cfg.cc:8738
bool gimple_find_sub_bbs(gimple_seq, gimple_stmt_iterator *)
Definition tree-cfg.cc:1077
edge find_taken_edge_switch_expr(const gswitch *switch_stmt, tree val)
Definition tree-cfg.cc:2540
bool stmt_can_make_abnormal_goto(gimple *)
Definition tree-cfg.cc:2755
void gather_blocks_in_sese_region(basic_block entry, basic_block exit, vec< basic_block > *bbs_p)
Definition tree-cfg.cc:7053
void generate_range_test(basic_block bb, tree index, tree low, tree high, tree *lhs, tree *rhs)
Definition tree-cfg.cc:9676
void remove_edge_and_dominated_blocks(edge)
Definition tree-cfg.cc:9024
void gimple_debug_bb(basic_block)
Definition tree-cfg.cc:2610
basic_block gimple_switch_default_bb(function *, gswitch *)
Definition tree-cfg.cc:9706
void fold_loop_internal_call(gimple *, tree)
Definition tree-cfg.cc:7775
bool gimple_purge_dead_eh_edges(basic_block)
Definition tree-cfg.cc:9169
bool verify_gimple_in_cfg(struct function *, bool, bool=true)
Definition tree-cfg.cc:5527
bool cond_only_block_p(basic_block)
Definition tree-cfg.cc:9731
edge gimple_switch_default_edge(function *, gswitch *)
Definition tree-cfg.cc:9723
gimple * last_and_only_stmt(basic_block)
Definition tree-cfg.cc:2983
basic_block insert_cond_bb(basic_block, gimple *, gimple *, profile_probability)
Definition tree-cfg.cc:9540
tree find_case_label_for_value(const gswitch *switch_stmt, tree val)
Definition tree-cfg.cc:2570
bool is_ctrl_stmt(gimple *)
Definition tree-cfg.cc:2768
void gimple_debug_cfg(dump_flags_t)
Definition tree-cfg.cc:2632
void dump_cfg_stats(FILE *)
Definition tree-cfg.cc:2667
basic_block single_noncomplex_succ(basic_block bb)
Definition tree-cfg.cc:2267
bool stmt_ends_bb_p(gimple *)
Definition tree-cfg.cc:2904
void replace_uses_by(tree, tree)
Definition tree-cfg.cc:2037
bool should_remove_lhs_p(tree lhs)
Definition tree-cfg.h:121
bool verify_gimple_in_seq(gimple_seq, bool=true)
Definition tree-cfg.cc:5328
basic_block move_sese_region_to_fn(struct function *, basic_block, basic_block, tree)
Definition tree-cfg.cc:7856
basic_block split_edge_bb_loc(edge)
Definition tree-cfg.cc:3016
void add_phi_args_after_copy_bb(basic_block)
Definition tree-cfg.cc:6701
bool group_case_labels(void)
Definition tree-cfg.cc:1934
bool simple_goto_p(gimple *)
Definition tree-cfg.cc:2832
edge find_taken_edge(basic_block, tree)
Definition tree-cfg.cc:2445
unsigned int split_edges_for_insertion()
Definition tree-cfg.h:130
void print_loops_bb(FILE *, basic_block, int, int)
Definition tree-cfg.cc:8593
void debug_loops(int)
Definition tree-cfg.cc:8786
void copy_phi_arg_into_existing_phi(edge, edge)
Definition tree-cfg.cc:6869
void notice_special_calls(gcall *)
Definition tree-cfg.cc:2286
void extract_true_false_edges_from_block(basic_block, edge *, edge *)
Definition tree-cfg.cc:9587
void delete_tree_cfg_annotations(function *)
Definition tree-cfg.cc:2912
bool gimple_duplicate_sese_tail(edge, edge, basic_block *, unsigned, basic_block *)
Definition tree-cfg.cc:6920
basic_block get_abnormal_succ_dispatcher(basic_block)
Definition tree-cfg.cc:715
void gimple_dump_cfg(FILE *, dump_flags_t)
Definition tree-cfg.cc:2644
bool gimple_seq_unreachable_p(gimple_seq)
Definition tree-cfg.cc:441
bool computed_goto_p(gimple *)
Definition tree-cfg.cc:431
edge gimple_switch_edge(function *, gswitch *, unsigned)
Definition tree-cfg.cc:9715
unsigned int split_critical_edges(bool for_edge_insertion_p=false)
Definition tree-cfg.cc:9445
void debug_function(tree, dump_flags_t)
Definition tree-cfg.cc:8559
bool is_ctrl_altering_stmt(gimple *)
Definition tree-cfg.cc:2788
tree gimple_block_label(basic_block)
Definition tree-cfg.cc:6127
void cleanup_dead_labels(void)
Definition tree-cfg.cc:1607
gimple * last_nondebug_stmt(basic_block)
Definition tree-cfg.cc:2965
bool group_case_labels_stmt(gswitch *)
Definition tree-cfg.cc:1810
#define TYPE_SIZE_UNIT(NODE)
Definition tree.h:2303
#define TREE_CODE(NODE)
Definition tree.h:324
#define TREE_TYPE(NODE)
Definition tree.h:512
#define TREE_ADDRESSABLE(NODE)
Definition tree.h:744