GCC Middle and Back End API Reference
tree-into-ssa.h File Reference

Go to the source code of this file.

Functions

tree get_current_def (tree)
void set_current_def (tree, tree)
void delete_update_ssa (void)
tree create_new_def_for (tree, gimple *, def_operand_p)
void mark_virtual_operands_for_renaming (struct function *)
void mark_virtual_operand_for_renaming (tree)
void mark_virtual_phi_result_for_renaming (gphi *)
bool need_ssa_update_p (struct function *)
bool name_registered_for_update_p (tree)
void release_ssa_name_after_update_ssa (tree)
void update_ssa (unsigned)
void debug_decl_set (bitmap set)
void dump_defs_stack (FILE *, int)
void debug_defs_stack (int)
void dump_currdefs (FILE *)
void debug_currdefs (void)
void dump_tree_ssa (FILE *)
void debug_tree_ssa (void)
void dump_tree_ssa_stats (FILE *)
void debug_tree_ssa_stats (void)
void dump_var_infos (FILE *)
void debug_var_infos (void)
void dump_names_replaced_by (FILE *, tree)
void debug_names_replaced_by (tree)
void dump_update_ssa (FILE *)
void debug_update_ssa (void)

Variables

bitmap names_to_release

Function Documentation

◆ create_new_def_for()

tree create_new_def_for ( tree old_name,
gimple * stmt,
def_operand_p def )
Create a new name for OLD_NAME in statement STMT and replace the operand pointed to by DEF_P with the newly created name. If DEF_P is NULL then STMT should be a GIMPLE assignment. Return the new name and register the replacement mapping <NEW, OLD> in update_ssa's tables.

References add_new_name_mapping(), bb_has_abnormal_pred(), cfun, common_info::current_def, duplicate_ssa_name(), gcc_assert, get_ssa_name_ann(), gimple_assign_set_lhs(), gimple_bb(), ssa_name_info::info, init_update_ssa(), SET_DEF, SSA_NAME_OCCURS_IN_ABNORMAL_PHI, timevar_pop(), timevar_push(), and update_ssa_initialized_fn.

Referenced by add_exit_phi(), gimple_duplicate_bb(), sese_add_exit_phis_edge(), worker_single_copy(), and worker_single_simple().

◆ debug_currdefs()

void debug_currdefs ( void )
extern
Dump the current reaching definition of every symbol to stderr.

References dump_currdefs().

◆ debug_decl_set()

void debug_decl_set ( bitmap set)
extern
Prototypes for debugging functions.
Dump bitmap SET (assumed to contain VAR_DECLs) to FILE.

References dump_decl_set().

◆ debug_defs_stack()

void debug_defs_stack ( int n)
extern
Dump the renaming stack (block_defs_stack) to stderr. Traverse the stack up to a maximum of N levels. If N is -1, the whole stack is dumped. New levels are created when the dominator tree traversal used for renaming enters a new sub-tree.

References dump_defs_stack().

◆ debug_names_replaced_by()

void debug_names_replaced_by ( tree name)
extern
Dump all the names replaced by NAME to stderr.

References dump_names_replaced_by().

◆ debug_tree_ssa()

void debug_tree_ssa ( void )
extern
Dump SSA information to stderr.

References dump_tree_ssa().

◆ debug_tree_ssa_stats()

void debug_tree_ssa_stats ( void )
extern
Dump SSA statistics on stderr.

References dump_tree_ssa_stats().

◆ debug_update_ssa()

void debug_update_ssa ( void )
extern
Dump SSA update information to stderr.

References dump_update_ssa().

◆ debug_var_infos()

void debug_var_infos ( void )
extern
Dump the VAR_INFOS hash table on stderr.

References dump_var_infos().

◆ delete_update_ssa()

◆ dump_currdefs()

void dump_currdefs ( FILE * file)
extern
Dump the current reaching definition of every symbol to FILE.

References common_info::current_def, get_common_info(), print_generic_expr(), and symbols_to_rename.

Referenced by debug_currdefs(), and dump_tree_ssa().

◆ dump_defs_stack()

void dump_defs_stack ( FILE * file,
int n )
extern
Dump the renaming stack (block_defs_stack) to FILE. Traverse the stack up to a maximum of N levels. If N is -1, the whole stack is dumped. New levels are created when the dominator tree traversal used for renaming enters a new sub-tree.

References block_defs_stack, DECL_P, i, is_gimple_reg(), NULL_TREE, print_generic_expr(), and SSA_NAME_VAR.

