Hi
the ICE with -fno-ipa-modref is caused by fact that execute method has
early exit for non-existent summary that forgets to free ipa-prop edge
summaries.  I moved the freeing code to free-fnsummary pass that is more
robust way of handling this.

Bootstrapped/regtested x86_64-linux, comitted.

gcc/ChangeLog:

2020-10-01  Jan Hubicka  <hubi...@ucw.cz>

        PR ipa/97244
        * ipa-fnsummary.c (pass_free_fnsummary::execute): Free
        also indirect inlining datastructure.
        * ipa-modref.c (pass_ipa_modref::execute): Do not free them here.
        * ipa-prop.c (ipa_free_all_node_params): Do not crash when info does
        not exist.
        (ipa_unregister_cgraph_hooks): Likewise.

gcc/testsuite/ChangeLog:

2020-10-01  Jan Hubicka  <hubi...@ucw.cz>

        PR ipa/97244
        * gcc.dg/ipa/remref-2a.c: Add -fno-ipa-modref

diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c
index 4c1c1f91482..8285cc00d33 100644
--- a/gcc/ipa-fnsummary.c
+++ b/gcc/ipa-fnsummary.c
@@ -4680,6 +4680,8 @@ public:
   virtual unsigned int execute (function *)
     {
       ipa_free_fn_summary ();
+      /* Free ipa-prop structures if they are no longer needed.  */
+      ipa_free_all_structures_after_iinln ();
       if (!flag_wpa)
        ipa_free_size_summary ();
       return 0;
diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index 6225552e41a..2f4da8f2a14 100644
--- a/gcc/ipa-modref.c
+++ b/gcc/ipa-modref.c
@@ -1681,8 +1681,6 @@ pass_ipa_modref::execute (function *)
     }
   ((modref_summaries *)summaries)->ipa = false;
   ipa_free_postorder_info ();
-  /* Free ipa-prop structures if they are no longer needed.  */
-  ipa_free_all_structures_after_iinln ();
   return 0;
 }
 
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index b28c78eeab4..ea88fd3fd95 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -4124,7 +4124,8 @@ ipa_free_all_edge_args (void)
 void
 ipa_free_all_node_params (void)
 {
-  ggc_delete (ipa_node_params_sum);
+  if (ipa_node_params_sum)
+    ggc_delete (ipa_node_params_sum);
   ipa_node_params_sum = NULL;
 }
 
@@ -4368,7 +4369,8 @@ ipa_register_cgraph_hooks (void)
 static void
 ipa_unregister_cgraph_hooks (void)
 {
-  symtab->remove_cgraph_insertion_hook (function_insertion_hook_holder);
+  if (function_insertion_hook_holder)
+    symtab->remove_cgraph_insertion_hook (function_insertion_hook_holder);
   function_insertion_hook_holder = NULL;
 }
 
diff --git a/gcc/testsuite/gcc.dg/ipa/remref-2a.c 
b/gcc/testsuite/gcc.dg/ipa/remref-2a.c
index 34a6188249f..c2f3eac98a9 100644
--- a/gcc/testsuite/gcc.dg/ipa/remref-2a.c
+++ b/gcc/testsuite/gcc.dg/ipa/remref-2a.c
@@ -1,7 +1,7 @@
 /* Verify that indirect inlining can also remove references of the functions it
    discovers calls for.  */
 /* { dg-do compile } */
-/* { dg-options "-O3 -fno-early-inlining -fno-ipa-cp -fdump-ipa-inline 
-fdump-tree-optimized -fno-ipa-icf"  } */
+/* { dg-options "-O3 -fno-early-inlining -fno-ipa-cp -fdump-ipa-inline 
-fdump-tree-optimized -fno-ipa-icf -fno-ipa-modref"  } */
 
 int global;
 

Reply via email to