diff options
author | jamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-05-13 10:16:09 +0000 |
---|---|---|
committer | jamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-05-13 10:16:09 +0000 |
commit | 096295f6c740cd12cd5257029ae9c08b7bdd22ac (patch) | |
tree | eb36587215072023d7faafc93b4cb03eb6f629f3 /gcc/ipa-ref.c | |
parent | 3a4070617292f52b9ca14427d834abd998ced5f1 (diff) | |
download | gcc-096295f6c740cd12cd5257029ae9c08b7bdd22ac.tar.gz |
2013-05-13 Martin Jambor <mjambor@suse.cz>
PR middle-end/42371
* ipa-prop.h (IPA_UNDESCRIBED_USE): New macro.
(ipa_constant_data): New type.
(ipa_jump_func): Use ipa_constant_data to hold information about
constant jump functions.
(ipa_get_jf_constant): Adjust to jump function type changes.
(ipa_get_jf_constant_rdesc): New function.
(ipa_param_descriptor): New field controlled_uses.
(ipa_get_controlled_uses): New function.
(ipa_set_controlled_uses): Likewise.
* ipa-ref.h (ipa_find_reference): Declare.
* ipa-prop.c (ipa_cst_ref_desc): New type.
(ipa_print_node_jump_functions_for_edge): Adjust for jump function type
changes.
(ipa_set_jf_constant): Likewise. Also create reference descriptions.
New parameter cs. Adjust all callers.
(ipa_analyze_params_uses): Detect uncontrolled and controlled uses.
(remove_described_reference): New function.
(jfunc_rdesc_usable): Likewise.
(try_make_edge_direct_simple_call): Decrement controlled use count,
attempt to remove reference if it hits zero.
(combine_controlled_uses_counters): New function.
(propagate_controlled_uses): Likewise.
(ipa_propagate_indirect_call_infos): Call propagate_controlled_uses.
(ipa_edge_duplication_hook): Duplicate reference descriptions.
(ipa_print_node_params): Print described use counter.
(ipa_write_jump_function): Adjust to jump function type changes.
(ipa_read_jump_function): New parameter CS, pass it to
ipa_set_jf_constant. Adjust caller.
(ipa_write_node_info): Stream controlled use count
(ipa_read_node_info): Likewise.
* cgraph.c (cgraph_mark_address_taken_node): Bail out instead of
asserting.
* ipa-cp.c (ipcp_discover_new_direct_edges): Decrement controlled use
count. Remove cloning-added reference if it reaches zero.
* ipa-ref.c (ipa_find_reference): New function.
testsuite/
* gcc.dg/ipa/remref-0.c: New test.
* gcc.dg/ipa/remref-1a.c: Likewise.
* gcc.dg/ipa/remref-1b.c: Likewise.
* gcc.dg/ipa/remref-2a.c: Likewise.
* gcc.dg/ipa/remref-2b.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198821 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-ref.c')
-rw-r--r-- | gcc/ipa-ref.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/ipa-ref.c b/gcc/ipa-ref.c index 044e2372788..d6ac25ffccd 100644 --- a/gcc/ipa-ref.c +++ b/gcc/ipa-ref.c @@ -198,3 +198,20 @@ ipa_ref_has_aliases_p (struct ipa_ref_list *ref_list) return true; return false; } + +/* Find the structure describing a reference in REFERRING_NODE to REFERRED_NODE + and associated with statement STMT. */ + +struct ipa_ref * +ipa_find_reference (symtab_node referring_node, symtab_node referred_node, + gimple stmt) +{ + struct ipa_ref *r = NULL; + int i; + + FOR_EACH_VEC_SAFE_ELT (referring_node->symbol.ref_list.references, i, r) + if (r->referred == referred_node + && (in_lto_p || r->stmt == stmt)) + return r; + return NULL; +} |