| Index: gcc/gcc/ipa-utils.c
|
| diff --git a/gcc/gcc/ipa-utils.c b/gcc/gcc/ipa-utils.c
|
| index 3b5d128f60d64ab010becbdee6614fa9294c77bb..4b88f599d53d97ca0a65f6e539c3aac0d465989e 100644
|
| --- a/gcc/gcc/ipa-utils.c
|
| +++ b/gcc/gcc/ipa-utils.c
|
| @@ -28,10 +28,10 @@ along with GCC; see the file COPYING3. If not see
|
| #include "tree-pass.h"
|
| #include "langhooks.h"
|
| #include "pointer-set.h"
|
| +#include "splay-tree.h"
|
| #include "ggc.h"
|
| #include "ipa-utils.h"
|
| #include "ipa-reference.h"
|
| -#include "c-common.h"
|
| #include "gimple.h"
|
| #include "cgraph.h"
|
| #include "output.h"
|
| @@ -44,15 +44,15 @@ along with GCC; see the file COPYING3. If not see
|
| that is printed before the nodes are printed. ORDER is an array of
|
| cgraph_nodes that has COUNT useful nodes in it. */
|
|
|
| -void
|
| -ipa_utils_print_order (FILE* out,
|
| - const char * note,
|
| - struct cgraph_node** order,
|
| - int count)
|
| +void
|
| +ipa_utils_print_order (FILE* out,
|
| + const char * note,
|
| + struct cgraph_node** order,
|
| + int count)
|
| {
|
| int i;
|
| fprintf (out, "\n\n ordered call graph: %s\n", note);
|
| -
|
| +
|
| for (i = count - 1; i >= 0; i--)
|
| dump_cgraph_node(dump_file, order[i]);
|
| fprintf (out, "\n");
|
| @@ -81,39 +81,43 @@ struct searchc_env {
|
| searching from. */
|
|
|
| static void
|
| -searchc (struct searchc_env* env, struct cgraph_node *v)
|
| +searchc (struct searchc_env* env, struct cgraph_node *v,
|
| + bool (*ignore_edge) (struct cgraph_edge *))
|
| {
|
| struct cgraph_edge *edge;
|
| struct ipa_dfs_info *v_info = (struct ipa_dfs_info *) v->aux;
|
| -
|
| +
|
| /* mark node as old */
|
| v_info->new_node = false;
|
| splay_tree_remove (env->nodes_marked_new, v->uid);
|
| -
|
| +
|
| v_info->dfn_number = env->count;
|
| v_info->low_link = env->count;
|
| env->count++;
|
| env->stack[(env->stack_size)++] = v;
|
| v_info->on_stack = true;
|
| -
|
| +
|
| for (edge = v->callees; edge; edge = edge->next_callee)
|
| {
|
| struct ipa_dfs_info * w_info;
|
| struct cgraph_node *w = edge->callee;
|
|
|
| + if (ignore_edge && ignore_edge (edge))
|
| + continue;
|
| +
|
| if (w->aux && cgraph_function_body_availability (edge->callee) > AVAIL_OVERWRITABLE)
|
| {
|
| w_info = (struct ipa_dfs_info *) w->aux;
|
| - if (w_info->new_node)
|
| + if (w_info->new_node)
|
| {
|
| - searchc (env, w);
|
| + searchc (env, w, ignore_edge);
|
| v_info->low_link =
|
| (v_info->low_link < w_info->low_link) ?
|
| v_info->low_link : w_info->low_link;
|
| - }
|
| - else
|
| - if ((w_info->dfn_number < v_info->dfn_number)
|
| - && (w_info->on_stack))
|
| + }
|
| + else
|
| + if ((w_info->dfn_number < v_info->dfn_number)
|
| + && (w_info->on_stack))
|
| v_info->low_link =
|
| (w_info->dfn_number < v_info->low_link) ?
|
| w_info->dfn_number : v_info->low_link;
|
| @@ -121,7 +125,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v)
|
| }
|
|
|
|
|
| - if (v_info->low_link == v_info->dfn_number)
|
| + if (v_info->low_link == v_info->dfn_number)
|
| {
|
| struct cgraph_node *last = NULL;
|
| struct cgraph_node *x;
|
| @@ -130,17 +134,17 @@ searchc (struct searchc_env* env, struct cgraph_node *v)
|
| x = env->stack[--(env->stack_size)];
|
| x_info = (struct ipa_dfs_info *) x->aux;
|
| x_info->on_stack = false;
|
| -
|
| - if (env->reduce)
|
| +
|
| + if (env->reduce)
|
| {
|
| x_info->next_cycle = last;
|
| last = x;
|
| - }
|
| - else
|
| + }
|
| + else
|
| env->result[env->order_pos++] = x;
|
| - }
|
| + }
|
| while (v != x);
|
| - if (env->reduce)
|
| + if (env->reduce)
|
| env->result[env->order_pos++] = v;
|
| }
|
| }
|
| @@ -151,8 +155,9 @@ searchc (struct searchc_env* env, struct cgraph_node *v)
|
| nodes. Only consider nodes that have the output bit set. */
|
|
|
| int
|
| -ipa_utils_reduced_inorder (struct cgraph_node **order,
|
| - bool reduce, bool allow_overwritable)
|
| +ipa_utils_reduced_inorder (struct cgraph_node **order,
|
| + bool reduce, bool allow_overwritable,
|
| + bool (*ignore_edge) (struct cgraph_edge *))
|
| {
|
| struct cgraph_node *node;
|
| struct searchc_env env;
|
| @@ -164,13 +169,13 @@ ipa_utils_reduced_inorder (struct cgraph_node **order,
|
| env.nodes_marked_new = splay_tree_new (splay_tree_compare_ints, 0, 0);
|
| env.count = 1;
|
| env.reduce = reduce;
|
| -
|
| - for (node = cgraph_nodes; node; node = node->next)
|
| +
|
| + for (node = cgraph_nodes; node; node = node->next)
|
| {
|
| enum availability avail = cgraph_function_body_availability (node);
|
|
|
| if (avail > AVAIL_OVERWRITABLE
|
| - || (allow_overwritable
|
| + || (allow_overwritable
|
| && (avail == AVAIL_OVERWRITABLE)))
|
| {
|
| /* Reuse the info if it is already there. */
|
| @@ -181,19 +186,19 @@ ipa_utils_reduced_inorder (struct cgraph_node **order,
|
| info->on_stack = false;
|
| info->next_cycle = NULL;
|
| node->aux = info;
|
| -
|
| +
|
| splay_tree_insert (env.nodes_marked_new,
|
| - (splay_tree_key)node->uid,
|
| + (splay_tree_key)node->uid,
|
| (splay_tree_value)node);
|
| - }
|
| - else
|
| + }
|
| + else
|
| node->aux = NULL;
|
| }
|
| result = splay_tree_min (env.nodes_marked_new);
|
| while (result)
|
| {
|
| node = (struct cgraph_node *)result->value;
|
| - searchc (&env, node);
|
| + searchc (&env, node, ignore_edge);
|
| result = splay_tree_min (env.nodes_marked_new);
|
| }
|
| splay_tree_delete (env.nodes_marked_new);
|
| @@ -210,17 +215,15 @@ ipa_utils_reduced_inorder (struct cgraph_node **order,
|
| tree
|
| get_base_var (tree t)
|
| {
|
| - if ((TREE_CODE (t) == EXC_PTR_EXPR) || (TREE_CODE (t) == FILTER_EXPR))
|
| - return t;
|
| -
|
| - while (!SSA_VAR_P (t)
|
| + while (!SSA_VAR_P (t)
|
| && (!CONSTANT_CLASS_P (t))
|
| && TREE_CODE (t) != LABEL_DECL
|
| && TREE_CODE (t) != FUNCTION_DECL
|
| - && TREE_CODE (t) != CONST_DECL)
|
| + && TREE_CODE (t) != CONST_DECL
|
| + && TREE_CODE (t) != CONSTRUCTOR)
|
| {
|
| t = TREE_OPERAND (t, 0);
|
| }
|
| return t;
|
| -}
|
| +}
|
|
|
|
|