]>
Commit | Line | Data |
---|---|---|
4ee9c684 | 1 | /* Data and Control Flow Analysis for Trees. |
fbd26352 | 2 | Copyright (C) 2001-2019 Free Software Foundation, Inc. |
4ee9c684 | 3 | Contributed by Diego Novillo <dnovillo@redhat.com> |
4 | ||
5 | This file is part of GCC. | |
6 | ||
7 | GCC is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
8c4c00c1 | 9 | the Free Software Foundation; either version 3, or (at your option) |
4ee9c684 | 10 | any later version. |
11 | ||
12 | GCC is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
8c4c00c1 | 18 | along with GCC; see the file COPYING3. If not see |
19 | <http://www.gnu.org/licenses/>. */ | |
4ee9c684 | 20 | |
dd9784d4 | 21 | #ifndef _TREE_CFG_H |
22 | #define _TREE_CFG_H | |
c227f8de | 23 | |
4ee9c684 | 24 | /* Location to track pending stmt for edge insertion. */ |
75a70cf9 | 25 | #define PENDING_STMT(e) ((e)->insns.g) |
4ee9c684 | 26 | |
886c1262 | 27 | /* Garbage collection and PCH support for edge_def. */ |
28 | extern void gt_ggc_mx (edge_def *e); | |
29 | extern void gt_pch_nx (edge_def *e); | |
30 | extern void gt_pch_nx (edge_def *e, gt_pointer_operator, void *); | |
31 | ||
64641360 | 32 | extern void init_empty_tree_cfg_for_function (struct function *); |
33 | extern void init_empty_tree_cfg (void); | |
64641360 | 34 | extern void start_recording_case_labels (void); |
35 | extern void end_recording_case_labels (void); | |
0fb4f2ce | 36 | extern basic_block label_to_block (struct function *, tree); |
64641360 | 37 | extern void cleanup_dead_labels (void); |
eede5d6f | 38 | extern bool group_case_labels_stmt (gswitch *); |
39 | extern bool group_case_labels (void); | |
64641360 | 40 | extern void replace_uses_by (tree, tree); |
ac70caad | 41 | extern basic_block single_noncomplex_succ (basic_block bb); |
1a91d914 | 42 | extern void notice_special_calls (gcall *); |
64641360 | 43 | extern void clear_special_calls (void); |
44 | extern edge find_taken_edge (basic_block, tree); | |
75a70cf9 | 45 | extern void gimple_debug_bb (basic_block); |
46 | extern basic_block gimple_debug_bb_n (int); | |
75a70cf9 | 47 | extern void gimple_debug_cfg (int); |
3f6e5ced | 48 | extern void gimple_dump_cfg (FILE *, dump_flags_t); |
4ee9c684 | 49 | extern void dump_cfg_stats (FILE *); |
50 | extern void debug_cfg_stats (void); | |
42acab1c | 51 | extern bool computed_goto_p (gimple *); |
52 | extern bool stmt_can_make_abnormal_goto (gimple *); | |
b2c0e0b7 | 53 | extern basic_block get_abnormal_succ_dispatcher (basic_block); |
42acab1c | 54 | extern bool is_ctrl_stmt (gimple *); |
55 | extern bool is_ctrl_altering_stmt (gimple *); | |
56 | extern bool simple_goto_p (gimple *); | |
57 | extern bool stmt_ends_bb_p (gimple *); | |
34f3dfc2 | 58 | extern bool gimple_seq_unreachable_p (gimple_seq); |
d9d5743f | 59 | extern bool assert_unreachable_fallthru_edge_p (edge); |
d4f078b5 | 60 | extern void delete_tree_cfg_annotations (function *); |
4d7c6f77 | 61 | extern gphi *get_virtual_phi (basic_block); |
42acab1c | 62 | extern gimple *first_stmt (basic_block); |
63 | extern gimple *last_stmt (basic_block); | |
64 | extern gimple *last_and_only_stmt (basic_block); | |
fd7ad53b | 65 | extern void verify_gimple_in_seq (gimple_seq); |
71b65939 | 66 | extern void verify_gimple_in_cfg (struct function *, bool); |
75a70cf9 | 67 | extern tree gimple_block_label (basic_block); |
64641360 | 68 | extern void add_phi_args_after_copy_bb (basic_block); |
69 | extern void add_phi_args_after_copy (basic_block *, unsigned, edge); | |
ded1c768 | 70 | extern basic_block split_edge_bb_loc (edge); |
75a70cf9 | 71 | extern bool gimple_duplicate_sese_region (edge, edge, basic_block *, unsigned, |
d99f53b2 | 72 | basic_block *, bool); |
75a70cf9 | 73 | extern bool gimple_duplicate_sese_tail (edge, edge, basic_block *, unsigned, |
28c92cbb | 74 | basic_block *); |
e06f9c34 | 75 | extern void gather_blocks_in_sese_region (basic_block entry, basic_block exit, |
f1f41a6c | 76 | vec<basic_block> *bbs_p); |
97630188 | 77 | extern void verify_sese (basic_block, basic_block, vec<basic_block> *); |
883f001d | 78 | extern bool gather_ssa_name_hash_map_from (tree const &, tree const &, void *); |
4855e775 | 79 | extern void fold_loop_internal_call (gimple *, tree); |
64641360 | 80 | extern basic_block move_sese_region_to_fn (struct function *, basic_block, |
81 | basic_block, tree); | |
3f6e5ced | 82 | extern void dump_function_to_file (tree, FILE *, dump_flags_t); |
aa912911 | 83 | extern void debug_function (tree, dump_flags_t); |
64641360 | 84 | extern void print_loops_bb (FILE *, basic_block, int, int); |
85 | extern void print_loops (FILE *, int); | |
2e966e2a | 86 | extern void debug (class loop &ref); |
87 | extern void debug (class loop *ptr); | |
88 | extern void debug_verbose (class loop &ref); | |
89 | extern void debug_verbose (class loop *ptr); | |
64641360 | 90 | extern void debug_loops (int); |
2e966e2a | 91 | extern void debug_loop (class loop *, int); |
64641360 | 92 | extern void debug_loop_num (unsigned, int); |
dd9784d4 | 93 | extern void remove_edge_and_dominated_blocks (edge); |
75a70cf9 | 94 | extern bool gimple_purge_dead_eh_edges (basic_block); |
95 | extern bool gimple_purge_all_dead_eh_edges (const_bitmap); | |
10f52eb8 | 96 | extern bool gimple_purge_dead_abnormal_call_edges (basic_block); |
97 | extern bool gimple_purge_all_dead_abnormal_call_edges (const_bitmap); | |
75a70cf9 | 98 | extern tree gimplify_build3 (gimple_stmt_iterator *, enum tree_code, |
83e2a11b | 99 | tree, tree, tree, tree); |
64641360 | 100 | extern tree gimplify_build2 (gimple_stmt_iterator *, enum tree_code, |
101 | tree, tree, tree); | |
102 | extern tree gimplify_build1 (gimple_stmt_iterator *, enum tree_code, | |
103 | tree, tree); | |
104 | extern void extract_true_false_edges_from_block (basic_block, edge *, edge *); | |
44b41fe7 | 105 | extern tree find_case_label_for_value (const gswitch *switch_stmt, tree val); |
106 | extern edge find_taken_edge_switch_expr (const gswitch *switch_stmt, tree val); | |
64641360 | 107 | extern unsigned int execute_fixup_cfg (void); |
4f018cb1 | 108 | extern unsigned int split_critical_edges (bool for_edge_insertion_p = false); |
a7dca604 | 109 | extern basic_block insert_cond_bb (basic_block, gimple *, gimple *, |
110 | profile_probability); | |
5f8ad053 | 111 | extern bool gimple_find_sub_bbs (gimple_seq, gimple_stmt_iterator *); |
df10fba0 | 112 | extern bool extract_true_false_controlled_edges (basic_block, basic_block, |
113 | edge *, edge *); | |
baab4554 | 114 | extern void generate_range_test (basic_block bb, tree index, tree low, |
115 | tree high, tree *lhs, tree *rhs); | |
0fb4f2ce | 116 | extern basic_block gimple_switch_label_bb (function *, gswitch *, unsigned); |
117 | extern basic_block gimple_switch_default_bb (function *, gswitch *); | |
118 | extern edge gimple_switch_edge (function *, gswitch *, unsigned); | |
119 | extern edge gimple_switch_default_edge (function *, gswitch *); | |
355572cc | 120 | |
0a6b484c | 121 | /* Return true if the LHS of a call should be removed. */ |
122 | ||
123 | inline bool | |
124 | should_remove_lhs_p (tree lhs) | |
125 | { | |
126 | return (lhs | |
127 | && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST | |
128 | && !TREE_ADDRESSABLE (TREE_TYPE (lhs))); | |
129 | } | |
130 | ||
4f018cb1 | 131 | |
132 | inline unsigned int | |
133 | split_edges_for_insertion () | |
134 | { | |
135 | return split_critical_edges (/*for_edge_insertion_p=*/true); | |
136 | } | |
137 | ||
dd9784d4 | 138 | #endif /* _TREE_CFG_H */ |