Referenced by debug_defs_stack(), and dump_tree_ssa().

◆ dump_names_replaced_by()

void dump_names_replaced_by ( FILE * file,
tree name )
extern
Dump all the names replaced by NAME to FILE.

References EXECUTE_IF_SET_IN_BITMAP, i, names_replaced_by(), print_generic_expr(), and ssa_name.

Referenced by debug_names_replaced_by(), and dump_update_ssa().

◆ dump_tree_ssa()

void dump_tree_ssa ( FILE * file)
extern

◆ dump_tree_ssa_stats()

void dump_tree_ssa_stats ( FILE * file)
extern
Dump SSA statistics on FILE.

References htab_statistics(), and var_infos.

Referenced by debug_tree_ssa_stats(), dump_tree_ssa(), and rewrite_blocks().

◆ dump_update_ssa()

void dump_update_ssa ( FILE * file)
extern

◆ dump_var_infos()

void dump_var_infos ( FILE * file)
extern
Dump the VAR_INFOS hash table on FILE.

References debug_var_infos_r(), and var_infos.

Referenced by debug_var_infos(), and dump_tree_ssa().

◆ get_current_def()

tree get_current_def ( tree var)
extern
Header file for normal form into SSA. Copyright (C) 2013-2025 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>.
Return the current definition for VAR.

References common_info::current_def, and get_common_info().

Referenced by copy_loop_before(), maybe_add_asan_poison_write(), rename_use_op(), and vect_loop_versioning().

◆ mark_virtual_operand_for_renaming()

void mark_virtual_operand_for_renaming ( tree name)
Replace all uses of NAME by underlying variable and mark it for renaming. This assumes the defining statement of NAME is going to be removed.

References cfun, FOR_EACH_IMM_USE_ON_STMT, FOR_EACH_IMM_USE_STMT, gcc_assert, mark_virtual_operands_for_renaming(), SET_USE, SSA_NAME_VAR, and VAR_DECL_IS_VIRTUAL_OPERAND.

Referenced by destroy_loop(), mark_virtual_phi_result_for_renaming(), release_last_vdef(), and sink_clobbers().

◆ mark_virtual_operands_for_renaming()

void mark_virtual_operands_for_renaming ( struct function * fn)

◆ mark_virtual_phi_result_for_renaming()

void mark_virtual_phi_result_for_renaming ( gphi * phi)
Replace all uses of the virtual PHI result by its underlying variable and mark it for renaming. This assumes the PHI node is going to be removed.

References dump_file, dump_flags, gimple_phi_result(), mark_virtual_operand_for_renaming(), print_gimple_stmt(), TDF_DETAILS, and TDF_SLIM.

Referenced by destroy_loop(), eliminate_unnecessary_stmts(), release_last_vdef(), and split_function().

◆ name_registered_for_update_p()

◆ need_ssa_update_p()

◆ release_ssa_name_after_update_ssa()

void release_ssa_name_after_update_ssa ( tree name)
Mark NAME to be released after update_ssa has finished.

References BITMAP_ALLOC, bitmap_set_bit, cfun, gcc_assert, names_to_release, NULL, SSA_NAME_VERSION, and update_ssa_initialized_fn.

Referenced by release_ssa_name_fn().

◆ set_current_def()

void set_current_def ( tree var,
tree def )
extern
Sets current definition of VAR to DEF.

References common_info::current_def, and get_common_info().

◆ update_ssa()

