Mercurial > hg > CbC > CbC_gcc
diff gcc/ipa-utils.c @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | a06113de4d67 |
children | 04ced10e8804 |
line wrap: on
line diff
--- a/gcc/ipa-utils.c Sun Feb 07 18:28:00 2010 +0900 +++ b/gcc/ipa-utils.c Fri Feb 12 23:39:51 2010 +0900 @@ -28,10 +28,10 @@ #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 @@ 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 @@ 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 @@ } - 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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; -} +}