ipa: check if cache_token != NULL before hash_set::add call
authorMartin Liska <mliska@suse.cz>
Tue, 24 Jan 2023 13:39:11 +0000 (14:39 +0100)
committerMartin Liska <mliska@suse.cz>
Wed, 1 Feb 2023 14:18:14 +0000 (15:18 +0100)
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.

gcc/cgraphunit.cc
gcc/ipa.cc
gcc/testsuite/g++.dg/ipa/pr108509.C [new file with mode: 0644]

index 832818d..a972900 100644 (file)
@@ -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 
index 4de6050..5c15b60 100644 (file)
@@ -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 (file)
index 0000000..2844189
--- /dev/null
@@ -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;
+}