xref: /dragonfly/contrib/gcc-8.0/gcc/tree-ssa.h (revision 38fd1498)
1*38fd1498Szrj /* Header file for any pass which requires SSA routines.
2*38fd1498Szrj    Copyright (C) 2013-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj This file is part of GCC.
5*38fd1498Szrj 
6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
7*38fd1498Szrj the terms of the GNU General Public License as published by the Free
8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj version.
10*38fd1498Szrj 
11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*38fd1498Szrj  for more details.
15*38fd1498Szrj 
16*38fd1498Szrj You should have received a copy of the GNU General Public License
17*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
18*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
19*38fd1498Szrj 
20*38fd1498Szrj #ifndef GCC_TREE_SSA_H
21*38fd1498Szrj #define GCC_TREE_SSA_H
22*38fd1498Szrj 
23*38fd1498Szrj /* Mapping for redirected edges.  */
24*38fd1498Szrj struct edge_var_map {
25*38fd1498Szrj   tree result;			/* PHI result.  */
26*38fd1498Szrj   tree def;			/* PHI arg definition.  */
27*38fd1498Szrj   source_location locus;        /* PHI arg location.  */
28*38fd1498Szrj };
29*38fd1498Szrj 
30*38fd1498Szrj /* A vector of var maps.  */
31*38fd1498Szrj typedef vec<edge_var_map, va_heap, vl_embed> edge_var_map_vector;
32*38fd1498Szrj 
33*38fd1498Szrj 
34*38fd1498Szrj extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
35*38fd1498Szrj extern void redirect_edge_var_map_clear (edge);
36*38fd1498Szrj extern void redirect_edge_var_map_dup (edge, edge);
37*38fd1498Szrj extern vec<edge_var_map> *redirect_edge_var_map_vector (edge);
38*38fd1498Szrj extern void redirect_edge_var_map_empty (void);
39*38fd1498Szrj extern edge ssa_redirect_edge (edge, basic_block);
40*38fd1498Szrj extern void flush_pending_stmts (edge);
41*38fd1498Szrj extern void gimple_replace_ssa_lhs (gimple *, tree);
42*38fd1498Szrj extern tree target_for_debug_bind (tree);
43*38fd1498Szrj extern void insert_debug_temp_for_var_def (gimple_stmt_iterator *, tree);
44*38fd1498Szrj extern void insert_debug_temps_for_defs (gimple_stmt_iterator *);
45*38fd1498Szrj extern void reset_debug_uses (gimple *);
46*38fd1498Szrj extern void release_defs_bitset (bitmap toremove);
47*38fd1498Szrj extern void verify_ssa (bool, bool);
48*38fd1498Szrj extern void init_tree_ssa (function *);
49*38fd1498Szrj extern void delete_tree_ssa (function *);
50*38fd1498Szrj extern bool tree_ssa_useless_type_conversion (tree);
51*38fd1498Szrj extern tree tree_ssa_strip_useless_type_conversions (tree);
52*38fd1498Szrj 
53*38fd1498Szrj 
54*38fd1498Szrj extern bool ssa_defined_default_def_p (tree t);
55*38fd1498Szrj extern bool ssa_undefined_value_p (tree, bool = true);
56*38fd1498Szrj extern bool gimple_uses_undefined_value_p (gimple *);
57*38fd1498Szrj extern void execute_update_addresses_taken (void);
58*38fd1498Szrj 
59*38fd1498Szrj /* Given an edge_var_map V, return the PHI arg definition.  */
60*38fd1498Szrj 
61*38fd1498Szrj static inline tree
redirect_edge_var_map_def(edge_var_map * v)62*38fd1498Szrj redirect_edge_var_map_def (edge_var_map *v)
63*38fd1498Szrj {
64*38fd1498Szrj   return v->def;
65*38fd1498Szrj }
66*38fd1498Szrj 
67*38fd1498Szrj /* Given an edge_var_map V, return the PHI result.  */
68*38fd1498Szrj 
69*38fd1498Szrj static inline tree
redirect_edge_var_map_result(edge_var_map * v)70*38fd1498Szrj redirect_edge_var_map_result (edge_var_map *v)
71*38fd1498Szrj {
72*38fd1498Szrj   return v->result;
73*38fd1498Szrj }
74*38fd1498Szrj 
75*38fd1498Szrj /* Given an edge_var_map V, return the PHI arg location.  */
76*38fd1498Szrj 
77*38fd1498Szrj static inline source_location
redirect_edge_var_map_location(edge_var_map * v)78*38fd1498Szrj redirect_edge_var_map_location (edge_var_map *v)
79*38fd1498Szrj {
80*38fd1498Szrj   return v->locus;
81*38fd1498Szrj }
82*38fd1498Szrj 
83*38fd1498Szrj /* Verify SSA invariants, if internal consistency checks are enabled.  */
84*38fd1498Szrj 
85*38fd1498Szrj static inline void
checking_verify_ssa(bool check_modified_stmt,bool check_ssa_operands)86*38fd1498Szrj checking_verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
87*38fd1498Szrj {
88*38fd1498Szrj   if (flag_checking)
89*38fd1498Szrj     verify_ssa (check_modified_stmt, check_ssa_operands);
90*38fd1498Szrj }
91*38fd1498Szrj 
92*38fd1498Szrj #endif /* GCC_TREE_SSA_H */
93