Add a few missing checks that IPA_NODE_REF is not NULL (PR 92454)
authorMartin Jambor <jamborm@gcc.gnu.org>
Wed, 13 Nov 2019 14:12:58 +0000 (15:12 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Wed, 13 Nov 2019 14:12:58 +0000 (15:12 +0100)
2019-11-13  Jan Hubicka  <hubicka@ucw.cz>
    Martin Jambor  <mjambor@suse.cz>

PR ipa/92454
* ipa-cp.c (spread_undeadness): Check that IPA_NODE_REF exists.
(identify_dead_nodes): Likewise.

testsuite/
* g++.dg/ipa/pr92454.C: New test.

From-SVN: r278142

gcc/ChangeLog
gcc/ipa-cp.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr92454.C [new file with mode: 0644]

index 5375cd5f7faa677d609942d6b587aff981c8ac12..05046e6b1b14e42698300665150d66c6a77920e9 100644 (file)
@@ -1,3 +1,10 @@
+2019-11-13  Jan Hubicka  <hubicka@ucw.cz>
+           Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/92454
+       * ipa-cp.c (spread_undeadness): Check that IPA_NODE_REF exists.
+       (identify_dead_nodes): Likewise.
+
 2019-11-13  Martin Liska  <mliska@suse.cz>
 
        * ipa-icf.c (sem_function::equals_private): Do not overuse
index 54b9724998a6b15ff9028ab6719859538dd5053f..207d7c88bbdbda8070ccc881bed6ba64a1984c4f 100644 (file)
@@ -4979,7 +4979,7 @@ spread_undeadness (struct cgraph_node *node)
        callee = cs->callee->function_symbol (NULL);
        info = IPA_NODE_REF (callee);
 
-       if (info->node_dead)
+       if (info && info->node_dead)
          {
            info->node_dead = 0;
            spread_undeadness (callee);
@@ -5017,18 +5017,19 @@ identify_dead_nodes (struct cgraph_node *node)
   struct cgraph_node *v;
   for (v = node; v; v = ((struct ipa_dfs_info *) v->aux)->next_cycle)
     if (v->local
+       && IPA_NODE_REF (v)
        && !v->call_for_symbol_thunks_and_aliases
             (has_undead_caller_from_outside_scc_p, NULL, true))
       IPA_NODE_REF (v)->node_dead = 1;
 
   for (v = node; v; v = ((struct ipa_dfs_info *) v->aux)->next_cycle)
-    if (!IPA_NODE_REF (v)->node_dead)
+    if (IPA_NODE_REF (v) && !IPA_NODE_REF (v)->node_dead)
       spread_undeadness (v);
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
       for (v = node; v; v = ((struct ipa_dfs_info *) v->aux)->next_cycle)
-       if (IPA_NODE_REF (v)->node_dead)
+       if (IPA_NODE_REF (v) && IPA_NODE_REF (v)->node_dead)
          fprintf (dump_file, "  Marking node as dead: %s.\n", v->dump_name ());
     }
 }
index 1993960909fc7e0489a39290b126c525b92aac5a..23ad51b785c277e4abc2036eb795c5dabc0734a3 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-13  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/92454
+       * ipa-cp.c (spread_undeadness): Check that IPA_NODE_REF exists.
+       (identify_dead_nodes): Likewise.
+
 2019-11-13  Martin Liska  <mliska@suse.cz>
 
        * gcc.dg/ipa/ipa-icf-39.c: Update -fdbg-cnt to the new format.
diff --git a/gcc/testsuite/g++.dg/ipa/pr92454.C b/gcc/testsuite/g++.dg/ipa/pr92454.C
new file mode 100644 (file)
index 0000000..de67c66
--- /dev/null
@@ -0,0 +1,38 @@
+/* Originally PR ipa/91969, options adjusted for PR ipa/92454 */
+/* { dg-options "-O3 --param ipa-cp-eval-threshold=1" } */
+
+enum by
+{
+};
+class A
+{
+public:
+  class B
+  {
+  public:
+    virtual void m_fn2 (by) = 0;
+  };
+  virtual int m_fn1 ();
+  B *cf;
+};
+by a;
+class C : A, A::B
+{
+  void m_fn2 (by);
+};
+void C::m_fn2 (by) { cf->m_fn2 (a); }
+
+struct a
+{
+  virtual ~a ();
+};
+
+struct b
+{
+  virtual void d (...);
+};
+
+struct c : a, b
+{
+  void d (...) {}
+};