diff options
author | Jan Hubicka <jh@suse.cz> | 2008-09-18 19:28:40 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2008-09-18 17:28:40 +0000 |
commit | e2c9111c0eac78bd9249d98ecdaebc9a4e327ffb (patch) | |
tree | ebbd388fee9c2b29fa34e1972bac913405e30d33 /gcc/ipa-utils.c | |
parent | 52d1bfd8cdae70a4c20b2e5647168a86895903ee (diff) | |
download | gcc-e2c9111c0eac78bd9249d98ecdaebc9a4e327ffb.zip gcc-e2c9111c0eac78bd9249d98ecdaebc9a4e327ffb.tar.gz gcc-e2c9111c0eac78bd9249d98ecdaebc9a4e327ffb.tar.bz2 |
re PR middle-end/37448 (cannot compile big function)
PR middle-end/37448
* ipa-reference.c (ipa_reference_local_vars_info_d,
ipa_reference_global_vars_info_d,
ipa_reference_local_vars_info_t, ipa_reference_global_vars_info_t,
ipa_reference_vars_info_t): Move here from ipa-reference.h
(node_duplication_hook_holder, node_removal_hook_holder): New.
(get_reference_vars_info_from_cgraph): Rename to ...
(get_reference_vars_info): ... this one, use cgraph uids.
(get_local_reference_vars_info, get_global_reference_vars_info):
Use cgraph instead of decl.
(ipa_reference_get_read_local, ipa_reference_get_written_local): Remove.
(ipa_reference_get_read_global, ipa_reference_get_not_read_global
ipa_reference_get_written_global, ipa_reference_get_not_written_global): Use
cgraph argument.
(check_call): Simplify avail check.
(scan_stmt_for_static_refs): Update.
(propagate_bits): Update.
(merge_callee_local_info): Remove.
(init_function_info): Use cgraph nodes.
(clean_function_local_data): Break out from ...
(clean_function): ... here.
(copy_local_bitmap, copy_global_bitmap): New functions.
(duplicate_node_data, remove_node_data): New functions.
(generate_summary): Register hooks; use visibility instead of
master clones.
(propafate): Use cgraph nodes; copy bitmap to each node in cycle.
* ipa-reference.h (ipa_reference_local_vars_info_d,
ipa_reference_global_vars_info_d,
ipa_reference_local_vars_info_t, ipa_reference_global_vars_info_t,
ipa_reference_vars_info_t): Move to ipa-reference.c
(ipa_reference_get_read_local, ipa_reference_get_written_local):
Remove.
(ipa_reference_get_read_global, ipa_reference_get_written_global,
ipa_reference_get_not_read_global, ipa_reference_get_not_written_global):
Update prototype.
* ipa-pure-const.c (funct_state_vec): Turn into VECtor.
(init_state): Remove.
(node_duplication_hook_holder, node_removal_hook_holder): New.
(get_function_state, set_function_state): Use VECtor.
(analyze_function): Check body availability.
(add_new_function): Likewise.
(duplicate_node_data, remove_node_data): New.
(generate_summary): Register hooks; do not care about clones.
(propafate): Do not care about clones; recursive functions are not looping.
* ipa-utils.c (searchc, ipa_utils_reduced_inorder): Do not skip clones.
* ipa-prop.c (edge_removal_hook_holder, node_removal_hook_holder,
* edge_duplication_hook_holder, node_duplication_hook_holder): Make
static.
* tree-flow.h (function_ann_d): Remove reference_vars_info.
* tree-ssa-opreands.c (add_call_clobber_ops, add_call_read_ops): Update call of
ipa-reference accesors.
From-SVN: r140463
Diffstat (limited to 'gcc/ipa-utils.c')
-rw-r--r-- | gcc/ipa-utils.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c index 729a84d..95e1856 100644 --- a/gcc/ipa-utils.c +++ b/gcc/ipa-utils.c @@ -100,10 +100,8 @@ searchc (struct searchc_env* env, struct cgraph_node *v) { struct ipa_dfs_info * w_info; struct cgraph_node *w = edge->callee; - /* Bypass the clones and only look at the master node. Skip - external and other bogus nodes. */ - w = cgraph_master_clone (w); - if (w && w->aux) + + if (w->aux && cgraph_function_body_availability (edge->callee) > AVAIL_OVERWRITABLE) { w_info = (struct ipa_dfs_info *) w->aux; if (w_info->new_node) @@ -168,27 +166,29 @@ ipa_utils_reduced_inorder (struct cgraph_node **order, env.reduce = reduce; for (node = cgraph_nodes; node; node = node->next) - if ((node->analyzed) - && (cgraph_is_master_clone (node) - || (allow_overwritable - && (cgraph_function_body_availability (node) == - AVAIL_OVERWRITABLE)))) - { - /* Reuse the info if it is already there. */ - struct ipa_dfs_info *info = (struct ipa_dfs_info *) node->aux; - if (!info) - info = XCNEW (struct ipa_dfs_info); - info->new_node = true; - 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_value)node); - } - else - node->aux = NULL; + { + enum availability avail = cgraph_function_body_availability (node); + + if (avail > AVAIL_OVERWRITABLE + || (allow_overwritable + && (avail == AVAIL_OVERWRITABLE))) + { + /* Reuse the info if it is already there. */ + struct ipa_dfs_info *info = (struct ipa_dfs_info *) node->aux; + if (!info) + info = XCNEW (struct ipa_dfs_info); + info->new_node = true; + 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_value)node); + } + else + node->aux = NULL; + } result = splay_tree_min (env.nodes_marked_new); while (result) { |