/* 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.
#include "tree.h"
#include "vec.h"
#include "cgraph.h"
+#include "gimple.h"
/* The following definitions and interfaces are used by
interprocedural analyses or parameters. */
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,
struct ipcp_lattice ipcp_lattice;
/* PARAM_DECL of this parameter. */
tree decl;
+ /* 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
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. */
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
-/* 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,
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 *);
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. */
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 */