diff options
author | Martin Jambor <mjambor@suse.cz> | 2008-07-08 15:25:24 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2008-07-08 15:25:24 +0200 |
commit | 771578a0df0245565f21186deb58135c3351f3a7 (patch) | |
tree | e964190c72b31bbe2578ccc7a12321dbf171286e | |
parent | d1349557126e2b625bb3183ccc2d94ab03b22618 (diff) | |
download | gcc-771578a0df0245565f21186deb58135c3351f3a7.zip gcc-771578a0df0245565f21186deb58135c3351f3a7.tar.gz gcc-771578a0df0245565f21186deb58135c3351f3a7.tar.bz2 |
ipa-cp.c (ipcp_init_cloned_node): Call ipa_check_create_node_params instead of ipa_create_node_params.
2008-07-08 Martin Jambor <mjambor@suse.cz>
* ipa-cp.c (ipcp_init_cloned_node): Call ipa_check_create_node_params
instead of ipa_create_node_params.
(ipcp_driver): Allocate infos with ipa_check_create_node_params and
ipa_check_create_edge_args, free them with
free_all_ipa_structures_after_ipa_cp, call ipa_register_cgraph_hooks.
* ipa-prop.c: Include flags.h and tree-inline.h.
(ipa_node_params_vector): New variable.
(ipa_edge_args_vector): New variable.
(edge_removal_hook_holder): New variable.
(node_removal_hook_holder): New variable.
(edge_duplication_hook_holder): New variable.
(node_duplication_hook_holder): New variable.
(ipa_detect_param_modifications): Check for presence of modified flags.
(ipa_compute_jump_functions): Check for presence of jump functions.
(ipa_free_edge_args_substructures): New function.
(ipa_create_node_params): Removed.
(ipa_free_all_edge_args): Changed to deallocate the on-the-side vector.
(ipa_free_node_params_substructures): New function.
(ipa_free_all_node_params): Changed to deallocate the on-the-side
vector.
(ipa_edge_removal_hook): New function.
(ipa_node_removal_hook): New function.
(duplicate_array): New function.
(ipa_edge_duplication_hook): New function.
(ipa_node_duplication_hook): New function.
(ipa_register_cgraph_hooks): New function.
(ipa_unregister_cgraph_hooks): New function.
(free_all_ipa_structures_after_ipa_cp): New function.
* ipa-prop.h: Include vec.h.
(ipa_node_params_t): New typedef with vector types for it.
(ipa_edge_args_t): New typedef with vector types for it.
(IPA_NODE_REF): Changed to access an on-the-side vector.
(IPA_EDGE_REF): Changed to access an on-the-side vector.
(ipa_check_create_node_params): New function.
(ipa_check_create_edge_args): New function.
* Makefile.in (IPA_PROP_H): New variable for ipa-prop.h. Converted
all users.
From-SVN: r137620
-rw-r--r-- | gcc/ChangeLog | 43 | ||||
-rw-r--r-- | gcc/Makefile.in | 13 | ||||
-rw-r--r-- | gcc/ipa-cp.c | 10 | ||||
-rw-r--r-- | gcc/ipa-prop.c | 221 | ||||
-rw-r--r-- | gcc/ipa-prop.h | 81 |
5 files changed, 293 insertions, 75 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 30b98a5..4a126ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,46 @@ +2008-07-08 Martin Jambor <mjambor@suse.cz> + + * ipa-cp.c (ipcp_init_cloned_node): Call ipa_check_create_node_params + instead of ipa_create_node_params. + (ipcp_driver): Allocate infos with ipa_check_create_node_params and + ipa_check_create_edge_args, free them with + free_all_ipa_structures_after_ipa_cp, call ipa_register_cgraph_hooks. + + * ipa-prop.c: Include flags.h and tree-inline.h. + (ipa_node_params_vector): New variable. + (ipa_edge_args_vector): New variable. + (edge_removal_hook_holder): New variable. + (node_removal_hook_holder): New variable. + (edge_duplication_hook_holder): New variable. + (node_duplication_hook_holder): New variable. + (ipa_detect_param_modifications): Check for presence of modified flags. + (ipa_compute_jump_functions): Check for presence of jump functions. + (ipa_free_edge_args_substructures): New function. + (ipa_create_node_params): Removed. + (ipa_free_all_edge_args): Changed to deallocate the on-the-side vector. + (ipa_free_node_params_substructures): New function. + (ipa_free_all_node_params): Changed to deallocate the on-the-side + vector. + (ipa_edge_removal_hook): New function. + (ipa_node_removal_hook): New function. + (duplicate_array): New function. + (ipa_edge_duplication_hook): New function. + (ipa_node_duplication_hook): New function. + (ipa_register_cgraph_hooks): New function. + (ipa_unregister_cgraph_hooks): New function. + (free_all_ipa_structures_after_ipa_cp): New function. + + * ipa-prop.h: Include vec.h. + (ipa_node_params_t): New typedef with vector types for it. + (ipa_edge_args_t): New typedef with vector types for it. + (IPA_NODE_REF): Changed to access an on-the-side vector. + (IPA_EDGE_REF): Changed to access an on-the-side vector. + (ipa_check_create_node_params): New function. + (ipa_check_create_edge_args): New function. + + * Makefile.in (IPA_PROP_H): New variable for ipa-prop.h. Converted + all users. + 2008-07-07 Tom Tromey <tromey@redhat.com> * configure, config.in: Rebuilt. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index ef03366..a3def27 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -839,6 +839,7 @@ TREE_INLINE_H = tree-inline.h $(VARRAY_H) pointer-set.h REAL_H = real.h $(MACHMODE_H) DBGCNT_H = dbgcnt.h dbgcnt.def EBIMAP_H = ebitmap.h sbitmap.h +IPA_PROP_H = $(TREE_H) vec.h # # Now figure out from those variables how to compile and link. @@ -2007,7 +2008,7 @@ tree-inline.o : tree-inline.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ $(VARRAY_H) $(HASHTAB_H) $(SPLAY_TREE_H) toplev.h \ langhooks.h $(TREE_INLINE_H) $(CGRAPH_H) intl.h $(FUNCTION_H) $(TREE_GIMPLE_H) \ debug.h $(DIAGNOSTIC_H) $(TREE_FLOW_H) tree-iterator.h tree-mudflap.h \ - ipa-prop.h value-prof.h $(TARGET_H) $(INTEGRATE_H) + $(IPA_PROP_H) value-prof.h $(TARGET_H) $(INTEGRATE_H) print-tree.o : print-tree.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ $(GGC_H) langhooks.h $(REAL_H) tree-iterator.h fixed-value.h $(TREE_FLOW_H) stor-layout.o : stor-layout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ @@ -2520,7 +2521,7 @@ cgraphunit.o : cgraphunit.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ $(TREE_H) langhooks.h $(TREE_INLINE_H) toplev.h $(FLAGS_H) $(GGC_H) \ $(TARGET_H) $(CGRAPH_H) intl.h pointer-set.h $(FUNCTION_H) $(TREE_GIMPLE_H) \ $(TREE_FLOW_H) tree-pass.h $(C_COMMON_H) debug.h $(DIAGNOSTIC_H) \ - $(FIBHEAP_H) output.h $(PARAMS_H) $(RTL_H) $(TIMEVAR_H) ipa-prop.h \ + $(FIBHEAP_H) output.h $(PARAMS_H) $(RTL_H) $(TIMEVAR_H) $(IPA_PROP_H) \ gt-cgraphunit.h cgraphbuild.o : cgraphbuild.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ $(TREE_H) langhooks.h $(CGRAPH_H) intl.h pointer-set.h $(TREE_GIMPLE_H) \ @@ -2529,14 +2530,14 @@ varpool.o : varpool.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ $(TREE_H) langhooks.h $(TREE_INLINE_H) toplev.h $(FLAGS_H) $(GGC_H) \ $(TARGET_H) $(CGRAPH_H) intl.h pointer-set.h $(FUNCTION_H) $(TREE_GIMPLE_H) \ $(TREE_FLOW_H) tree-pass.h $(C_COMMON_H) debug.h $(DIAGNOSTIC_H) \ - $(FIBHEAP_H) output.h $(PARAMS_H) $(RTL_H) $(TIMEVAR_H) ipa-prop.h \ + $(FIBHEAP_H) output.h $(PARAMS_H) $(RTL_H) $(TIMEVAR_H) $(IPA_PROP_H) \ gt-varpool.h ipa.o : ipa.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(CGRAPH_H) ipa-prop.o : ipa-prop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ - langhooks.h $(GGC_H) $(TARGET_H) $(CGRAPH_H) ipa-prop.h \ - $(TREE_FLOW_H) $(TM_H) tree-pass.h $(FLAGS_H) $(TREE_H) + langhooks.h $(GGC_H) $(TARGET_H) $(CGRAPH_H) $(IPA_PROP_H) \ + $(TREE_FLOW_H) $(TM_H) tree-pass.h $(FLAGS_H) $(TREE_H) tree-inline.h ipa-cp.o : ipa-cp.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ - langhooks.h $(TARGET_H) $(CGRAPH_H) ipa-prop.h tree-inline.h tree-dump.h \ + langhooks.h $(TARGET_H) $(CGRAPH_H) $(IPA_PROP_H) tree-inline.h tree-dump.h \ $(TREE_FLOW_H) $(TM_H) tree-pass.h $(FLAGS_H) $(TREE_H) $(DIAGNOSTIC_H) matrix-reorg.o : matrix-reorg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ $(TARGET_H) $(CGRAPH_H) $(TREE_FLOW_H) $(TM_H) tree-pass.h \ diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 9e21531..bda0fc2 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -153,7 +153,7 @@ static void ipcp_init_cloned_node (struct cgraph_node *orig_node, struct cgraph_node *new_node) { - ipa_create_node_params (new_node); + ipa_check_create_node_params (); IPA_NODE_REF (new_node)->ipcp_orig_node = orig_node; ipa_count_formal_params (new_node); ipa_create_param_decls_array (new_node); @@ -998,8 +998,9 @@ ipcp_driver (void) { if (dump_file) fprintf (dump_file, "\nIPA constant propagation start:\n"); - ipa_create_all_node_params (); - ipa_create_all_edge_args (); + ipa_check_create_node_params (); + ipa_check_create_edge_args (); + ipa_register_cgraph_hooks (); /* 1. Call the init stage to initialize the ipa_node_params and ipa_edge_args structures. */ ipcp_init_stage (); @@ -1025,8 +1026,7 @@ ipcp_driver (void) ipcp_print_profile_data (dump_file); } /* Free all IPCP structures. */ - ipa_free_all_node_params (); - ipa_free_all_edge_args (); + free_all_ipa_structures_after_ipa_cp (); if (dump_file) fprintf (dump_file, "\nIPA constant propagation end\n"); cgraph_remove_unreachable_nodes (true, NULL); diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index c5b4c9a..f67d657 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -28,8 +28,21 @@ along with GCC; see the file COPYING3. If not see #include "ipa-prop.h" #include "tree-flow.h" #include "tree-pass.h" +#include "tree-inline.h" #include "flags.h" #include "timevar.h" +#include "flags.h" + +/* Vector where the parameter infos are actually stored. */ +VEC (ipa_node_params_t, heap) *ipa_node_params_vector; +/* Vector where the parameter infos are actually stored. */ +VEC (ipa_edge_args_t, heap) *ipa_edge_args_vector; + +/* Holders of ipa cgraph hooks: */ +struct cgraph_edge_hook_list *edge_removal_hook_holder; +struct cgraph_node_hook_list *node_removal_hook_holder; +struct cgraph_2edge_hook_list *edge_duplication_hook_holder; +struct cgraph_2node_hook_list *node_duplication_hook_holder; /* Initialize worklist to contain all functions. */ struct ipa_func_list * @@ -176,7 +189,7 @@ ipa_detect_param_modifications (struct cgraph_node *mt) tree stmt, parm_tree; struct ipa_node_params *info = IPA_NODE_REF (mt); - if (ipa_get_param_count (info) == 0) + if (ipa_get_param_count (info) == 0 || info->modified_flags) return; count = ipa_get_param_count (info); @@ -244,7 +257,7 @@ ipa_compute_jump_functions (struct cgraph_edge *cs) call_expr_arg_iterator iter; struct ipa_edge_args *args = IPA_EDGE_REF (cs); - if (ipa_get_cs_argument_count (args) == 0) + if (ipa_get_cs_argument_count (args) == 0 || args->jump_functions) return; args->jump_functions = XCNEWVEC (struct ipa_jump_func, ipa_get_cs_argument_count (args)); @@ -316,74 +329,184 @@ ipa_compute_jump_functions (struct cgraph_edge *cs) } } -/* Allocate and initialize ipa_node_params structure for the given cgraph - node. */ +/* Frees all dynamically allocated structures that the argument info points + to. */ void -ipa_create_node_params (struct cgraph_node *node) +ipa_free_edge_args_substructures (struct ipa_edge_args *args) { - node->aux = xcalloc (1, sizeof (struct ipa_node_params)); + if (args->jump_functions) + free (args->jump_functions); + + memset (args, 0, sizeof (*args)); } -/* Allocate and initialize ipa_node_params structure for all - nodes in callgraph. */ +/* Free all ipa_edge structures. */ void -ipa_create_all_node_params (void) +ipa_free_all_edge_args (void) { - struct cgraph_node *node; + int i; + struct ipa_edge_args *args; - for (node = cgraph_nodes; node; node = node->next) - ipa_create_node_params (node); + for (i = 0; + VEC_iterate (ipa_edge_args_t, ipa_edge_args_vector, i, args); + i++) + ipa_free_edge_args_substructures (args); + + VEC_free (ipa_edge_args_t, heap, ipa_edge_args_vector); + ipa_edge_args_vector = NULL; } -/* Allocate and initialize ipa_edge structure. */ +/* Frees all dynamically allocated structures that the param info points + to. */ void -ipa_create_all_edge_args (void) +ipa_free_node_params_substructures (struct ipa_node_params *info) { - struct cgraph_node *node; - struct cgraph_edge *cs; - - for (node = cgraph_nodes; node; node = node->next) - for (cs = node->callees; cs; cs = cs->next_callee) - cs->aux = xcalloc (1, sizeof (struct ipa_edge_args)); + if (info->ipcp_lattices) + free (info->ipcp_lattices); + if (info->param_decls) + free (info->param_decls); + if (info->modified_flags) + free (info->modified_flags); + + memset (info, 0, sizeof (*info)); } -/* Free ipa_edge structure. */ +/* Free all ipa_node_params structures. */ void -ipa_free_all_edge_args (void) +ipa_free_all_node_params (void) { - struct cgraph_node *node; - struct cgraph_edge *cs; + int i; + struct ipa_node_params *info; - for (node = cgraph_nodes; node; node = node->next) - for (cs = node->callees; cs; cs = cs->next_callee) - if (cs->aux) - { - if (IPA_EDGE_REF (cs)->jump_functions) - free (IPA_EDGE_REF (cs)->jump_functions); - free (cs->aux); - cs->aux = NULL; - } + for (i = 0; + VEC_iterate (ipa_node_params_t, ipa_node_params_vector, i, info); + i++) + ipa_free_node_params_substructures (info); + + VEC_free (ipa_node_params_t, heap, ipa_node_params_vector); + ipa_node_params_vector = NULL; +} + +/* Hook that is called by cgraph.c when an edge is removed. */ +static void +ipa_edge_removal_hook (struct cgraph_edge *cs, + void *data __attribute__ ((unused))) +{ + ipa_free_edge_args_substructures (IPA_EDGE_REF (cs)); } -/* Free ipa data structures of ipa_node_params and ipa_edge_args. */ +/* Hook that is called by cgraph.c when a node is removed. */ +static void +ipa_node_removal_hook (struct cgraph_node *node, + void *data __attribute__ ((unused))) +{ + ipa_free_node_params_substructures (IPA_NODE_REF (node)); +} + +/* Helper function to duplicate an array of size N that is at SRC and store a + pointer to it to DST. Nothing is done if SRC is NULL. */ +static void * +duplicate_array (void *src, size_t n) +{ + void *p; + + if (!src) + return NULL; + + p = xcalloc (1, n); + memcpy (p, src, n); + return p; +} + +/* Hook that is called by cgraph.c when a node is duplicated. */ +static void +ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst, + void *data) +{ + struct ipa_edge_args *old_args, *new_args; + int arg_count; + + ipa_check_create_edge_args (); + + old_args = IPA_EDGE_REF (src); + new_args = IPA_EDGE_REF (dst); + + arg_count = ipa_get_cs_argument_count (old_args); + ipa_set_cs_argument_count (new_args, arg_count); + new_args->jump_functions = (struct ipa_jump_func *) + duplicate_array (old_args->jump_functions, + sizeof (struct ipa_jump_func) * arg_count); + data = data; /* Suppressing compiler warning. */ +} + +/* Hook that is called by cgraph.c when a node is duplicated. */ +static void +ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst, + void *data) +{ + struct ipa_node_params *old_info, *new_info; + int param_count; + + ipa_check_create_node_params (); + old_info = IPA_NODE_REF (src); + new_info = IPA_NODE_REF (dst); + param_count = ipa_get_param_count (old_info); + + ipa_set_param_count (new_info, param_count); + new_info->ipcp_lattices = (struct ipcp_lattice *) + duplicate_array (old_info->ipcp_lattices, + sizeof (struct ipcp_lattice) * param_count); + new_info->param_decls = (tree *) + duplicate_array (old_info->param_decls, sizeof (tree) * param_count); + new_info->modified_flags = (bool *) + duplicate_array (old_info->modified_flags, sizeof (bool) * param_count); + + new_info->ipcp_orig_node = old_info->ipcp_orig_node; + new_info->count_scale = old_info->count_scale; + + data = data; /* Suppressing compiler warning. */ +} + +/* Register our cgraph hooks if they are not already there. */ void -ipa_free_all_node_params (void) +ipa_register_cgraph_hooks (void) { - struct cgraph_node *node; + if (!edge_removal_hook_holder) + edge_removal_hook_holder = + cgraph_add_edge_removal_hook (&ipa_edge_removal_hook, NULL); + if (!node_removal_hook_holder) + node_removal_hook_holder = + cgraph_add_node_removal_hook (&ipa_node_removal_hook, NULL); + if (!edge_duplication_hook_holder) + edge_duplication_hook_holder = + cgraph_add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL); + if (!node_duplication_hook_holder) + node_duplication_hook_holder = + cgraph_add_node_duplication_hook (&ipa_node_duplication_hook, NULL); +} - for (node = cgraph_nodes; node; node = node->next) - { - if (node->aux == NULL) - continue; - if (IPA_NODE_REF (node)->ipcp_lattices) - free (IPA_NODE_REF (node)->ipcp_lattices); - if (IPA_NODE_REF (node)->param_decls) - free (IPA_NODE_REF (node)->param_decls); - if (IPA_NODE_REF (node)->modified_flags) - free (IPA_NODE_REF (node)->modified_flags); - free (node->aux); - node->aux = NULL; - } +/* Unregister our cgraph hooks if they are not already there. */ +static void +ipa_unregister_cgraph_hooks (void) +{ + cgraph_remove_edge_removal_hook (edge_removal_hook_holder); + edge_removal_hook_holder = NULL; + cgraph_remove_node_removal_hook (node_removal_hook_holder); + node_removal_hook_holder = NULL; + cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder); + edge_duplication_hook_holder = NULL; + cgraph_remove_node_duplication_hook (node_duplication_hook_holder); + node_duplication_hook_holder = NULL; +} + +/* Free all ipa_node_params and all ipa_edge_args structures if they are no + longer needed after ipa-cp. */ +void +free_all_ipa_structures_after_ipa_cp (void) +{ + ipa_free_all_edge_args (); + ipa_free_all_node_params (); + ipa_unregister_cgraph_hooks (); } /* Print ipa_tree_map data structures of all functions in the diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h index a81418d..e442698 100644 --- a/gcc/ipa-prop.h +++ b/gcc/ipa-prop.h @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see #define IPA_PROP_H #include "tree.h" +#include "vec.h" /* The following definitions and interfaces are used by interprocedural analyses. */ @@ -100,14 +101,6 @@ struct ipa_replace_map bool ref_p; }; -/* Return the field in cgraph_node/cgraph_edge struct that points - to ipa_node_params/ipa_edge_args struct. */ -#define IPA_NODE_REF(MT) ((struct ipa_node_params *)(MT)->aux) -#define IPA_EDGE_REF(EDGE) ((struct ipa_edge_args *)(EDGE)->aux) -/* This macro checks validity of index returned by - ipa_get_param_decl_index function. */ -#define IS_VALID_JUMP_FUNC_INDEX(I) ((I) != -1) - /* ipa_node_params stores information related to formal parameters of functions and some other information for interprocedural passes that operate on parameters (such as ipa-cp). */ @@ -229,6 +222,71 @@ ipa_get_ith_jump_func (struct ipa_edge_args *args, int i) return &args->jump_functions[i]; } +/* Vectors need to have typedefs of structures. */ +typedef struct ipa_node_params ipa_node_params_t; +typedef struct ipa_edge_args ipa_edge_args_t; + +/* Types of vectors hodling the infos. */ +DEF_VEC_O (ipa_node_params_t); +DEF_VEC_ALLOC_O (ipa_node_params_t, heap); +DEF_VEC_O (ipa_edge_args_t); +DEF_VEC_ALLOC_O (ipa_edge_args_t, heap); + +/* Vector where the parameter infos are actually stored. */ +extern VEC (ipa_node_params_t, heap) *ipa_node_params_vector; +/* Vector where the parameter infos are actually stored. */ +extern VEC (ipa_edge_args_t, heap) *ipa_edge_args_vector; + +/* Return the associated parameter/argument info corresponding to the given + node/edge. */ +#define IPA_NODE_REF(NODE) (VEC_index (ipa_node_params_t, \ + ipa_node_params_vector, (NODE)->uid)) +#define IPA_EDGE_REF(EDGE) (VEC_index (ipa_edge_args_t, \ + ipa_edge_args_vector, (EDGE)->uid)) +/* This macro checks validity of index returned by + ipa_get_param_decl_index function. */ +#define IS_VALID_JUMP_FUNC_INDEX(I) ((I) != -1) + +/* Creating and freeing ipa_node_params and ipa_edge_args. */ +void ipa_create_all_node_params (void); +void ipa_create_all_edge_args (void); +void ipa_free_edge_args_substructures (struct ipa_edge_args *); +void ipa_free_node_params_substructures (struct ipa_node_params *); +void ipa_free_all_node_params (void); +void ipa_free_all_edge_args (void); +void free_all_ipa_structures_after_ipa_cp (void); +void ipa_register_cgraph_hooks (void); + +/* This function ensures the array of node param infos is big enough to + accomdate a structure for all nodes and realloacates it if not. */ +static inline void +ipa_check_create_node_params (void) +{ + if (!ipa_node_params_vector) + ipa_node_params_vector = VEC_alloc (ipa_node_params_t, heap, + cgraph_max_uid); + + if (VEC_length (ipa_node_params_t, ipa_node_params_vector) + <= (unsigned) cgraph_max_uid) + VEC_safe_grow_cleared (ipa_node_params_t, heap, + ipa_node_params_vector, cgraph_max_uid + 1); +} + +/* This function ensures the array of adge arguments infos is big enough to + accomdate a structure for all edges and realloacates it if not. */ +static inline void +ipa_check_create_edge_args (void) +{ + if (!ipa_edge_args_vector) + ipa_edge_args_vector = VEC_alloc (ipa_edge_args_t, heap, + cgraph_edge_max_uid); + + if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector) + <= (unsigned) cgraph_edge_max_uid) + VEC_safe_grow_cleared (ipa_edge_args_t, heap, ipa_edge_args_vector, + cgraph_edge_max_uid + 1); +} + /* A function list element. It is used to create a temporary worklist used in the propagation stage of IPCP. (can be used for more IPA optimizations) */ struct ipa_func_list @@ -251,13 +309,6 @@ void ipa_count_formal_params (struct cgraph_node *); void ipa_create_param_decls_array (struct cgraph_node *); void ipa_detect_param_modifications (struct cgraph_node *); -/* Creating and freeing ipa_node_params and ipa_edge_args. */ -void ipa_create_node_params (struct cgraph_node *); -void ipa_free_all_node_params (void); -void ipa_create_all_node_params (void); -void ipa_create_all_edge_args (void); -void ipa_free_all_edge_args (void); - /* Debugging interface. */ void ipa_print_all_tree_maps (FILE *); void ipa_print_all_params_modified (FILE *); |