tree replace_invariant_exprs (tree *node) { size_t ix = 0; tree node_list = NULL_TREE; tree t = NULL_TREE, new_var = NULL_TREE, new_node; struct inv_list data; data.list_values = NULL; data.replacement = NULL; data.additional_tcodes = NULL; walk_tree (node, find_inv_trees, (void *)&data, NULL); if (vec_safe_length (data.list_values)) { node_list = push_stmt_list (); for (ix = 0; vec_safe_iterate (data.list_values, ix, &t); ix++) { new_var = build_decl (EXPR_LOCATION (t), VAR_DECL, NULL_TREE, TREE_TYPE (t)); gcc_assert (new_var != NULL_TREE && new_var != error_mark_node); new_node = build2 (MODIFY_EXPR, TREE_TYPE (t), new_var, t); add_stmt (new_node); vec_safe_push (data.replacement, new_var); } walk_tree (node, replace_inv_trees, (void *)&data, NULL); node_list = pop_stmt_list (node_list); } return node_list; }
ipa_ref * symtab_node::iterate_reference (unsigned i, ipa_ref *&ref) { vec_safe_iterate (ref_list.references, i, &ref); return ref; }
static tree replace_invariant_exprs (tree *node) { size_t ix = 0; tree node_list = NULL_TREE; tree t = NULL_TREE, new_var = NULL_TREE; struct inv_list data; data.list_values = NULL; data.replacement = NULL; data.additional_tcodes = NULL; cp_walk_tree (node, find_inv_trees, (void *) &data, NULL); if (vec_safe_length (data.list_values)) { node_list = push_stmt_list (); for (ix = 0; vec_safe_iterate (data.list_values, ix, &t); ix++) { /* Sometimes, when comma_expr has a function call in it, it will typecast it to void. Find_inv_trees finds those nodes and so if it void type, then don't bother creating a new var to hold the return value. */ if (VOID_TYPE_P (TREE_TYPE (t))) { finish_expr_stmt (t); new_var = void_node; } else new_var = get_temp_regvar (TREE_TYPE (t), t); vec_safe_push (data.replacement, new_var); } cp_walk_tree (node, replace_inv_trees, (void *) &data, NULL); node_list = pop_stmt_list (node_list); } return node_list; }