void redirect_edge_var_map_add (edge e, tree result, tree def) { void **slot; edge_var_map_vector old_head, head; edge_var_map new_node; if (edge_var_maps == NULL) edge_var_maps = pointer_map_create (); slot = pointer_map_insert (edge_var_maps, e); old_head = head = (edge_var_map_vector) *slot; if (!head) { head = VEC_alloc (edge_var_map, heap, 5); *slot = head; } new_node.def = def; new_node.result = result; VEC_safe_push (edge_var_map, heap, head, &new_node); if (old_head != head) { /* The push did some reallocation. Update the pointer map. */ *slot = head; } }
void tree_to_aff_combination_expand (tree expr, tree type, aff_tree *comb, struct pointer_map_t **cache) { unsigned i; aff_tree to_add, current, curre; tree e, def, rhs; double_int scale; void **slot; struct name_expansion *exp; tree_to_aff_combination (expr, type, comb); aff_combination_zero (&to_add, type); for (i = 0; i < comb->n; i++) { e = comb->elts[i].val; if (TREE_CODE (e) != SSA_NAME) continue; def = SSA_NAME_DEF_STMT (e); if (TREE_CODE (def) != GIMPLE_MODIFY_STMT || GIMPLE_STMT_OPERAND (def, 0) != e) continue; rhs = GIMPLE_STMT_OPERAND (def, 1); if (TREE_CODE (rhs) != SSA_NAME && !EXPR_P (rhs) && !is_gimple_min_invariant (rhs)) continue; /* We do not know whether the reference retains its value at the place where the expansion is used. */ if (REFERENCE_CLASS_P (rhs)) continue; if (!*cache) *cache = pointer_map_create (); slot = pointer_map_insert (*cache, e); exp = *slot; if (!exp) { exp = XNEW (struct name_expansion); exp->in_progress = 1; *slot = exp; tree_to_aff_combination_expand (rhs, type, ¤t, cache); exp->expansion = current; exp->in_progress = 0; } else {
struct streamer_tree_cache_d * streamer_tree_cache_create (void) { struct streamer_tree_cache_d *cache; cache = XCNEW (struct streamer_tree_cache_d); cache->node_map = pointer_map_create (); /* Load all the well-known tree nodes that are always created by the compiler on startup. This prevents writing them out unnecessarily. */ preload_common_nodes (cache); return cache; }
void redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus) { void **slot; edge_var_map_vector *head; edge_var_map new_node; if (edge_var_maps == NULL) edge_var_maps = pointer_map_create (); slot = pointer_map_insert (edge_var_maps, e); head = (edge_var_map_vector *) *slot; if (!head) vec_safe_reserve (head, 5); new_node.def = def; new_node.result = result; new_node.locus = locus; vec_safe_push (head, new_node); *slot = head; }
/* Cgraph node with function body. */ LTO_symtab_analyzed_node, /* Cgraph edges. */ LTO_symtab_edge, LTO_symtab_indirect_edge, LTO_symtab_variable, LTO_symtab_last_tag }; /* Create a new symtab encoder. */ lto_symtab_encoder_t lto_symtab_encoder_new (void) { lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d); encoder->map = pointer_map_create (); encoder->nodes = NULL; encoder->body = pointer_set_create (); encoder->initializer = pointer_set_create (); return encoder; } /* Delete ENCODER and its components. */ void lto_symtab_encoder_delete (lto_symtab_encoder_t encoder) { VEC_free (symtab_node, heap, encoder->nodes); pointer_map_destroy (encoder->map); pointer_set_destroy (encoder->body);