aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.2.1-5666.3/gcc/ipa-prop.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.2.1-5666.3/gcc/ipa-prop.h')
-rw-r--r--gcc-4.2.1-5666.3/gcc/ipa-prop.h204
1 files changed, 204 insertions, 0 deletions
diff --git a/gcc-4.2.1-5666.3/gcc/ipa-prop.h b/gcc-4.2.1-5666.3/gcc/ipa-prop.h
new file mode 100644
index 000000000..b5c5f2dea
--- /dev/null
+++ b/gcc-4.2.1-5666.3/gcc/ipa-prop.h
@@ -0,0 +1,204 @@
+/* Interprocedural analyses.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING. If not, write to the Free
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
+
+#ifndef IPA_PROP_H
+#define IPA_PROP_H
+
+#include "tree.h"
+
+/* The following definitions and interfaces are used by
+ interprocedural analyses. */
+
+/* A jump function for a callsite represents the values passed as actual
+ arguments of the callsite. There are three main types of values :
+ Formal - the caller's formal parameter is passed as an actual argument.
+ Constant - a constant is passed as a an actual argument.
+ Unknown - neither of the above.
+ Integer and real constants are represented as CONST_IPATYPE and Fortran
+ constants are represented as CONST_IPATYPE_REF. */
+enum jump_func_type
+{
+ UNKNOWN_IPATYPE,
+ CONST_IPATYPE,
+ CONST_IPATYPE_REF,
+ FORMAL_IPATYPE
+};
+
+/* All formal parameters in the program have a cval computed by
+ the interprocedural stage of IPCP.
+ There are three main values of cval :
+ TOP - unknown.
+ BOTTOM - non constant.
+ CONSTANT_TYPE - constant value.
+ 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 CONST_IPATYPE and Fortran
+ constants are represented as CONST_IPATYPE_REF. */
+enum cvalue_type
+{
+ BOTTOM,
+ CONST_VALUE,
+ CONST_VALUE_REF,
+ TOP
+};
+
+/* Represents the value of either jump function or cval.
+ value represents a constant.
+ formal_id is used only in jump function context and represents
+ pass-through parameter (the formal of caller is passed
+ as argument). */
+union parameter_info
+{
+ unsigned int formal_id;
+ tree value;
+};
+
+/* A jump function for a callsite represents the values passed as actual
+ arguments of the callsite. See enum jump_func_type for the various
+ types of jump functions supported. */
+struct ipa_jump_func
+{
+ enum jump_func_type type;
+ union parameter_info info_type;
+};
+
+/* All formal parameters in the program have a cval computed by
+ the interprocedural stage of IPCP. See enum cvalue_type for
+ the various types of cvals supported */
+struct ipcp_formal
+{
+ enum cvalue_type cval_type;
+ union parameter_info cvalue;
+};
+
+/* Represent which DECL tree (or reference to such tree)
+ will be replaced by another tree while versioning. */
+struct ipa_replace_map
+{
+ /* The tree that will be replaced. */
+ tree old_tree;
+ /* The new (replacing) tree. */
+ tree new_tree;
+ /* True when a substitution should be done, false otherwise. */
+ bool replace_p;
+ /* True when we replace a reference to old_tree. */
+ bool ref_p;
+};
+
+/* Return the field in cgraph_node/cgraph_edge struct that points
+ to ipa_node/ipa_edge struct. */
+#define IPA_NODE_REF(MT) ((struct ipa_node *)(MT)->aux)
+#define IPA_EDGE_REF(EDGE) ((struct ipa_edge *)(EDGE)->aux)
+
+/* ipa_node stores information related to a method and
+ its formal parameters. It is pointed to by a field in the
+ method's corresponding cgraph_node.
+
+ ipa_edge stores information related to a callsite and
+ its arguments. It is pointed to by a field in the
+ callsite's corresponding cgraph_edge. */
+struct ipa_node
+{
+ /* Number of formal parameters of this method. When set to 0,
+ this method's parameters would not be analyzed by the different
+ stages of IPA CP. */
+ int ipa_arg_num;
+ /* Array of cvals. */
+ struct ipcp_formal *ipcp_cval;
+ /* Mapping each parameter to its PARM_DECL tree. */
+ tree *ipa_param_tree;
+ /* Indicating which parameter is modified in its method. */
+ bool *ipa_mod;
+ /* Only for versioned nodes this field would not be NULL,
+ it points to the node that IPA cp cloned from. */
+ struct cgraph_node *ipcp_orig_node;
+ /* Meaningful only for original methods. Expresses the
+ ratio between the direct calls and sum of all invocations of
+ this function (given by profiling info). It is used to calculate
+ the profiling information of the original function and the versioned
+ one. */
+ gcov_type count_scale;
+};
+
+struct ipa_edge
+{
+ /* Number of actual arguments in this callsite. When set to 0,
+ this callsite's parameters would not be analyzed by the different
+ stages of IPA CP. */
+ int ipa_param_num;
+ /* Array of the callsite's jump function of each parameter. */
+ struct ipa_jump_func *ipa_param_map;
+};
+
+/* A methodlist element (referred to also as methodlist node). It is used
+ to create a temporary worklist used in
+ the propagation stage of IPCP. (can be used for more IPA
+ optimizations) */
+struct ipa_methodlist
+{
+ struct cgraph_node *method_p;
+ struct ipa_methodlist *next_method;
+};
+
+/* A pointer to a methodlist element. */
+typedef struct ipa_methodlist *ipa_methodlist_p;
+
+/* ipa_methodlist interface. */
+ipa_methodlist_p ipa_methodlist_init (void);
+bool ipa_methodlist_not_empty (ipa_methodlist_p);
+void ipa_add_method (ipa_methodlist_p *, struct cgraph_node *);
+struct cgraph_node *ipa_remove_method (ipa_methodlist_p *);
+
+/* ipa_callsite interface. */
+int ipa_callsite_param_count (struct cgraph_edge *);
+void ipa_callsite_param_count_set (struct cgraph_edge *, int);
+struct ipa_jump_func *ipa_callsite_param (struct cgraph_edge *, int);
+struct cgraph_node *ipa_callsite_callee (struct cgraph_edge *);
+void ipa_callsite_compute_param (struct cgraph_edge *);
+void ipa_callsite_compute_count (struct cgraph_edge *);
+
+/* ipa_method interface. */
+int ipa_method_formal_count (struct cgraph_node *);
+void ipa_method_formal_count_set (struct cgraph_node *, int);
+tree ipa_method_get_tree (struct cgraph_node *, int);
+void ipa_method_compute_tree_map (struct cgraph_node *);
+void ipa_method_formal_compute_count (struct cgraph_node *);
+void ipa_method_compute_modify (struct cgraph_node *);
+
+/* jump function interface. */
+enum jump_func_type get_type (struct ipa_jump_func *);
+union parameter_info *ipa_jf_get_info_type (struct ipa_jump_func *);
+
+/* ipa_node and ipa_edge interfaces. */
+void ipa_node_create (struct cgraph_node *);
+void ipa_free (void);
+void ipa_nodes_create (void);
+void ipa_edges_create (void);
+void ipa_edges_free (void);
+void ipa_nodes_free (void);
+
+
+/* Debugging interface. */
+void ipa_method_tree_print (FILE *);
+void ipa_method_modify_print (FILE *);
+
+unsigned int ipcp_driver (void);
+
+#endif /* IPA_PROP_H */