Mercurial > hg > CbC > CbC_gcc
diff gcc/ipa-prop.h @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/ipa-prop.h Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/ipa-prop.h Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Interprocedural analyses. - Copyright (C) 2005-2017 Free Software Foundation, Inc. + Copyright (C) 2005-2018 Free Software Foundation, Inc. This file is part of GCC. @@ -160,7 +160,7 @@ { /* The data fields below are valid only if known is true. */ bool known; - enum value_range_type type; + enum value_range_kind type; wide_int min; wide_int max; }; @@ -464,7 +464,8 @@ static inline tree ipa_get_type (struct ipa_node_params *info, int i) { - gcc_checking_assert (info->descriptors); + if (vec_safe_length (info->descriptors) <= (unsigned) i) + return NULL; tree t = (*info->descriptors)[i].decl_or_type; if (!t) return NULL; @@ -543,7 +544,7 @@ /* Structure holding information for the transformation phase of IPA-CP. */ -struct GTY(()) ipcp_transformation_summary +struct GTY(()) ipcp_transformation { /* Linked list of known aggregate values. */ ipa_agg_replacement_value *agg_values; @@ -555,7 +556,7 @@ void ipa_set_node_agg_value_chain (struct cgraph_node *node, struct ipa_agg_replacement_value *aggvals); -void ipcp_grow_transformations_if_necessary (void); +void ipcp_transformation_initialize (void); /* ipa_edge_args stores information related to a callsite and particularly its arguments. It can be accessed by the IPA_EDGE_REF macro. */ @@ -648,13 +649,32 @@ /* Call summary to store information about edges such as jump functions. */ extern GTY(()) ipa_edge_args_sum_t *ipa_edge_args_sum; -/* Vector of IPA-CP transformation data for each clone. */ -extern GTY(()) vec<ipcp_transformation_summary, va_gc> *ipcp_transformations; +/* Function summary for IPA-CP transformation. */ +class ipcp_transformation_t +: public function_summary<ipcp_transformation *> +{ +public: + ipcp_transformation_t (symbol_table *table, bool ggc): + function_summary<ipcp_transformation *> (table, ggc) {} + + ~ipcp_transformation_t () {} + + static ipcp_transformation_t *create_ggc (symbol_table *symtab) + { + ipcp_transformation_t *summary + = new (ggc_cleared_alloc <ipcp_transformation_t> ()) + ipcp_transformation_t (symtab, true); + return summary; + } +}; + +/* Function summary where the IPA CP transformations are actually stored. */ +extern GTY(()) function_summary <ipcp_transformation *> *ipcp_transformation_sum; /* Return the associated parameter/argument info corresponding to the given node/edge. */ -#define IPA_NODE_REF(NODE) (ipa_node_params_sum->get (NODE)) -#define IPA_EDGE_REF(EDGE) (ipa_edge_args_sum->get (EDGE)) +#define IPA_NODE_REF(NODE) (ipa_node_params_sum->get_create (NODE)) +#define IPA_EDGE_REF(EDGE) (ipa_edge_args_sum->get_create (EDGE)) /* This macro checks validity of index returned by ipa_get_param_decl_index function. */ #define IS_VALID_JUMP_FUNC_INDEX(I) ((I) != -1) @@ -663,7 +683,6 @@ void ipa_create_all_node_params (void); void ipa_create_all_edge_args (void); void ipa_check_create_edge_args (void); -void ipa_free_edge_args_substructures (struct ipa_edge_args *); void ipa_free_all_node_params (void); void ipa_free_all_edge_args (void); void ipa_free_all_structures_after_ipa_cp (void); @@ -694,12 +713,13 @@ return ipa_edge_args_sum->exists (edge); } -static inline ipcp_transformation_summary * +static inline ipcp_transformation * ipcp_get_transformation_summary (cgraph_node *node) { - if ((unsigned) node->uid >= vec_safe_length (ipcp_transformations)) + if (ipcp_transformation_sum == NULL) return NULL; - return &(*ipcp_transformations)[node->uid]; + + return ipcp_transformation_sum->get (node); } /* Return the aggregate replacements for NODE, if there are any. */ @@ -707,7 +727,7 @@ static inline struct ipa_agg_replacement_value * ipa_get_agg_replacements_for_node (cgraph_node *node) { - ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node); + ipcp_transformation *ts = ipcp_get_transformation_summary (node); return ts ? ts->agg_values : NULL; } @@ -765,96 +785,6 @@ extern object_allocator<ipcp_agg_lattice> ipcp_agg_lattice_pool; -/* Operation to be performed for the parameter in ipa_parm_adjustment - below. */ -enum ipa_parm_op { - IPA_PARM_OP_NONE, - - /* This describes a brand new parameter. - - The field `type' should be set to the new type, `arg_prefix' - should be set to the string prefix for the new DECL_NAME, and - `new_decl' will ultimately hold the newly created argument. */ - IPA_PARM_OP_NEW, - - /* This new parameter is an unmodified parameter at index base_index. */ - IPA_PARM_OP_COPY, - - /* This adjustment describes a parameter that is about to be removed - completely. Most users will probably need to book keep those so that they - don't leave behinfd any non default def ssa names belonging to them. */ - IPA_PARM_OP_REMOVE -}; - -/* Structure to describe transformations of formal parameters and actual - arguments. Each instance describes one new parameter and they are meant to - be stored in a vector. Additionally, most users will probably want to store - adjustments about parameters that are being removed altogether so that SSA - names belonging to them can be replaced by SSA names of an artificial - variable. */ -struct ipa_parm_adjustment -{ - /* The original PARM_DECL itself, helpful for processing of the body of the - function itself. Intended for traversing function bodies. - ipa_modify_formal_parameters, ipa_modify_call_arguments and - ipa_combine_adjustments ignore this and use base_index. - ipa_modify_formal_parameters actually sets this. */ - tree base; - - /* Type of the new parameter. However, if by_ref is true, the real type will - be a pointer to this type. */ - tree type; - - /* Alias refrerence type to be used in MEM_REFs when adjusting caller - arguments. */ - tree alias_ptr_type; - - /* The new declaration when creating/replacing a parameter. Created - by ipa_modify_formal_parameters, useful for functions modifying - the body accordingly. For brand new arguments, this is the newly - created argument. */ - tree new_decl; - - /* New declaration of a substitute variable that we may use to replace all - non-default-def ssa names when a parm decl is going away. */ - tree new_ssa_base; - - /* If non-NULL and the original parameter is to be removed (copy_param below - is NULL), this is going to be its nonlocalized vars value. */ - tree nonlocal_value; - - /* This holds the prefix to be used for the new DECL_NAME. */ - const char *arg_prefix; - - /* Offset into the original parameter (for the cases when the new parameter - is a component of an original one). */ - HOST_WIDE_INT offset; - - /* Zero based index of the original parameter this one is based on. */ - int base_index; - - /* Whether this parameter is a new parameter, a copy of an old one, - or one about to be removed. */ - enum ipa_parm_op op; - - /* Storage order of the original parameter (for the cases when the new - parameter is a component of an original one). */ - unsigned reverse : 1; - - /* The parameter is to be passed by reference. */ - unsigned by_ref : 1; -}; - -typedef vec<ipa_parm_adjustment> ipa_parm_adjustment_vec; - -vec<tree> ipa_get_vector_of_formal_parms (tree fndecl); -vec<tree> ipa_get_vector_of_formal_parm_types (tree fntype); -void ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec); -void ipa_modify_call_arguments (struct cgraph_edge *, gcall *, - ipa_parm_adjustment_vec); -ipa_parm_adjustment_vec ipa_combine_adjustments (ipa_parm_adjustment_vec, - ipa_parm_adjustment_vec); -void ipa_dump_param_adjustments (FILE *, ipa_parm_adjustment_vec, tree); void ipa_dump_agg_replacement_values (FILE *f, struct ipa_agg_replacement_value *av); void ipa_prop_write_jump_functions (void); @@ -863,22 +793,18 @@ void ipcp_read_transformation_summaries (void); int ipa_get_param_decl_index (struct ipa_node_params *, tree); tree ipa_value_from_jfunc (struct ipa_node_params *info, - struct ipa_jump_func *jfunc); + struct ipa_jump_func *jfunc, tree type); unsigned int ipcp_transform_function (struct cgraph_node *node); ipa_polymorphic_call_context ipa_context_from_jfunc (ipa_node_params *, cgraph_edge *, int, ipa_jump_func *); void ipa_dump_param (FILE *, struct ipa_node_params *info, int i); -bool ipa_modify_expr (tree *, bool, ipa_parm_adjustment_vec); -ipa_parm_adjustment *ipa_get_adjustment_candidate (tree **, bool *, - ipa_parm_adjustment_vec, - bool); void ipa_release_body_info (struct ipa_func_body_info *); tree ipa_get_callee_param_type (struct cgraph_edge *e, int i); /* From tree-sra.c: */ -tree build_ref_for_offset (location_t, tree, HOST_WIDE_INT, bool, tree, +tree build_ref_for_offset (location_t, tree, poly_int64, bool, tree, gimple_stmt_iterator *, bool); /* In ipa-cp.c */