aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-prop.h
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2014-12-04 15:37:01 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2014-12-04 15:37:01 +0100
commit04be694e4d9132523f01de8d9873c6b07164afb2 (patch)
treeeaa3f2883edec074e9afd98dc3aa04cb23c6a0aa /gcc/ipa-prop.h
parentde665bbd932894baef6fa51a9989ab089602434f (diff)
downloadgcc-04be694e4d9132523f01de8d9873c6b07164afb2.zip
gcc-04be694e4d9132523f01de8d9873c6b07164afb2.tar.gz
gcc-04be694e4d9132523f01de8d9873c6b07164afb2.tar.bz2
ipa-prop.h (ipa_alignment): New type.
2014-12-04 Martin Jambor <mjambor@suse.cz> * ipa-prop.h (ipa_alignment): New type. (ipa_jump_func): New field alignment. (ipcp_transformation_summary) New type. (ipcp_grow_transformations_if_necessary): Declare. (ipa_node_agg_replacements): Removed. (ipcp_transformations): Declare. (ipcp_get_transformation_summary): New function. (ipa_get_agg_replacements_for_node): Use it. * ipa-cp.c (ipcp_param_lattices): New field alignment. (print_all_lattices): Also print alignment. (alignment_bottom_p): New function. (set_alignment_to_bottom): Likewise. (set_all_contains_variable): Also set alignment to bottom. (initialize_node_lattices): Likewise. (propagate_alignment_accross_jump_function): New function. (propagate_constants_accross_call): Call it. (ipcp_store_alignment_results): New function. (ipcp_driver): Call it. * ipa-prop.c (ipa_node_agg_replacements): Removed. (ipcp_transformations): New. (ipa_print_node_jump_functions_for_edge): Also print alignment. (ipa_set_jf_unknown): New function. (detect_type_change_from_memory_writes): Use ipa_set_jf_unknown. (ipa_compute_jump_functions_for_edge): Also calculate alignment. (update_jump_functions_after_inlining): Use ipa_set_jf_unknown. (ipcp_grow_transformations_if_necessary): New function. (ipa_set_node_agg_value_chain): Use ipcp_transformations. (ipa_node_removal_hook): Likewise. (ipa_node_duplication_hook): Also duplicate alignment results. (ipa_write_jump_function): Also stream alignments. (ipa_read_jump_function): Use ipa_set_jf_unknown, also stream alignments. (write_agg_replacement_chain): Renamed to write_ipcp_transformation_info, also stream alignments. (read_agg_replacement_chain): Renamed to read_ipcp_transformation_info, also stream alignments. (ipa_prop_write_all_agg_replacement): Renamed to ipcp_write_transformation_summaries. Stream always. (ipa_prop_read_all_agg_replacement): Renamed to ipcp_read_transformation_summaries. (ipcp_update_alignments): New function. (ipcp_transform_function): Call it, free also alignments. testsuite/ * gcc.dg/ipa/propalign-1.c: New test. * gcc.dg/ipa/propalign-2.c: Likewise. From-SVN: r218369
Diffstat (limited to 'gcc/ipa-prop.h')
-rw-r--r--gcc/ipa-prop.h48
1 files changed, 39 insertions, 9 deletions
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 9190aad..76b5033 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -144,6 +144,17 @@ struct GTY(()) ipa_agg_jump_function
typedef struct ipa_agg_jump_function *ipa_agg_jump_function_p;
+/* Info about pointer alignments. */
+struct GTY(()) ipa_alignment
+{
+ /* The data fields below are valid only if known is true. */
+ bool known;
+ /* See ptr_info_def and get_pointer_alignment_1 for description of these
+ two. */
+ unsigned align;
+ unsigned misalign;
+};
+
/* 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. */
@@ -153,6 +164,9 @@ struct GTY (()) ipa_jump_func
description. */
struct ipa_agg_jump_function agg;
+ /* Information about alignment of pointers. */
+ struct ipa_alignment alignment;
+
enum jump_func_type type;
/* Represents a value of a jump function. pass_through is used only in jump
function context. constant represents the actual constant in constant jump
@@ -402,10 +416,19 @@ struct GTY(()) ipa_agg_replacement_value
bool by_ref;
};
-typedef struct ipa_agg_replacement_value *ipa_agg_replacement_value_p;
+/* Structure holding information for the transformation phase of IPA-CP. */
+
+struct GTY(()) ipcp_transformation_summary
+{
+ /* Linked list of known aggregate values. */
+ ipa_agg_replacement_value *agg_values;
+ /* Alignment information for pointers. */
+ vec<ipa_alignment, va_gc> *alignments;
+};
void ipa_set_node_agg_value_chain (struct cgraph_node *node,
struct ipa_agg_replacement_value *aggvals);
+void ipcp_grow_transformations_if_necessary (void);
/* ipa_edge_args stores information related to a callsite and particularly its
arguments. It can be accessed by the IPA_EDGE_REF macro. */
@@ -451,8 +474,8 @@ ipa_get_ith_polymorhic_call_context (struct ipa_edge_args *args, int i)
/* Vector where the parameter infos are actually stored. */
extern vec<ipa_node_params> ipa_node_params_vector;
-/* Vector of known aggregate values in cloned nodes. */
-extern GTY(()) vec<ipa_agg_replacement_value_p, va_gc> *ipa_node_agg_replacements;
+/* Vector of IPA-CP transformation data for each clone. */
+extern GTY(()) vec<ipcp_transformation_summary, va_gc> *ipcp_transformations;
/* Vector where the parameter infos are actually stored. */
extern GTY(()) vec<ipa_edge_args, va_gc> *ipa_edge_args_vector;
@@ -510,14 +533,21 @@ ipa_edge_args_info_available_for_edge_p (struct cgraph_edge *edge)
return ((unsigned) edge->uid < vec_safe_length (ipa_edge_args_vector));
}
+static inline ipcp_transformation_summary *
+ipcp_get_transformation_summary (cgraph_node *node)
+{
+ if ((unsigned) node->uid >= vec_safe_length (ipcp_transformations))
+ return NULL;
+ return &(*ipcp_transformations)[node->uid];
+}
+
/* 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)
+ipa_get_agg_replacements_for_node (cgraph_node *node)
{
- if ((unsigned) node->uid >= vec_safe_length (ipa_node_agg_replacements))
- return NULL;
- return (*ipa_node_agg_replacements)[node->uid];
+ ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
+ return ts ? ts->agg_values : NULL;
}
/* Function formal parameters related computations. */
@@ -646,8 +676,8 @@ 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 ipcp_write_transformation_summaries (void);
+void ipcp_read_transformation_summaries (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,