diff options
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r-- | gcc/tree-sra.c | 179 |
1 files changed, 87 insertions, 92 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 8dd5cb4..b560648 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -250,8 +250,6 @@ struct access typedef struct access *access_p; -DEF_VEC_P (access_p); -DEF_VEC_ALLOC_P (access_p, heap); /* Alloc pool for allocating access structures. */ static alloc_pool access_pool; @@ -268,7 +266,7 @@ struct assign_link /* Alloc pool for allocating assign link structures. */ static alloc_pool link_pool; -/* Base (tree) -> Vector (VEC(access_p,heap) *) map. */ +/* Base (tree) -> Vector (vec<access_p> *) map. */ static struct pointer_map_t *base_access_vec; /* Set of candidates. */ @@ -468,7 +466,7 @@ access_has_replacements_p (struct access *acc) /* Return a vector of pointers to accesses for the variable given in BASE or NULL if there is none. */ -static VEC (access_p, heap) * +static vec<access_p> * get_base_access_vector (tree base) { void **slot; @@ -477,7 +475,7 @@ get_base_access_vector (tree base) if (!slot) return NULL; else - return *(VEC (access_p, heap) **) slot; + return *(vec<access_p> **) slot; } /* Find an access with required OFFSET and SIZE in a subtree of accesses rooted @@ -504,13 +502,13 @@ find_access_in_subtree (struct access *access, HOST_WIDE_INT offset, static struct access * get_first_repr_for_decl (tree base) { - VEC (access_p, heap) *access_vec; + vec<access_p> *access_vec; access_vec = get_base_access_vector (base); if (!access_vec) return NULL; - return VEC_index (access_p, access_vec, 0); + return (*access_vec)[0]; } /* Find an access representative for the variable BASE and given OFFSET and @@ -613,7 +611,7 @@ static void sra_initialize (void) { candidate_bitmap = BITMAP_ALLOC (NULL); - candidates = htab_create (VEC_length (tree, cfun->local_decls) / 2, + candidates = htab_create (vec_safe_length (cfun->local_decls) / 2, uid_decl_map_hash, uid_decl_map_eq, NULL); should_scalarize_away_bitmap = BITMAP_ALLOC (NULL); cannot_scalarize_away_bitmap = BITMAP_ALLOC (NULL); @@ -633,10 +631,8 @@ static bool delete_base_accesses (const void *key ATTRIBUTE_UNUSED, void **value, void *data ATTRIBUTE_UNUSED) { - VEC (access_p, heap) *access_vec; - access_vec = (VEC (access_p, heap) *) *value; - VEC_free (access_p, heap, access_vec); - + vec<access_p> *access_vec = (vec<access_p> *) *value; + vec_free (access_vec); return true; } @@ -800,7 +796,7 @@ mark_parm_dereference (tree base, HOST_WIDE_INT dist, gimple stmt) static struct access * create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size) { - VEC (access_p, heap) *vec; + vec<access_p> *v; struct access *access; void **slot; @@ -812,14 +808,14 @@ create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size) slot = pointer_map_contains (base_access_vec, base); if (slot) - vec = (VEC (access_p, heap) *) *slot; + v = (vec<access_p> *) *slot; else - vec = VEC_alloc (access_p, heap, 32); + vec_alloc (v, 32); - VEC_safe_push (access_p, heap, vec, access); + v->safe_push (access); - *((struct VEC (access_p,heap) **) - pointer_map_insert (base_access_vec, base)) = vec; + *((vec<access_p> **) + pointer_map_insert (base_access_vec, base)) = v; return access; } @@ -1789,22 +1785,22 @@ sort_and_splice_var_accesses (tree var) { int i, j, access_count; struct access *res, **prev_acc_ptr = &res; - VEC (access_p, heap) *access_vec; + vec<access_p> *access_vec; bool first = true; HOST_WIDE_INT low = -1, high = 0; access_vec = get_base_access_vector (var); if (!access_vec) return NULL; - access_count = VEC_length (access_p, access_vec); + access_count = access_vec->length (); /* Sort by <OFFSET, SIZE>. */ - VEC_qsort (access_p, access_vec, compare_access_positions); + access_vec->qsort (compare_access_positions); i = 0; while (i < access_count) { - struct access *access = VEC_index (access_p, access_vec, i); + struct access *access = (*access_vec)[i]; bool grp_write = access->write; bool grp_read = !access->write; bool grp_scalar_write = access->write @@ -1834,7 +1830,7 @@ sort_and_splice_var_accesses (tree var) j = i + 1; while (j < access_count) { - struct access *ac2 = VEC_index (access_p, access_vec, j); + struct access *ac2 = (*access_vec)[j]; if (ac2->offset != access->offset || ac2->size != access->size) break; if (ac2->write) @@ -1889,7 +1885,7 @@ sort_and_splice_var_accesses (tree var) prev_acc_ptr = &access->next_grp; } - gcc_assert (res == VEC_index (access_p, access_vec, 0)); + gcc_assert (res == (*access_vec)[0]); return res; } @@ -2951,8 +2947,7 @@ sra_modify_constructor_assign (gimple *stmt, gimple_stmt_iterator *gsi) } loc = gimple_location (*stmt); - if (VEC_length (constructor_elt, - CONSTRUCTOR_ELTS (gimple_assign_rhs1 (*stmt))) > 0) + if (vec_safe_length (CONSTRUCTOR_ELTS (gimple_assign_rhs1 (*stmt))) > 0) { /* I have never seen this code path trigger but if it can happen the following should handle it gracefully. */ @@ -3353,7 +3348,7 @@ initialize_parameter_reductions (void) parm; parm = DECL_CHAIN (parm)) { - VEC (access_p, heap) *access_vec; + vec<access_p> *access_vec; struct access *access; if (!bitmap_bit_p (candidate_bitmap, DECL_UID (parm))) @@ -3362,7 +3357,7 @@ initialize_parameter_reductions (void) if (!access_vec) continue; - for (access = VEC_index (access_p, access_vec, 0); + for (access = (*access_vec)[0]; access; access = access->next_grp) generate_subtree_copies (access, parm, 0, 0, 0, &gsi, true, true, @@ -3668,7 +3663,7 @@ mark_maybe_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED, current function. */ static void -analyze_modified_params (VEC (access_p, heap) *representatives) +analyze_modified_params (vec<access_p> representatives) { int i; @@ -3676,7 +3671,7 @@ analyze_modified_params (VEC (access_p, heap) *representatives) { struct access *repr; - for (repr = VEC_index (access_p, representatives, i); + for (repr = representatives[i]; repr; repr = repr->next_grp) { @@ -3715,25 +3710,25 @@ analyze_modified_params (VEC (access_p, heap) *representatives) static void propagate_dereference_distances (void) { - VEC (basic_block, heap) *queue; + vec<basic_block> queue; basic_block bb; - queue = VEC_alloc (basic_block, heap, last_basic_block_for_function (cfun)); - VEC_quick_push (basic_block, queue, ENTRY_BLOCK_PTR); + queue.create (last_basic_block_for_function (cfun)); + queue.quick_push (ENTRY_BLOCK_PTR); FOR_EACH_BB (bb) { - VEC_quick_push (basic_block, queue, bb); + queue.quick_push (bb); bb->aux = bb; } - while (!VEC_empty (basic_block, queue)) + while (!queue.is_empty ()) { edge_iterator ei; edge e; bool change = false; int i; - bb = VEC_pop (basic_block, queue); + bb = queue.pop (); bb->aux = NULL; if (bitmap_bit_p (final_bbs, bb->index)) @@ -3775,11 +3770,11 @@ propagate_dereference_distances (void) continue; e->src->aux = e->src; - VEC_quick_push (basic_block, queue, e->src); + queue.quick_push (e->src); } } - VEC_free (basic_block, heap, queue); + queue.release (); } /* Dump a dereferences TABLE with heading STR to file F. */ @@ -3826,7 +3821,7 @@ dump_dereferences_table (FILE *f, const char *str, HOST_WIDE_INT *table) distances of each representative of a (fraction of a) parameter. */ static void -analyze_caller_dereference_legality (VEC (access_p, heap) *representatives) +analyze_caller_dereference_legality (vec<access_p> representatives) { int i; @@ -3844,7 +3839,7 @@ analyze_caller_dereference_legality (VEC (access_p, heap) *representatives) for (i = 0; i < func_param_count; i++) { - struct access *repr = VEC_index (access_p, representatives, i); + struct access *repr = representatives[i]; int idx = ENTRY_BLOCK_PTR->index * func_param_count + i; if (!repr || no_accesses_p (repr)) @@ -3871,19 +3866,19 @@ unmodified_by_ref_scalar_representative (tree parm) { int i, access_count; struct access *repr; - VEC (access_p, heap) *access_vec; + vec<access_p> *access_vec; access_vec = get_base_access_vector (parm); gcc_assert (access_vec); - repr = VEC_index (access_p, access_vec, 0); + repr = (*access_vec)[0]; if (repr->write) return NULL; repr->group_representative = repr; - access_count = VEC_length (access_p, access_vec); + access_count = access_vec->length (); for (i = 1; i < access_count; i++) { - struct access *access = VEC_index (access_p, access_vec, i); + struct access *access = (*access_vec)[i]; if (access->write) return NULL; access->group_representative = repr; @@ -3930,14 +3925,14 @@ splice_param_accesses (tree parm, bool *ro_grp) int i, j, access_count, group_count; int agg_size, total_size = 0; struct access *access, *res, **prev_acc_ptr = &res; - VEC (access_p, heap) *access_vec; + vec<access_p> *access_vec; access_vec = get_base_access_vector (parm); if (!access_vec) return &no_accesses_representant; - access_count = VEC_length (access_p, access_vec); + access_count = access_vec->length (); - VEC_qsort (access_p, access_vec, compare_access_positions); + access_vec->qsort (compare_access_positions); i = 0; total_size = 0; @@ -3946,7 +3941,7 @@ splice_param_accesses (tree parm, bool *ro_grp) { bool modification; tree a1_alias_type; - access = VEC_index (access_p, access_vec, i); + access = (*access_vec)[i]; modification = access->write; if (access_precludes_ipa_sra_p (access)) return NULL; @@ -3959,7 +3954,7 @@ splice_param_accesses (tree parm, bool *ro_grp) j = i + 1; while (j < access_count) { - struct access *ac2 = VEC_index (access_p, access_vec, j); + struct access *ac2 = (*access_vec)[j]; if (ac2->offset != access->offset) { /* All or nothing law for parameters. */ @@ -4097,13 +4092,13 @@ enum ipa_splicing_result { NO_GOOD_ACCESS, UNUSED_PARAMS, BY_VAL_ACCESSES, IPA-SRA. Return result based on what representatives have been found. */ static enum ipa_splicing_result -splice_all_param_accesses (VEC (access_p, heap) **representatives) +splice_all_param_accesses (vec<access_p> &representatives) { enum ipa_splicing_result result = NO_GOOD_ACCESS; tree parm; struct access *repr; - *representatives = VEC_alloc (access_p, heap, func_param_count); + representatives.create (func_param_count); for (parm = DECL_ARGUMENTS (current_function_decl); parm; @@ -4111,8 +4106,7 @@ splice_all_param_accesses (VEC (access_p, heap) **representatives) { if (is_unused_scalar_param (parm)) { - VEC_quick_push (access_p, *representatives, - &no_accesses_representant); + representatives.quick_push (&no_accesses_representant); if (result == NO_GOOD_ACCESS) result = UNUSED_PARAMS; } @@ -4121,7 +4115,7 @@ splice_all_param_accesses (VEC (access_p, heap) **representatives) && bitmap_bit_p (candidate_bitmap, DECL_UID (parm))) { repr = unmodified_by_ref_scalar_representative (parm); - VEC_quick_push (access_p, *representatives, repr); + representatives.quick_push (repr); if (repr) result = UNMODIF_BY_REF_ACCESSES; } @@ -4129,7 +4123,7 @@ splice_all_param_accesses (VEC (access_p, heap) **representatives) { bool ro_grp = false; repr = splice_param_accesses (parm, &ro_grp); - VEC_quick_push (access_p, *representatives, repr); + representatives.quick_push (repr); if (repr && !no_accesses_p (repr)) { @@ -4147,13 +4141,12 @@ splice_all_param_accesses (VEC (access_p, heap) **representatives) result = UNUSED_PARAMS; } else - VEC_quick_push (access_p, *representatives, NULL); + representatives.quick_push (NULL); } if (result == NO_GOOD_ACCESS) { - VEC_free (access_p, heap, *representatives); - *representatives = NULL; + representatives.release (); return NO_GOOD_ACCESS; } @@ -4163,13 +4156,13 @@ splice_all_param_accesses (VEC (access_p, heap) **representatives) /* Return the index of BASE in PARMS. Abort if it is not found. */ static inline int -get_param_index (tree base, VEC(tree, heap) *parms) +get_param_index (tree base, vec<tree> parms) { int i, len; - len = VEC_length (tree, parms); + len = parms.length (); for (i = 0; i < len; i++) - if (VEC_index (tree, parms, i) == base) + if (parms[i] == base) return i; gcc_unreachable (); } @@ -4180,21 +4173,21 @@ get_param_index (tree base, VEC(tree, heap) *parms) final number of adjustments. */ static ipa_parm_adjustment_vec -turn_representatives_into_adjustments (VEC (access_p, heap) *representatives, +turn_representatives_into_adjustments (vec<access_p> representatives, int adjustments_count) { - VEC (tree, heap) *parms; + vec<tree> parms; ipa_parm_adjustment_vec adjustments; tree parm; int i; gcc_assert (adjustments_count > 0); parms = ipa_get_vector_of_formal_parms (current_function_decl); - adjustments = VEC_alloc (ipa_parm_adjustment_t, heap, adjustments_count); + adjustments.create (adjustments_count); parm = DECL_ARGUMENTS (current_function_decl); for (i = 0; i < func_param_count; i++, parm = DECL_CHAIN (parm)) { - struct access *repr = VEC_index (access_p, representatives, i); + struct access *repr = representatives[i]; if (!repr || no_accesses_p (repr)) { @@ -4207,7 +4200,7 @@ turn_representatives_into_adjustments (VEC (access_p, heap) *representatives, adj.copy_param = 1; else adj.remove_param = 1; - VEC_quick_push (ipa_parm_adjustment_t, adjustments, adj); + adjustments.quick_push (adj); } else { @@ -4226,11 +4219,11 @@ turn_representatives_into_adjustments (VEC (access_p, heap) *representatives, adj.by_ref = (POINTER_TYPE_P (TREE_TYPE (repr->base)) && (repr->grp_maybe_modified || repr->grp_not_necessarilly_dereferenced)); - VEC_quick_push (ipa_parm_adjustment_t, adjustments, adj); + adjustments.quick_push (adj); } } } - VEC_free (tree, heap, parms); + parms.release (); return adjustments; } @@ -4243,12 +4236,12 @@ analyze_all_param_acesses (void) enum ipa_splicing_result repr_state; bool proceed = false; int i, adjustments_count = 0; - VEC (access_p, heap) *representatives; + vec<access_p> representatives; ipa_parm_adjustment_vec adjustments; - repr_state = splice_all_param_accesses (&representatives); + repr_state = splice_all_param_accesses (representatives); if (repr_state == NO_GOOD_ACCESS) - return NULL; + return ipa_parm_adjustment_vec(); /* If there are any parameters passed by reference which are not modified directly, we need to check whether they can be modified indirectly. */ @@ -4260,7 +4253,7 @@ analyze_all_param_acesses (void) for (i = 0; i < func_param_count; i++) { - struct access *repr = VEC_index (access_p, representatives, i); + struct access *repr = representatives[i]; if (repr && !no_accesses_p (repr)) { @@ -4269,7 +4262,7 @@ analyze_all_param_acesses (void) adjustments_count++; if (repr->grp_not_necessarilly_dereferenced || repr->grp_maybe_modified) - VEC_replace (access_p, representatives, i, NULL); + representatives[i] = NULL; else { proceed = true; @@ -4282,7 +4275,7 @@ analyze_all_param_acesses (void) if (new_components == 0) { - VEC_replace (access_p, representatives, i, NULL); + representatives[i] = NULL; adjustments_count++; } else @@ -4312,9 +4305,9 @@ analyze_all_param_acesses (void) adjustments = turn_representatives_into_adjustments (representatives, adjustments_count); else - adjustments = NULL; + adjustments = ipa_parm_adjustment_vec(); - VEC_free (access_p, heap, representatives); + representatives.release (); return adjustments; } @@ -4350,12 +4343,12 @@ get_adjustment_for_base (ipa_parm_adjustment_vec adjustments, tree base) { int i, len; - len = VEC_length (ipa_parm_adjustment_t, adjustments); + len = adjustments.length (); for (i = 0; i < len; i++) { struct ipa_parm_adjustment *adj; - adj = &VEC_index (ipa_parm_adjustment_t, adjustments, i); + adj = &adjustments[i]; if (!adj->copy_param && adj->base == base) return adj; } @@ -4436,7 +4429,7 @@ sra_ipa_modify_expr (tree *expr, bool convert, HOST_WIDE_INT offset, size, max_size; tree base, src; - len = VEC_length (ipa_parm_adjustment_t, adjustments); + len = adjustments.length (); if (TREE_CODE (*expr) == BIT_FIELD_REF || TREE_CODE (*expr) == IMAGPART_EXPR @@ -4462,7 +4455,7 @@ sra_ipa_modify_expr (tree *expr, bool convert, for (i = 0; i < len; i++) { - adj = &VEC_index (ipa_parm_adjustment_t, adjustments, i); + adj = &adjustments[i]; if (adj->base == base && (adj->offset == offset || adj->remove_param)) @@ -4532,7 +4525,8 @@ sra_ipa_modify_assign (gimple *stmt_ptr, gimple_stmt_iterator *gsi, if (is_gimple_reg_type (TREE_TYPE (*lhs_p))) *rhs_p = build_zero_cst (TREE_TYPE (*lhs_p)); else - *rhs_p = build_constructor (TREE_TYPE (*lhs_p), 0); + *rhs_p = build_constructor (TREE_TYPE (*lhs_p), + NULL); } else new_rhs = fold_build1_loc (gimple_location (stmt), @@ -4660,7 +4654,7 @@ sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments) gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR)); gsip = &gsi; } - len = VEC_length (ipa_parm_adjustment_t, adjustments); + len = adjustments.length (); for (i = 0; i < len; i++) { struct ipa_parm_adjustment *adj; @@ -4669,7 +4663,7 @@ sra_ipa_reset_debug_stmts (ipa_parm_adjustment_vec adjustments) tree name, vexpr, copy = NULL_TREE; use_operand_p use_p; - adj = &VEC_index (ipa_parm_adjustment_t, adjustments, i); + adj = &adjustments[i]; if (adj->copy_param || !is_gimple_reg (adj->base)) continue; name = ssa_default_def (cfun, adj->base); @@ -4758,7 +4752,7 @@ static bool convert_callers_for_node (struct cgraph_node *node, void *data) { - ipa_parm_adjustment_vec adjustments = (ipa_parm_adjustment_vec)data; + ipa_parm_adjustment_vec *adjustments = (ipa_parm_adjustment_vec *) data; bitmap recomputed_callers = BITMAP_ALLOC (NULL); struct cgraph_edge *cs; @@ -4772,7 +4766,7 @@ convert_callers_for_node (struct cgraph_node *node, xstrdup (cgraph_node_name (cs->caller)), xstrdup (cgraph_node_name (cs->callee))); - ipa_modify_call_arguments (cs, cs->call_stmt, adjustments); + ipa_modify_call_arguments (cs, cs->call_stmt, *adjustments); pop_cfun (); } @@ -4795,7 +4789,7 @@ convert_callers (struct cgraph_node *node, tree old_decl, basic_block this_block; cgraph_for_node_and_aliases (node, convert_callers_for_node, - adjustments, false); + &adjustments, false); if (!encountered_recursive_call) return; @@ -4832,15 +4826,16 @@ modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments) { struct cgraph_node *new_node; bool cfg_changed; - VEC (cgraph_edge_p, heap) * redirect_callers = collect_callers_of_node (node); + vec<cgraph_edge_p> redirect_callers = collect_callers_of_node (node); rebuild_cgraph_edges (); free_dominance_info (CDI_DOMINATORS); pop_cfun (); - new_node = cgraph_function_versioning (node, redirect_callers, NULL, NULL, - false, NULL, NULL, "isra"); - VEC_free (cgraph_edge_p, heap, redirect_callers); + new_node = cgraph_function_versioning (node, redirect_callers, + NULL, + NULL, false, NULL, NULL, "isra"); + redirect_callers.release (); push_cfun (DECL_STRUCT_FUNCTION (new_node->symbol.decl)); ipa_modify_formal_parameters (current_function_decl, adjustments, "ISRA"); @@ -4968,7 +4963,7 @@ ipa_early_sra (void) } adjustments = analyze_all_param_acesses (); - if (!adjustments) + if (!adjustments.exists ()) goto out; if (dump_file) ipa_dump_param_adjustments (dump_file, adjustments, current_function_decl); @@ -4977,7 +4972,7 @@ ipa_early_sra (void) ret = TODO_update_ssa | TODO_cleanup_cfg; else ret = TODO_update_ssa; - VEC_free (ipa_parm_adjustment_t, heap, adjustments); + adjustments.release (); statistics_counter_event (cfun, "Unused parameters deleted", sra_stats.deleted_unused_parameters); |