Author: Martin Jambor Date: To: GCC Patches CC: Jan Hubicka, Kenneth Zadeck, Razya Ladelsky Subject: [middle-end, patch 3/9] Make ipa-cp analyze only required nodes
This patch makes ipa-cp to only look at nodes that comply with the
predicate:
((NODE)->analyzed && ((NODE)->needed || (NODE)->reachable))
Looking at others should not be necessary. This way ipa-cp also
examines the same nodes ipa-inline does. Similar conditions are
widely used across ipa passes and possibly should be unified and moved
elsewhere else (as I have pointed out in an email about a month) but
so far I duplicate it here.
This patch also makes debug dumping functions check that infos are
allocated for the node and/or edges they examine.
2008-07-03 Martin Jambor <mjambor@???>
* ipa-cp.c (ipcp_driver): Calling check-and-allocate functions rather
than direct allocation function.
(ipcp_init_stage): Check that nodes are relevant.
(ipcp_insert_stage): Check that the node is relevant. Check there is
an info for every node and edge.
(ipcp_update_callgraph): Check that the node is relevant.
(ipcp_propagate_stage): Check on the side arrays are properly
allocated.
(ipcp_print_all_jump_functions): Make sure not to touch anything
outside of the on-the-side arrays.
(ipcp_function_scale_print): Make sure not to touch anything outside
of the on-the-side arrays.
(ipcp_print_all_lattices): Make sure not to touch anything outside
of the on-the-side arrays.
* ipa-prop.c: (ipa_init_func_list): Check the functions are relevant.
* ipa-prop.h (ipa_node_params_info_available_for_node_p): New function.
(ipa_edge_args_info_available_for_edge_p): New function.
(IPA_NODE_RELEVANT_P): New macro.
return wl;
}
@@ -557,7 +558,11 @@ ipa_print_all_tree_maps (FILE * f)
fprintf (f, "\nPARAM TREE MAP PRINT\n");
for (node = cgraph_nodes; node; node = node->next)
{
- struct ipa_node_params *info = IPA_NODE_REF (node);
+ struct ipa_node_params *info;
+
+ if (!ipa_node_params_info_available_for_node_p (node))
+ continue;
+ info = IPA_NODE_REF (node);
fprintf (f, "function %s Trees :: \n", cgraph_node_name (node));
count = ipa_get_param_count (info);
for (i = 0; i < count; i++)
@@ -583,7 +588,11 @@ ipa_print_all_params_modified (FILE * f)
fprintf (f, "\nMODIFY PRINT\n");
for (node = cgraph_nodes; node; node = node->next)
{
- struct ipa_node_params *info = IPA_NODE_REF (node);
+ struct ipa_node_params *info;
+
+ if (!ipa_node_params_info_available_for_node_p (node))
+ continue;
+ info = IPA_NODE_REF (node);
fprintf (f, "function %s :: \n", cgraph_node_name (node));
count = ipa_get_param_count (info);
for (i = 0; i < count; i++)
Index: iinln/gcc/ipa-prop.h
===================================================================
--- iinln.orig/gcc/ipa-prop.h
+++ iinln/gcc/ipa-prop.h
@@ -237,6 +237,9 @@ extern struct ipa_edge_args *ipa_edge_ar
/* This macro checks validity of index returned by
ipa_get_param_decl_index function. */
#define IS_VALID_JUMP_FUNC_INDEX(I) ((I) != -1)
+/* Should various ipa passes even look at the function given by NODE? */
+#define IPA_NODE_RELEVANT_P(NODE) \
+ ((NODE)->analyzed && ((NODE)->needed || (NODE)->reachable))
/* Creating and freeing ipa_node_params and ipa_edge_args. */
void ipa_create_all_node_params (void);
@@ -266,6 +269,24 @@ ipa_check_create_edge_args (void)
ipa_create_all_edge_args ();
}
+/* Returns true if the array of node infos is large enough to accomodate an
+ info for NODE. The main purpose of this function is that debug dumping
+ function can check info availability without causing reallocations. */
+static inline bool
+ipa_node_params_info_available_for_node_p (struct cgraph_node *node)
+{
+ return (node->uid < ipa_node_params_array_size);
+}
+
+/* Returns true if the array of edge infos is large enough to accomodate an
+ info for EDGE. The main purpose of this function is that debug dumping
+ function can check info availability without causing reallocations. */
+static inline bool
+ipa_edge_args_info_available_for_edge_p (struct cgraph_edge *edge)
+{
+ return (edge->uid < ipa_edge_args_array_size);
+}
+
/* A function list element. It is used to create a temporary worklist used in
the propagation stage of IPCP. (can be used for more IPA optimizations) */
struct ipa_func_list