void update_ssa ( unsigned update_flags)
Given a set of newly created SSA names (NEW_SSA_NAMES) and a set of existing SSA names (OLD_SSA_NAMES), update the SSA form so that: 1- The names in OLD_SSA_NAMES dominated by the definitions of NEW_SSA_NAMES are all re-written to be reached by the appropriate definition from NEW_SSA_NAMES. 2- If needed, new PHI nodes are added to the iterated dominance frontier of the blocks where each of NEW_SSA_NAMES are defined. The mapping between OLD_SSA_NAMES and NEW_SSA_NAMES is setup by calling create_new_def_for to create new defs for names that the caller wants to replace. The caller cretaes the new names to be inserted and the names that need to be replaced by calling create_new_def_for for each old definition to be replaced. Note that the function assumes that the new defining statement has already been inserted in the IL. For instance, given the following code: 1 L0: 2 x_1 = PHI (0, x_5) 3 if (x_1 < 10) 4 if (x_1 > 7) 5 y_2 = 0 6 else 7 y_3 = x_1 + x_7 8 endif 9 x_5 = x_1 + 1 10 goto L0; 11 endif Suppose that we insert new names x_10 and x_11 (lines 4 and 8). 1 L0: 2 x_1 = PHI (0, x_5) 3 if (x_1 < 10) 4 x_10 = ... 5 if (x_1 > 7) 6 y_2 = 0 7 else 8 x_11 = ... 9 y_3 = x_1 + x_7 10 endif 11 x_5 = x_1 + 1 12 goto L0; 13 endif We want to replace all the uses of x_1 with the new definitions of x_10 and x_11. Note that the only uses that should be replaced are those at lines 5, 9 and 11. Also, the use of x_7 at line 9 should *not* be replaced (this is why we cannot just mark symbol 'x' for renaming). Additionally, we may need to insert a PHI node at line 11 because that is a merge point for x_10 and x_11. So the use of x_1 at line 11 will be replaced with the new PHI node. The insertion of PHI nodes is optional. They are not strictly necessary to preserve the SSA form, and depending on what the caller inserted, they may not even be useful for the optimizers. UPDATE_FLAGS controls various aspects of how update_ssa operates, see the documentation for TODO_update_ssa*.

References BITMAP_ALLOC, bitmap_clear(), bitmap_default_obstack, bitmap_empty_p(), bitmap_initialize(), bitmap_list_view(), bitmap_tree_view(), blocks_to_update, blocks_with_phis_to_rewrite, calculate_dominance_info(), CDI_DOMINATORS, cfun, compute_dominance_frontiers(), common_info::current_def, debug_gimple_stmt(), delete_update_ssa(), dom_info_state(), DOM_NONE, dump_file, dump_flags, dump_update_ssa(), ENTRY_BLOCK_PTR_FOR_FN, error(), EXECUTE_IF_SET_IN_BITMAP, FOR_EACH_BB_FN, FOR_EACH_SSA_NAME, FOR_EACH_SSA_USE_OPERAND, FOR_EACH_VEC_ELT, free(), gcc_assert, get_ssa_name_ann(), get_var_info(), gsi_end_p(), gsi_next(), gsi_start_bb(), gsi_stmt(), i, basic_block_def::index, ssa_name_info::info, var_info::info, init_update_ssa(), insert_updated_phi_nodes_compare_uids(), insert_updated_phi_nodes_for(), internal_error(), iterating_old_ssa_names, last_basic_block_for_fn, marked_for_renaming(), nearest_common_dominator_for_set(), need_ssa_update_p(), new_ssa_names, NULL, NULL_TREE, old_ssa_names, PERCENT, prepare_block_for_update(), prepare_names_to_update(), print_generic_expr(), rewrite_blocks(), REWRITE_UPDATE, REWRITE_UPDATE_REGION, ssa_name, SSA_NAME_IN_FREE_LIST, SSA_NAME_VAR, SSA_OP_ALL_USES, statistics_counter_event(), symbols_to_rename, TDF_DETAILS, TDF_SLIM, timevar_pop(), timevar_push(), TODO_update_ssa, TODO_update_ssa_full_phi, TODO_update_ssa_no_phi, TODO_update_ssa_only_virtuals, TREE_CODE, update_ssa_initialized_fn, USE_FROM_PTR, var_infos, and virtual_operand_p().

Referenced by autofdo::afdo_annotate_cfg(), cleanup_tree_cfg_noloop(), compute_fn_summary(), autofdo::early_inline(), execute_function_todo(), execute_update_addresses_taken(), cgraph_node::expand(), expand_ifn_va_arg_1(), expand_omp_taskreg(), expand_thunk(), gen_parallel_loop(), cgraph_node::get_body(), ipa_tm_transform_clone(), ipa_tm_transform_transaction(), rewrite_into_loop_closed_ssa_1(), simd_clone_adjust(), tree_function_versioning(), tree_profiling(), tree_transform_and_unroll_loop(), tree_unroll_loops_completely(), tree_unswitch_single_loop(), vect_loop_versioning(), version_loop_by_alias_check(), and version_loop_for_if_conversion().

Variable Documentation

◆ names_to_release

bitmap names_to_release
extern
Set of SSA names that have been marked to be released after they were registered in the replacement table. They will be finally released after we finish updating the SSA web.

Referenced by delete_update_ssa(), dump_update_ssa(), init_update_ssa(), prepare_def_site_for(), prepare_names_to_update(), release_ssa_name_after_update_ssa(), and verify_ssaname_freelists().