Mercurial > hg > CbC > CbC_gcc
diff gcc/ipa-prop.h @ 67:f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Mar 2011 17:18:12 +0900 |
parents | b7f97abdc517 |
children | 04ced10e8804 |
line wrap: on
line diff
--- a/gcc/ipa-prop.h Tue May 25 18:58:51 2010 +0900 +++ b/gcc/ipa-prop.h Tue Mar 22 17:18:12 2011 +0900 @@ -1,5 +1,5 @@ /* Interprocedural analyses. - Copyright (C) 2005, 2007, 2008, 2009 + Copyright (C) 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -24,6 +24,7 @@ #include "tree.h" #include "vec.h" #include "cgraph.h" +#include "gimple.h" /* The following definitions and interfaces are used by interprocedural analyses or parameters. */ @@ -133,11 +134,12 @@ computed by the interprocedural stage of IPCP. There are three main values of the lattice: IPA_TOP - unknown, - IPA_BOTTOM - non constant, + IPA_BOTTOM - variable, IPA_CONST_VALUE - simple scalar constant, - Cval of formal f will have a constant value if all callsites to this - function have the same constant value passed to f. - Integer and real constants are represented as IPA_CONST_VALUE. */ + + We also use this type to propagate types accross the call graph for the + purpose of devirtualization. In that case, IPA_CONST_VALUE denotes a known + type, rather than a constant. */ enum ipa_lattice_type { IPA_BOTTOM, @@ -161,10 +163,14 @@ struct ipcp_lattice ipcp_lattice; /* PARAM_DECL of this parameter. */ tree decl; - /* Whether the value parameter has been modified within the function. */ - unsigned modified : 1; + /* Vector of BINFOs of types that this argument might encounter. NULL + basically means a top value, bottom is marked by the cannot_devirtualize + flag below.*/ + VEC (tree, heap) *types; /* The parameter is used. */ unsigned used : 1; + /* Set when parameter type cannot be used for devirtualization. */ + unsigned cannot_devirtualize : 1; }; /* ipa_node_params stores information related to formal parameters of functions @@ -172,15 +178,12 @@ parameters (such as ipa-cp). */ struct ipa_node_params { - /* Number of formal parameters of this function. When set to 0, - this function's parameters would not be analyzed by the different - stages of IPA CP. */ + /* Number of formal parameters of this function. When set to 0, this + function's parameters would not be analyzed by IPA CP. */ int param_count; /* Whether this function is called with variable number of actual arguments. */ unsigned called_with_var_arguments : 1; - /* Whether the modification analysis has already been performed. */ - unsigned modification_analysis_done : 1; /* Whether the param uses analysis has already been performed. */ unsigned uses_analysis_done : 1; /* Whether the function is enqueued in an ipa_func_list. */ @@ -228,17 +231,6 @@ return info->params[i].decl; } -/* Return the modification flag corresponding to the Ith formal parameter of - the function associated with INFO. Note that there is no setter method as - the goal is to set all flags when building the array in - ipa_detect_param_modifications. */ - -static inline bool -ipa_is_param_modified (struct ipa_node_params *info, int i) -{ - return info->params[i].modified; -} - /* Return the used flag corresponding to the Ith formal parameter of the function associated with INFO. */ @@ -248,6 +240,25 @@ return info->params[i].used; } +/* Return the cannot_devirtualize flag corresponding to the Ith formal + parameter of the function associated with INFO. The corresponding function + to set the flag is ipa_set_param_cannot_devirtualize. */ + +static inline bool +ipa_param_cannot_devirtualize_p (struct ipa_node_params *info, int i) +{ + return info->params[i].cannot_devirtualize; +} + +/* Return true iff the vector of possible types of the Ith formal parameter of + the function associated with INFO is empty. */ + +static inline bool +ipa_param_types_vec_empty (struct ipa_node_params *info, int i) +{ + return info->params[i].types == NULL; +} + /* Flag this node as having callers with variable number of arguments. */ static inline void @@ -266,9 +277,8 @@ -/* ipa_edge_args stores information related to a callsite and particularly - its arguments. It is pointed to by a field in the - callsite's corresponding cgraph_edge. */ +/* ipa_edge_args stores information related to a callsite and particularly its + arguments. It can be accessed by the IPA_EDGE_REF macro. */ typedef struct GTY(()) ipa_edge_args { /* Number of actual arguments in this callsite. When set to 0, @@ -412,17 +422,18 @@ ipa_push_func_to_list_1 (wl, node, info); } -/* Callsite related calculations. */ -void ipa_compute_jump_functions (struct cgraph_node *); -void ipa_count_arguments (struct cgraph_edge *); +void ipa_analyze_node (struct cgraph_node *); /* Function formal parameters related computations. */ void ipa_initialize_node_params (struct cgraph_node *node); -void ipa_detect_param_modifications (struct cgraph_node *); -void ipa_analyze_params_uses (struct cgraph_node *); bool ipa_propagate_indirect_call_infos (struct cgraph_edge *cs, VEC (cgraph_edge_p, heap) **new_edges); +/* Indirect edge and binfo processing. */ +struct cgraph_edge *ipa_make_edge_direct_to_target (struct cgraph_edge *, tree, + tree); + + /* Debugging interface. */ void ipa_print_node_params (FILE *, struct cgraph_node *node); void ipa_print_all_params (FILE *); @@ -448,6 +459,10 @@ 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. */ @@ -502,6 +517,7 @@ void ipa_update_after_lto_read (void); /* From tree-sra.c: */ -bool build_ref_for_offset (tree *, tree, HOST_WIDE_INT, tree, bool); +tree build_ref_for_offset (location_t, tree, HOST_WIDE_INT, tree, + gimple_stmt_iterator *, bool); #endif /* IPA_PROP_H */