diff options
author | Martin Liska <mliska@suse.cz> | 2023-01-24 14:39:11 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2023-02-01 15:18:14 +0100 |
commit | 78589691ee158e689fa9bb7dec1165da475ea634 (patch) | |
tree | 8ed9bdcedc517346db1b2ad1a6efaf6262a02843 | |
parent | bf2cf6f3f1851054237ee7df99bdf60bf5a3e3ae (diff) | |
download | gcc-78589691ee158e689fa9bb7dec1165da475ea634.zip gcc-78589691ee158e689fa9bb7dec1165da475ea634.tar.gz gcc-78589691ee158e689fa9bb7dec1165da475ea634.tar.bz2 |
ipa: check if cache_token != NULL before hash_set::add call
We should not insert an empty value to the container.
PR ipa/108509
gcc/ChangeLog:
* cgraphunit.cc (walk_polymorphic_call_targets): Insert
ony non-null values.
* ipa.cc (walk_polymorphic_call_targets): Likewise.
gcc/testsuite/ChangeLog:
* g++.dg/ipa/pr108509.C: New test.
-rw-r--r-- | gcc/cgraphunit.cc | 2 | ||||
-rw-r--r-- | gcc/ipa.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/pr108509.C | 22 |
3 files changed, 24 insertions, 2 deletions
diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc index 832818d..a972900 100644 --- a/gcc/cgraphunit.cc +++ b/gcc/cgraphunit.cc @@ -1000,7 +1000,7 @@ walk_polymorphic_call_targets (hash_set<void *> *reachable_call_targets, = possible_polymorphic_call_targets (edge, &final, &cache_token); - if (!reachable_call_targets->add (cache_token)) + if (cache_token != NULL && !reachable_call_targets->add (cache_token)) { if (symtab->dump_file) dump_possible_polymorphic_call_targets @@ -182,7 +182,7 @@ walk_polymorphic_call_targets (hash_set<void *> *reachable_call_targets, = possible_polymorphic_call_targets (edge, &final, &cache_token); - if (!reachable_call_targets->add (cache_token)) + if (cache_token != NULL && !reachable_call_targets->add (cache_token)) { for (i = 0; i < targets.length (); i++) { diff --git a/gcc/testsuite/g++.dg/ipa/pr108509.C b/gcc/testsuite/g++.dg/ipa/pr108509.C new file mode 100644 index 0000000..2844189 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr108509.C @@ -0,0 +1,22 @@ +// PR ipa/108509 +// { dg-do compile } +// { dg-options "-O1 -fdevirtualize -fno-tree-fre" } + +struct B { + virtual void deref (); +}; + +struct RefPtr { + B *p; + + RefPtr () + { + p->deref (); + } +}; + +void +f () +{ + RefPtr b; +} |