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