aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-prop.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2013-09-12 17:20:05 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2013-09-12 17:20:05 +0200
commita854f8566acaabcc7f1c5c6aa69c9c29b11c67ce (patch)
treef007460dfeaf58b393da5b3e56c4d0f470b53ff5 /gcc/ipa-prop.c
parent274ddab613ae4f3427eaf02859e5bbcceabbaadf (diff)
downloadgcc-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.c11
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));