aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-prop.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ipa-prop.h')
-rw-r--r--gcc/ipa-prop.h48
1 files changed, 46 insertions, 2 deletions
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 1fdd833..da6200f 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -144,6 +144,7 @@ typedef struct GTY(()) ipa_agg_jf_item
DEF_VEC_O (ipa_agg_jf_item_t);
DEF_VEC_ALLOC_O (ipa_agg_jf_item_t, gc);
+DEF_VEC_ALLOC_O (ipa_agg_jf_item_t, heap);
/* Aggregate jump function - i.e. description of contents of aggregates passed
either by reference or value. */
@@ -159,6 +160,9 @@ struct GTY(()) ipa_agg_jump_function
typedef struct ipa_agg_jump_function *ipa_agg_jump_function_p;
DEF_VEC_P (ipa_agg_jump_function_p);
DEF_VEC_ALLOC_P (ipa_agg_jump_function_p, heap);
+typedef struct ipa_agg_jump_function ipa_agg_jump_function_t;
+DEF_VEC_P (ipa_agg_jump_function_t);
+DEF_VEC_ALLOC_P (ipa_agg_jump_function_t, heap);
/* A jump function for a callsite represents the values passed as actual
arguments of the callsite. See enum jump_func_type for the various
@@ -322,7 +326,7 @@ struct ipa_node_params
VEC (ipa_param_descriptor_t, heap) *descriptors;
/* Pointer to an array of structures describing individual formal
parameters. */
- struct ipcp_lattice *lattices;
+ struct ipcp_param_lattices *lattices;
/* 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;
@@ -380,6 +384,27 @@ ipa_is_param_used (struct ipa_node_params *info, int i)
return VEC_index (ipa_param_descriptor_t, info->descriptors, i).used;
}
+/* Information about replacements done in aggregates for a given node (each
+ node has its linked list). */
+struct GTY(()) ipa_agg_replacement_value
+{
+ /* Next item in the linked list. */
+ struct ipa_agg_replacement_value *next;
+ /* Offset within the aggregate. */
+ HOST_WIDE_INT offset;
+ /* The constant value. */
+ tree value;
+ /* The paramter index. */
+ int index;
+};
+
+typedef struct ipa_agg_replacement_value *ipa_agg_replacement_value_p;
+DEF_VEC_P (ipa_agg_replacement_value_p);
+DEF_VEC_ALLOC_P (ipa_agg_replacement_value_p, gc);
+
+void ipa_set_node_agg_value_chain (struct cgraph_node *node,
+ struct ipa_agg_replacement_value *aggvals);
+
/* 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
@@ -420,6 +445,8 @@ DEF_VEC_ALLOC_O (ipa_edge_args_t, gc);
/* Vector where the parameter infos are actually stored. */
extern VEC (ipa_node_params_t, heap) *ipa_node_params_vector;
+/* Vector of known aggregate values in cloned nodes. */
+extern GTY(()) VEC (ipa_agg_replacement_value_p, gc) *ipa_node_agg_replacements;
/* Vector where the parameter infos are actually stored. */
extern GTY(()) VEC (ipa_edge_args_t, gc) *ipa_edge_args_vector;
@@ -487,6 +514,18 @@ ipa_edge_args_info_available_for_edge_p (struct cgraph_edge *edge)
ipa_edge_args_vector));
}
+/* Return the aggregate replacements for NODE, if there are any. */
+
+static inline struct ipa_agg_replacement_value *
+ipa_get_agg_replacements_for_node (struct cgraph_node *node)
+{
+ if ((unsigned) node->uid >= VEC_length (ipa_agg_replacement_value_p,
+ ipa_node_agg_replacements))
+ return NULL;
+ return VEC_index (ipa_agg_replacement_value_p, ipa_node_agg_replacements,
+ node->uid);
+}
+
/* Function formal parameters related computations. */
void ipa_initialize_node_params (struct cgraph_node *node);
bool ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
@@ -517,6 +556,7 @@ void ipcp_verify_propagated_values (void);
extern alloc_pool ipcp_values_pool;
extern alloc_pool ipcp_sources_pool;
+extern alloc_pool ipcp_agg_lattice_pool;
/* Structure to describe transformations of formal parameters and actual
arguments. Each instance describes one new parameter and they are meant to
@@ -589,13 +629,17 @@ void ipa_modify_call_arguments (struct cgraph_edge *, gimple,
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);
void ipa_prop_read_jump_functions (void);
+void ipa_prop_write_all_agg_replacement (void);
+void ipa_prop_read_all_agg_replacement (void);
void ipa_update_after_lto_read (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);
+unsigned int ipcp_transform_function (struct cgraph_node *node);
/* From tree-sra.c: */