diff options
author | Martin Jambor <mjambor@suse.cz> | 2013-09-12 17:20:05 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2013-09-12 17:20:05 +0200 |
commit | a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce (patch) | |
tree | f007460dfeaf58b393da5b3e56c4d0f470b53ff5 /gcc/ipa-prop.c | |
parent | 274ddab613ae4f3427eaf02859e5bbcceabbaadf (diff) | |
download | gcc-a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce.zip gcc-a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce.tar.gz gcc-a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce.tar.bz2 |
re PR ipa/58389 (g++ ICE in ipa_find_reference)
2013-09-12 Martin Jambor <mjambor@suse.cz>
PR ipa/58389
* ipa-prop.c (remove_described_reference): Give up if the edge in the
reference descriptor is NULL.
(ipa_edge_removal_hook): If owning a reference descriptor, set its
edge to NULL.
testsuite/
* g++.dg/pr58389.C: New test.
From-SVN: r202532
Diffstat (limited to 'gcc/ipa-prop.c')
-rw-r--r-- | gcc/ipa-prop.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index a0eea86..9054d90 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -2506,6 +2506,8 @@ remove_described_reference (symtab_node symbol, struct ipa_cst_ref_desc *rdesc) struct cgraph_edge *origin; origin = rdesc->cs; + if (!origin) + return false; to_del = ipa_find_reference ((symtab_node) origin->caller, symbol, origin->call_stmt, origin->lto_stmt_uid); if (!to_del) @@ -3019,7 +3021,14 @@ ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED) struct ipa_jump_func *jf; int i; FOR_EACH_VEC_ELT (*args->jump_functions, i, jf) - try_decrement_rdesc_refcount (jf); + { + struct ipa_cst_ref_desc *rdesc; + try_decrement_rdesc_refcount (jf); + if (jf->type == IPA_JF_CONST + && (rdesc = ipa_get_jf_constant_rdesc (jf)) + && rdesc->cs == cs) + rdesc->cs = NULL; + } } ipa_free_edge_args_substructures (IPA_EDGE_REF (cs)); |